blob: 9521c3dee0a0cca75fc5ce16df66e448aab391ef [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
Zachary Turnerd133f6a2016-03-28 22:53:41 +000066#include "Plugins/ExpressionParser/Clang/ClangFunctionCaller.h"
67#include "Plugins/ExpressionParser/Clang/ClangUserExpression.h"
68#include "Plugins/ExpressionParser/Clang/ClangUtilityFunction.h"
Greg Clayton514487e2011-02-15 21:59:32 +000069#include "lldb/Core/ArchSpec.h"
Greg Clayton73b472d2010-10-27 03:32:59 +000070#include "lldb/Core/Flags.h"
Sean Callananfb8b7092010-10-28 18:19:36 +000071#include "lldb/Core/Log.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000072#include "lldb/Core/Module.h"
73#include "lldb/Core/PluginManager.h"
Greg Claytonf0705c82011-10-22 03:33:13 +000074#include "lldb/Core/RegularExpression.h"
Ulrich Weigand9521ad22016-04-15 09:55:52 +000075#include "lldb/Core/Scalar.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000076#include "lldb/Core/StreamFile.h"
Enrico Granata2267ad42014-09-16 17:28:40 +000077#include "lldb/Core/ThreadSafeDenseMap.h"
Greg Clayton57ee3062013-07-11 22:46:58 +000078#include "lldb/Core/UniqueCStringMap.h"
Greg Claytond8d4a572015-08-11 21:38:15 +000079#include "lldb/Symbol/ClangASTContext.h"
Zachary Turnerd133f6a2016-03-28 22:53:41 +000080#include "lldb/Symbol/ClangASTImporter.h"
Greg Clayton6dc8d582015-08-18 22:32:36 +000081#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000082#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Zachary Turnerd133f6a2016-03-28 22:53:41 +000083#include "lldb/Symbol/ClangUtil.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000084#include "lldb/Symbol/ObjectFile.h"
Greg Clayton261ac3f2015-08-28 01:01:03 +000085#include "lldb/Symbol/SymbolFile.h"
Sean Callanan5e9e1992011-10-26 01:06:27 +000086#include "lldb/Symbol/VerifyDecl.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000087#include "lldb/Target/ExecutionContext.h"
Greg Clayton56939cb2015-09-17 22:23:34 +000088#include "lldb/Target/Language.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000089#include "lldb/Target/ObjCLanguageRuntime.h"
Jim Ingham151c0322015-09-15 21:13:50 +000090#include "lldb/Target/Process.h"
91#include "lldb/Target/Target.h"
Sean Callananc530ba92016-05-02 21:15:31 +000092#include "lldb/Utility/LLDBAssert.h"
Jim Inghamd555bac2011-06-24 22:03:24 +000093
Greg Clayton261ac3f2015-08-28 01:01:03 +000094#include "Plugins/SymbolFile/DWARF/DWARFASTParserClang.h"
Zachary Turner42dff792016-04-15 00:21:26 +000095#include "Plugins/SymbolFile/PDB/PDBASTParser.h"
Greg Clayton261ac3f2015-08-28 01:01:03 +000096
Eli Friedman932197d2010-06-13 19:06:42 +000097#include <stdio.h>
98
Greg Clayton1341baf2013-07-11 23:36:31 +000099#include <mutex>
100
Greg Claytonc86103d2010-08-05 01:57:25 +0000101using namespace lldb;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000102using namespace lldb_private;
103using namespace llvm;
104using namespace clang;
105
Greg Clayton56939cb2015-09-17 22:23:34 +0000106namespace
107{
108 static inline bool ClangASTContextSupportsLanguage (lldb::LanguageType language)
109 {
110 return language == eLanguageTypeUnknown || // Clang is the default type system
Greg Clayton1ae68cd2016-08-10 22:55:26 +0000111 Language::LanguageIsC(language) ||
112 Language::LanguageIsCPlusPlus(language) ||
113 Language::LanguageIsObjC(language) ||
114 Language::LanguageIsPascal(language) ||
Jason Molendad8f24a92016-04-27 04:50:51 +0000115 // Use Clang for Rust until there is a proper language plugin for it
116 language == eLanguageTypeRust ||
Ewan Crawford75f0ff52016-02-03 09:17:03 +0000117 language == eLanguageTypeExtRenderScript;
Greg Clayton56939cb2015-09-17 22:23:34 +0000118 }
119}
120
Enrico Granata2267ad42014-09-16 17:28:40 +0000121typedef lldb_private::ThreadSafeDenseMap<clang::ASTContext *, ClangASTContext*> ClangASTMap;
Enrico Granata5d84a692014-08-19 21:46:37 +0000122
123static ClangASTMap &
124GetASTMap()
125{
Enrico Granata2267ad42014-09-16 17:28:40 +0000126 static ClangASTMap *g_map_ptr = nullptr;
127 static std::once_flag g_once_flag;
128 std::call_once(g_once_flag, []() {
129 g_map_ptr = new ClangASTMap(); // leaked on purpose to avoid spins
130 });
131 return *g_map_ptr;
Enrico Granata5d84a692014-08-19 21:46:37 +0000132}
133
Pavel Labath1ac2b202016-08-15 14:32:32 +0000134static bool
135IsOperator(const char *name, clang::OverloadedOperatorKind &op_kind)
136{
137 if (name == nullptr || name[0] == '\0')
138 return false;
139
140#define OPERATOR_PREFIX "operator"
141#define OPERATOR_PREFIX_LENGTH (sizeof(OPERATOR_PREFIX) - 1)
142
143 const char *post_op_name = nullptr;
144
145 bool no_space = true;
146
147 if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
148 return false;
149
150 post_op_name = name + OPERATOR_PREFIX_LENGTH;
151
152 if (post_op_name[0] == ' ')
153 {
154 post_op_name++;
155 no_space = false;
156 }
157
158#undef OPERATOR_PREFIX
159#undef OPERATOR_PREFIX_LENGTH
160
161 // This is an operator, set the overloaded operator kind to invalid
162 // in case this is a conversion operator...
163 op_kind = clang::NUM_OVERLOADED_OPERATORS;
164
165 switch (post_op_name[0])
166 {
167 default:
168 if (no_space)
169 return false;
170 break;
171 case 'n':
172 if (no_space)
173 return false;
174 if (strcmp(post_op_name, "new") == 0)
175 op_kind = clang::OO_New;
176 else if (strcmp(post_op_name, "new[]") == 0)
177 op_kind = clang::OO_Array_New;
178 break;
179
180 case 'd':
181 if (no_space)
182 return false;
183 if (strcmp(post_op_name, "delete") == 0)
184 op_kind = clang::OO_Delete;
185 else if (strcmp(post_op_name, "delete[]") == 0)
186 op_kind = clang::OO_Array_Delete;
187 break;
188
189 case '+':
190 if (post_op_name[1] == '\0')
191 op_kind = clang::OO_Plus;
192 else if (post_op_name[2] == '\0')
193 {
194 if (post_op_name[1] == '=')
195 op_kind = clang::OO_PlusEqual;
196 else if (post_op_name[1] == '+')
197 op_kind = clang::OO_PlusPlus;
198 }
199 break;
200
201 case '-':
202 if (post_op_name[1] == '\0')
203 op_kind = clang::OO_Minus;
204 else if (post_op_name[2] == '\0')
205 {
206 switch (post_op_name[1])
207 {
208 case '=':
209 op_kind = clang::OO_MinusEqual;
210 break;
211 case '-':
212 op_kind = clang::OO_MinusMinus;
213 break;
214 case '>':
215 op_kind = clang::OO_Arrow;
216 break;
217 }
218 }
219 else if (post_op_name[3] == '\0')
220 {
221 if (post_op_name[2] == '*')
222 op_kind = clang::OO_ArrowStar;
223 break;
224 }
225 break;
226
227 case '*':
228 if (post_op_name[1] == '\0')
229 op_kind = clang::OO_Star;
230 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
231 op_kind = clang::OO_StarEqual;
232 break;
233
234 case '/':
235 if (post_op_name[1] == '\0')
236 op_kind = clang::OO_Slash;
237 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
238 op_kind = clang::OO_SlashEqual;
239 break;
240
241 case '%':
242 if (post_op_name[1] == '\0')
243 op_kind = clang::OO_Percent;
244 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
245 op_kind = clang::OO_PercentEqual;
246 break;
247
248 case '^':
249 if (post_op_name[1] == '\0')
250 op_kind = clang::OO_Caret;
251 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
252 op_kind = clang::OO_CaretEqual;
253 break;
254
255 case '&':
256 if (post_op_name[1] == '\0')
257 op_kind = clang::OO_Amp;
258 else if (post_op_name[2] == '\0')
259 {
260 switch (post_op_name[1])
261 {
262 case '=':
263 op_kind = clang::OO_AmpEqual;
264 break;
265 case '&':
266 op_kind = clang::OO_AmpAmp;
267 break;
268 }
269 }
270 break;
271
272 case '|':
273 if (post_op_name[1] == '\0')
274 op_kind = clang::OO_Pipe;
275 else if (post_op_name[2] == '\0')
276 {
277 switch (post_op_name[1])
278 {
279 case '=':
280 op_kind = clang::OO_PipeEqual;
281 break;
282 case '|':
283 op_kind = clang::OO_PipePipe;
284 break;
285 }
286 }
287 break;
288
289 case '~':
290 if (post_op_name[1] == '\0')
291 op_kind = clang::OO_Tilde;
292 break;
293
294 case '!':
295 if (post_op_name[1] == '\0')
296 op_kind = clang::OO_Exclaim;
297 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
298 op_kind = clang::OO_ExclaimEqual;
299 break;
300
301 case '=':
302 if (post_op_name[1] == '\0')
303 op_kind = clang::OO_Equal;
304 else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
305 op_kind = clang::OO_EqualEqual;
306 break;
307
308 case '<':
309 if (post_op_name[1] == '\0')
310 op_kind = clang::OO_Less;
311 else if (post_op_name[2] == '\0')
312 {
313 switch (post_op_name[1])
314 {
315 case '<':
316 op_kind = clang::OO_LessLess;
317 break;
318 case '=':
319 op_kind = clang::OO_LessEqual;
320 break;
321 }
322 }
323 else if (post_op_name[3] == '\0')
324 {
325 if (post_op_name[2] == '=')
326 op_kind = clang::OO_LessLessEqual;
327 }
328 break;
329
330 case '>':
331 if (post_op_name[1] == '\0')
332 op_kind = clang::OO_Greater;
333 else if (post_op_name[2] == '\0')
334 {
335 switch (post_op_name[1])
336 {
337 case '>':
338 op_kind = clang::OO_GreaterGreater;
339 break;
340 case '=':
341 op_kind = clang::OO_GreaterEqual;
342 break;
343 }
344 }
345 else if (post_op_name[1] == '>' && post_op_name[2] == '=' && post_op_name[3] == '\0')
346 {
347 op_kind = clang::OO_GreaterGreaterEqual;
348 }
349 break;
350
351 case ',':
352 if (post_op_name[1] == '\0')
353 op_kind = clang::OO_Comma;
354 break;
355
356 case '(':
357 if (post_op_name[1] == ')' && post_op_name[2] == '\0')
358 op_kind = clang::OO_Call;
359 break;
360
361 case '[':
362 if (post_op_name[1] == ']' && post_op_name[2] == '\0')
363 op_kind = clang::OO_Subscript;
364 break;
365 }
366
367 return true;
368}
Enrico Granata5d84a692014-08-19 21:46:37 +0000369
Greg Clayton57ee3062013-07-11 22:46:58 +0000370clang::AccessSpecifier
371ClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
Greg Clayton8cf05932010-07-22 18:30:50 +0000372{
373 switch (access)
374 {
Greg Claytonc86103d2010-08-05 01:57:25 +0000375 default: break;
376 case eAccessNone: return AS_none;
377 case eAccessPublic: return AS_public;
378 case eAccessPrivate: return AS_private;
379 case eAccessProtected: return AS_protected;
Greg Clayton8cf05932010-07-22 18:30:50 +0000380 }
381 return AS_none;
382}
383
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000384static void
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000385ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000386{
387 // FIXME: Cleanup per-file based stuff.
388
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +0000389 // Set some properties which depend solely on the input kind; it would be nice
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390 // to move these to the language standard, and have the driver resolve the
391 // input kind + language standard.
Greg Clayton94e5d782010-06-13 17:34:29 +0000392 if (IK == IK_Asm) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000393 Opts.AsmPreprocessor = 1;
Greg Clayton94e5d782010-06-13 17:34:29 +0000394 } else if (IK == IK_ObjC ||
395 IK == IK_ObjCXX ||
396 IK == IK_PreprocessedObjC ||
397 IK == IK_PreprocessedObjCXX) {
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000398 Opts.ObjC1 = Opts.ObjC2 = 1;
399 }
400
401 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
402
403 if (LangStd == LangStandard::lang_unspecified) {
404 // Based on the base language, pick one.
405 switch (IK) {
Greg Clayton94e5d782010-06-13 17:34:29 +0000406 case IK_None:
407 case IK_AST:
Sean Callananfb0b7582011-03-15 00:17:19 +0000408 case IK_LLVM_IR:
Greg Clayton6beaaa62011-01-17 03:46:26 +0000409 assert (!"Invalid input kind!");
Greg Clayton94e5d782010-06-13 17:34:29 +0000410 case IK_OpenCL:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000411 LangStd = LangStandard::lang_opencl;
412 break;
Sean Callananfb0b7582011-03-15 00:17:19 +0000413 case IK_CUDA:
Artem Belevich52210ae2015-03-19 18:12:26 +0000414 case IK_PreprocessedCuda:
Sean Callananfb0b7582011-03-15 00:17:19 +0000415 LangStd = LangStandard::lang_cuda;
416 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000417 case IK_Asm:
418 case IK_C:
419 case IK_PreprocessedC:
420 case IK_ObjC:
421 case IK_PreprocessedObjC:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000422 LangStd = LangStandard::lang_gnu99;
423 break;
Greg Clayton94e5d782010-06-13 17:34:29 +0000424 case IK_CXX:
425 case IK_PreprocessedCXX:
426 case IK_ObjCXX:
427 case IK_PreprocessedObjCXX:
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000428 LangStd = LangStandard::lang_gnucxx98;
429 break;
430 }
431 }
432
433 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
Filipe Cabecinhase818ca22012-11-12 21:26:32 +0000434 Opts.LineComment = Std.hasLineComments();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000435 Opts.C99 = Std.isC99();
436 Opts.CPlusPlus = Std.isCPlusPlus();
Chandler Carruth38336a12013-01-02 12:55:00 +0000437 Opts.CPlusPlus11 = Std.isCPlusPlus11();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000438 Opts.Digraphs = Std.hasDigraphs();
439 Opts.GNUMode = Std.isGNUMode();
440 Opts.GNUInline = !Std.isC99();
441 Opts.HexFloats = Std.hasHexFloats();
442 Opts.ImplicitInt = Std.hasImplicitInt();
Enrico Granatac921e342013-01-10 02:37:22 +0000443
444 Opts.WChar = true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000445
446 // OpenCL has some additional defaults.
447 if (LangStd == LangStandard::lang_opencl) {
448 Opts.OpenCL = 1;
449 Opts.AltiVec = 1;
450 Opts.CXXOperatorNames = 1;
451 Opts.LaxVectorConversions = 1;
452 }
453
454 // OpenCL and C++ both have bool, true, false keywords.
455 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
456
457// if (Opts.CPlusPlus)
458// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
459//
460// if (Args.hasArg(OPT_fobjc_gc_only))
461// Opts.setGCMode(LangOptions::GCOnly);
462// else if (Args.hasArg(OPT_fobjc_gc))
463// Opts.setGCMode(LangOptions::HybridGC);
464//
465// if (Args.hasArg(OPT_print_ivar_layout))
466// Opts.ObjCGCBitmapPrint = 1;
467//
468// if (Args.hasArg(OPT_faltivec))
469// Opts.AltiVec = 1;
470//
471// if (Args.hasArg(OPT_pthread))
472// Opts.POSIXThreads = 1;
473//
474// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
475// "default");
476// if (Vis == "default")
Sean Callanan37f76e52013-02-19 19:16:37 +0000477 Opts.setValueVisibilityMode(DefaultVisibility);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000478// else if (Vis == "hidden")
479// Opts.setVisibilityMode(LangOptions::Hidden);
480// else if (Vis == "protected")
481// Opts.setVisibilityMode(LangOptions::Protected);
482// else
483// Diags.Report(diag::err_drv_invalid_value)
484// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
485
486// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
487
488 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
489 // is specified, or -std is set to a conforming mode.
490 Opts.Trigraphs = !Opts.GNUMode;
491// if (Args.hasArg(OPT_trigraphs))
492// Opts.Trigraphs = 1;
493//
494// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
495// OPT_fno_dollars_in_identifiers,
496// !Opts.AsmPreprocessor);
497// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
498// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
499// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
500// if (Args.hasArg(OPT_fno_lax_vector_conversions))
501// Opts.LaxVectorConversions = 0;
502// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
503// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
504// Opts.Blocks = Args.hasArg(OPT_fblocks);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000505 Opts.CharIsSigned = ArchSpec(triple).CharIsSignedByDefault();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000506// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
507// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
508// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
509// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
510// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
511// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
512// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
513// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
514// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
515// Diags);
516// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
517// Opts.ObjCConstantStringClass = getLastArgValue(Args,
518// OPT_fconstant_string_class);
519// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
520// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
521// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
522// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
523// Opts.Static = Args.hasArg(OPT_static_define);
524 Opts.OptimizeSize = 0;
525
526 // FIXME: Eliminate this dependency.
527// unsigned Opt =
528// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
529// Opts.Optimize = Opt != 0;
530 unsigned Opt = 0;
531
532 // This is the __NO_INLINE__ define, which just depends on things like the
533 // optimization level and -fno-inline, not actually whether the backend has
534 // inlining enabled.
535 //
536 // FIXME: This is affected by other options (-fno-inline).
Sean Callanan3d654b32012-09-24 22:25:51 +0000537 Opts.NoInlineDefine = !Opt;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000538
539// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
540// switch (SSP) {
541// default:
542// Diags.Report(diag::err_drv_invalid_value)
543// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
544// break;
545// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
546// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
547// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
548// }
549}
550
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000551
Greg Claytonf73034f2015-09-08 18:15:05 +0000552ClangASTContext::ClangASTContext (const char *target_triple) :
553 TypeSystem (TypeSystem::eKindClang),
Greg Clayton6dc8d582015-08-18 22:32:36 +0000554 m_target_triple (),
555 m_ast_ap (),
556 m_language_options_ap (),
557 m_source_manager_ap (),
558 m_diagnostics_engine_ap (),
559 m_target_options_rp (),
560 m_target_info_ap (),
561 m_identifier_table_ap (),
562 m_selector_table_ap (),
563 m_builtins_ap (),
Ed Masted4612ad2014-04-20 13:17:36 +0000564 m_callback_tag_decl (nullptr),
565 m_callback_objc_decl (nullptr),
566 m_callback_baton (nullptr),
Greg Claytond8d4a572015-08-11 21:38:15 +0000567 m_pointer_byte_size (0),
Greg Clayton261ac3f2015-08-28 01:01:03 +0000568 m_ast_owned (false)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000569{
570 if (target_triple && target_triple[0])
Greg Clayton880cbb02011-07-30 01:26:02 +0000571 SetTargetTriple (target_triple);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000572}
573
574//----------------------------------------------------------------------
575// Destructor
576//----------------------------------------------------------------------
577ClangASTContext::~ClangASTContext()
578{
Jim Ingham0ea010a2016-02-12 00:03:19 +0000579 Finalize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000580}
581
Greg Clayton56939cb2015-09-17 22:23:34 +0000582ConstString
583ClangASTContext::GetPluginNameStatic()
584{
585 return ConstString("clang");
586}
587
588ConstString
589ClangASTContext::GetPluginName()
590{
591 return ClangASTContext::GetPluginNameStatic();
592}
593
594uint32_t
595ClangASTContext::GetPluginVersion()
596{
597 return 1;
598}
599
600lldb::TypeSystemSP
Tamas Berghammer3a6b82b2015-10-09 12:06:10 +0000601ClangASTContext::CreateInstance (lldb::LanguageType language,
602 lldb_private::Module *module,
603 Target *target)
Greg Clayton56939cb2015-09-17 22:23:34 +0000604{
605 if (ClangASTContextSupportsLanguage(language))
606 {
Greg Clayton5beec212015-10-08 21:04:34 +0000607 ArchSpec arch;
608 if (module)
609 arch = module->GetArchitecture();
610 else if (target)
611 arch = target->GetArchitecture();
612
613 if (arch.IsValid())
Greg Clayton56939cb2015-09-17 22:23:34 +0000614 {
Greg Clayton5beec212015-10-08 21:04:34 +0000615 ArchSpec fixed_arch = arch;
616 // LLVM wants this to be set to iOS or MacOSX; if we're working on
617 // a bare-boards type image, change the triple for llvm's benefit.
618 if (fixed_arch.GetTriple().getVendor() == llvm::Triple::Apple &&
619 fixed_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
Greg Clayton56939cb2015-09-17 22:23:34 +0000620 {
Greg Clayton5beec212015-10-08 21:04:34 +0000621 if (fixed_arch.GetTriple().getArch() == llvm::Triple::arm ||
622 fixed_arch.GetTriple().getArch() == llvm::Triple::aarch64 ||
623 fixed_arch.GetTriple().getArch() == llvm::Triple::thumb)
Greg Clayton56939cb2015-09-17 22:23:34 +0000624 {
Greg Clayton5beec212015-10-08 21:04:34 +0000625 fixed_arch.GetTriple().setOS(llvm::Triple::IOS);
Greg Clayton56939cb2015-09-17 22:23:34 +0000626 }
Greg Clayton5beec212015-10-08 21:04:34 +0000627 else
628 {
629 fixed_arch.GetTriple().setOS(llvm::Triple::MacOSX);
630 }
631 }
632
633 if (module)
634 {
635 std::shared_ptr<ClangASTContext> ast_sp(new ClangASTContext);
636 if (ast_sp)
637 {
638 ast_sp->SetArchitecture (fixed_arch);
639 }
640 return ast_sp;
641 }
Sean Callanana3444ff2015-11-10 22:54:42 +0000642 else if (target && target->IsValid())
Greg Clayton5beec212015-10-08 21:04:34 +0000643 {
644 std::shared_ptr<ClangASTContextForExpressions> ast_sp(new ClangASTContextForExpressions(*target));
645 if (ast_sp)
646 {
647 ast_sp->SetArchitecture(fixed_arch);
648 ast_sp->m_scratch_ast_source_ap.reset (new ClangASTSource(target->shared_from_this()));
649 ast_sp->m_scratch_ast_source_ap->InstallASTContext(ast_sp->getASTContext());
650 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(ast_sp->m_scratch_ast_source_ap->CreateProxy());
651 ast_sp->SetExternalSource(proxy_ast_source);
652 return ast_sp;
653 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000654 }
655 }
Greg Clayton56939cb2015-09-17 22:23:34 +0000656 }
657 return lldb::TypeSystemSP();
658}
659
Sean Callananfe38c852015-10-08 23:07:53 +0000660void
661ClangASTContext::EnumerateSupportedLanguages(std::set<lldb::LanguageType> &languages_for_types, std::set<lldb::LanguageType> &languages_for_expressions)
662{
663 static std::vector<lldb::LanguageType> s_supported_languages_for_types({
664 lldb::eLanguageTypeC89,
665 lldb::eLanguageTypeC,
666 lldb::eLanguageTypeC11,
667 lldb::eLanguageTypeC_plus_plus,
668 lldb::eLanguageTypeC99,
669 lldb::eLanguageTypeObjC,
670 lldb::eLanguageTypeObjC_plus_plus,
671 lldb::eLanguageTypeC_plus_plus_03,
672 lldb::eLanguageTypeC_plus_plus_11,
673 lldb::eLanguageTypeC11,
674 lldb::eLanguageTypeC_plus_plus_14});
675
676 static std::vector<lldb::LanguageType> s_supported_languages_for_expressions({
677 lldb::eLanguageTypeC_plus_plus,
678 lldb::eLanguageTypeObjC_plus_plus,
679 lldb::eLanguageTypeC_plus_plus_03,
680 lldb::eLanguageTypeC_plus_plus_11,
681 lldb::eLanguageTypeC_plus_plus_14});
682
683 languages_for_types.insert(s_supported_languages_for_types.begin(), s_supported_languages_for_types.end());
684 languages_for_expressions.insert(s_supported_languages_for_expressions.begin(), s_supported_languages_for_expressions.end());
685}
686
Greg Clayton56939cb2015-09-17 22:23:34 +0000687
688void
689ClangASTContext::Initialize()
690{
691 PluginManager::RegisterPlugin (GetPluginNameStatic(),
692 "clang base AST context plug-in",
Sean Callananfe38c852015-10-08 23:07:53 +0000693 CreateInstance,
694 EnumerateSupportedLanguages);
Greg Clayton56939cb2015-09-17 22:23:34 +0000695}
696
697void
698ClangASTContext::Terminate()
699{
700 PluginManager::UnregisterPlugin (CreateInstance);
701}
702
Jim Ingham0ea010a2016-02-12 00:03:19 +0000703void
704ClangASTContext::Finalize()
705{
706 if (m_ast_ap.get())
707 {
708 GetASTMap().Erase(m_ast_ap.get());
709 if (!m_ast_owned)
710 m_ast_ap.release();
711 }
712
713 m_builtins_ap.reset();
714 m_selector_table_ap.reset();
715 m_identifier_table_ap.reset();
716 m_target_info_ap.reset();
717 m_target_options_rp.reset();
718 m_diagnostics_engine_ap.reset();
719 m_source_manager_ap.reset();
720 m_language_options_ap.reset();
721 m_ast_ap.reset();
722 m_scratch_ast_source_ap.reset();
723}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000724
725void
726ClangASTContext::Clear()
727{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000728 m_ast_ap.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000729 m_language_options_ap.reset();
730 m_source_manager_ap.reset();
Sean Callanan880e6802011-10-07 23:18:13 +0000731 m_diagnostics_engine_ap.reset();
Sean Callananc5069ad2012-10-17 22:11:14 +0000732 m_target_options_rp.reset();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000733 m_target_info_ap.reset();
734 m_identifier_table_ap.reset();
735 m_selector_table_ap.reset();
736 m_builtins_ap.reset();
Greg Clayton57ee3062013-07-11 22:46:58 +0000737 m_pointer_byte_size = 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000738}
739
740const char *
741ClangASTContext::GetTargetTriple ()
742{
743 return m_target_triple.c_str();
744}
745
746void
747ClangASTContext::SetTargetTriple (const char *target_triple)
748{
749 Clear();
750 m_target_triple.assign(target_triple);
751}
752
Greg Clayton514487e2011-02-15 21:59:32 +0000753void
754ClangASTContext::SetArchitecture (const ArchSpec &arch)
755{
Greg Clayton880cbb02011-07-30 01:26:02 +0000756 SetTargetTriple(arch.GetTriple().str().c_str());
Greg Clayton514487e2011-02-15 21:59:32 +0000757}
758
Greg Clayton6beaaa62011-01-17 03:46:26 +0000759bool
760ClangASTContext::HasExternalSource ()
761{
762 ASTContext *ast = getASTContext();
763 if (ast)
Ed Masted4612ad2014-04-20 13:17:36 +0000764 return ast->getExternalSource () != nullptr;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000765 return false;
766}
767
768void
Todd Fiala955fe6f2014-02-27 17:18:23 +0000769ClangASTContext::SetExternalSource (llvm::IntrusiveRefCntPtr<ExternalASTSource> &ast_source_ap)
Greg Clayton6beaaa62011-01-17 03:46:26 +0000770{
771 ASTContext *ast = getASTContext();
772 if (ast)
773 {
774 ast->setExternalSource (ast_source_ap);
775 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
776 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
777 }
778}
779
780void
781ClangASTContext::RemoveExternalSource ()
782{
783 ASTContext *ast = getASTContext();
784
785 if (ast)
786 {
Todd Fiala955fe6f2014-02-27 17:18:23 +0000787 llvm::IntrusiveRefCntPtr<ExternalASTSource> empty_ast_source_ap;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000788 ast->setExternalSource (empty_ast_source_ap);
789 ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
790 //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
791 }
792}
793
Greg Claytond8d4a572015-08-11 21:38:15 +0000794void
795ClangASTContext::setASTContext(clang::ASTContext *ast_ctx)
796{
797 if (!m_ast_owned) {
798 m_ast_ap.release();
799 }
800 m_ast_owned = false;
801 m_ast_ap.reset(ast_ctx);
802 GetASTMap().Insert(ast_ctx, this);
803}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000804
805ASTContext *
806ClangASTContext::getASTContext()
807{
Ed Masted4612ad2014-04-20 13:17:36 +0000808 if (m_ast_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000809 {
Greg Claytond8d4a572015-08-11 21:38:15 +0000810 m_ast_owned = true;
Greg Clayton6beaaa62011-01-17 03:46:26 +0000811 m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
812 *getSourceManager(),
Greg Clayton6beaaa62011-01-17 03:46:26 +0000813 *getIdentifierTable(),
814 *getSelectorTable(),
Alp Tokercf55e882014-05-03 15:05:45 +0000815 *getBuiltinContext()));
Sean Callanan6d61b632015-04-09 17:42:48 +0000816
817 m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
Greg Clayton28eb7bf2015-05-07 00:07:44 +0000818
819 // This can be NULL if we don't know anything about the architecture or if the
820 // target for an architecture isn't enabled in the llvm/clang that we built
821 TargetInfo *target_info = getTargetInfo();
822 if (target_info)
823 m_ast_ap->InitBuiltinTypes(*target_info);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000824
Greg Clayton6beaaa62011-01-17 03:46:26 +0000825 if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
826 {
827 m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
828 //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
829 }
830
Enrico Granata2267ad42014-09-16 17:28:40 +0000831 GetASTMap().Insert(m_ast_ap.get(), this);
Greg Clayton6dc8d582015-08-18 22:32:36 +0000832
833 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> ast_source_ap (new ClangExternalASTSourceCallbacks (ClangASTContext::CompleteTagDecl,
834 ClangASTContext::CompleteObjCInterfaceDecl,
835 nullptr,
836 ClangASTContext::LayoutRecordType,
837 this));
838 SetExternalSource (ast_source_ap);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000839 }
Greg Clayton6beaaa62011-01-17 03:46:26 +0000840 return m_ast_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000841}
842
Enrico Granata5d84a692014-08-19 21:46:37 +0000843ClangASTContext*
844ClangASTContext::GetASTContext (clang::ASTContext* ast)
845{
Enrico Granata2267ad42014-09-16 17:28:40 +0000846 ClangASTContext *clang_ast = GetASTMap().Lookup(ast);
Enrico Granata5d84a692014-08-19 21:46:37 +0000847 return clang_ast;
848}
849
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000850Builtin::Context *
851ClangASTContext::getBuiltinContext()
852{
Ed Masted4612ad2014-04-20 13:17:36 +0000853 if (m_builtins_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000854 m_builtins_ap.reset (new Builtin::Context());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000855 return m_builtins_ap.get();
856}
857
858IdentifierTable *
859ClangASTContext::getIdentifierTable()
860{
Ed Masted4612ad2014-04-20 13:17:36 +0000861 if (m_identifier_table_ap.get() == nullptr)
862 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), nullptr));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000863 return m_identifier_table_ap.get();
864}
865
866LangOptions *
867ClangASTContext::getLanguageOptions()
868{
Ed Masted4612ad2014-04-20 13:17:36 +0000869 if (m_language_options_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000870 {
871 m_language_options_ap.reset(new LangOptions());
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +0000872 ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple());
Greg Clayton94e5d782010-06-13 17:34:29 +0000873// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000874 }
875 return m_language_options_ap.get();
876}
877
878SelectorTable *
879ClangASTContext::getSelectorTable()
880{
Ed Masted4612ad2014-04-20 13:17:36 +0000881 if (m_selector_table_ap.get() == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000882 m_selector_table_ap.reset (new SelectorTable());
883 return m_selector_table_ap.get();
884}
885
Sean Callanan79439e82010-11-18 02:56:27 +0000886clang::FileManager *
887ClangASTContext::getFileManager()
888{
Ed Masted4612ad2014-04-20 13:17:36 +0000889 if (m_file_manager_ap.get() == nullptr)
Greg Clayton38a61402010-12-02 23:20:03 +0000890 {
891 clang::FileSystemOptions file_system_options;
892 m_file_manager_ap.reset(new clang::FileManager(file_system_options));
893 }
Sean Callanan79439e82010-11-18 02:56:27 +0000894 return m_file_manager_ap.get();
895}
896
Greg Claytone1a916a2010-07-21 22:12:05 +0000897clang::SourceManager *
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000898ClangASTContext::getSourceManager()
899{
Ed Masted4612ad2014-04-20 13:17:36 +0000900 if (m_source_manager_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000901 m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000902 return m_source_manager_ap.get();
903}
904
Sean Callanan880e6802011-10-07 23:18:13 +0000905clang::DiagnosticsEngine *
906ClangASTContext::getDiagnosticsEngine()
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000907{
Ed Masted4612ad2014-04-20 13:17:36 +0000908 if (m_diagnostics_engine_ap.get() == nullptr)
Greg Claytona651b532010-11-19 21:46:54 +0000909 {
910 llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
Sean Callananec8f1ef2012-10-25 01:00:25 +0000911 m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
Greg Claytona651b532010-11-19 21:46:54 +0000912 }
Sean Callanan880e6802011-10-07 23:18:13 +0000913 return m_diagnostics_engine_ap.get();
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000914}
915
Greg Claytonfe689042015-11-10 17:47:04 +0000916clang::MangleContext *
917ClangASTContext::getMangleContext()
918{
919 if (m_mangle_ctx_ap.get() == nullptr)
920 m_mangle_ctx_ap.reset (getASTContext()->createMangleContext());
921 return m_mangle_ctx_ap.get();
922}
923
Sean Callanan880e6802011-10-07 23:18:13 +0000924class NullDiagnosticConsumer : public DiagnosticConsumer
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000925{
926public:
Sean Callanan880e6802011-10-07 23:18:13 +0000927 NullDiagnosticConsumer ()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000928 {
929 m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
930 }
Sean Callanan579e70c2016-03-19 00:03:59 +0000931
932 void
933 HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &info)
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000934 {
935 if (m_log)
936 {
Sean Callanan5b26f272012-02-04 08:49:35 +0000937 llvm::SmallVector<char, 32> diag_str(10);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000938 info.FormatDiagnostic(diag_str);
939 diag_str.push_back('\0');
940 m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
941 }
942 }
Sean Callanan880e6802011-10-07 23:18:13 +0000943
944 DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
945 {
946 return new NullDiagnosticConsumer ();
947 }
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000948private:
Greg Clayton5160ce52013-03-27 23:08:40 +0000949 Log * m_log;
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000950};
951
Sean Callanan880e6802011-10-07 23:18:13 +0000952DiagnosticConsumer *
953ClangASTContext::getDiagnosticConsumer()
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000954{
Ed Masted4612ad2014-04-20 13:17:36 +0000955 if (m_diagnostic_consumer_ap.get() == nullptr)
Sean Callanan880e6802011-10-07 23:18:13 +0000956 m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000957
Sean Callanan880e6802011-10-07 23:18:13 +0000958 return m_diagnostic_consumer_ap.get();
Sean Callanan7fddd4c2010-12-11 00:08:56 +0000959}
960
Saleem Abdulrasool8bd973c2016-04-07 06:51:10 +0000961std::shared_ptr<clang::TargetOptions> &
Jason Molenda45938b92014-07-08 23:46:39 +0000962ClangASTContext::getTargetOptions() {
Alp Tokeredc902f2014-07-05 03:06:05 +0000963 if (m_target_options_rp.get() == nullptr && !m_target_triple.empty())
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000964 {
Saleem Abdulrasool8bd973c2016-04-07 06:51:10 +0000965 m_target_options_rp = std::make_shared<clang::TargetOptions>();
Alp Tokeredc902f2014-07-05 03:06:05 +0000966 if (m_target_options_rp.get() != nullptr)
Sean Callananc5069ad2012-10-17 22:11:14 +0000967 m_target_options_rp->Triple = m_target_triple;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000968 }
Alp Toker5f838642014-07-06 05:36:57 +0000969 return m_target_options_rp;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000970}
971
972
973TargetInfo *
974ClangASTContext::getTargetInfo()
975{
Greg Clayton70512312012-05-08 01:45:38 +0000976 // target_triple should be something like "x86_64-apple-macosx"
Ed Masted4612ad2014-04-20 13:17:36 +0000977 if (m_target_info_ap.get() == nullptr && !m_target_triple.empty())
Greg Clayton38d880a2012-11-16 21:35:22 +0000978 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000979 return m_target_info_ap.get();
980}
981
982#pragma mark Basic Types
983
984static inline bool
Greg Clayton6beaaa62011-01-17 03:46:26 +0000985QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000986{
Greg Clayton6beaaa62011-01-17 03:46:26 +0000987 uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000988 if (qual_type_bit_size == bit_size)
989 return true;
990 return false;
991}
Greg Clayton56939cb2015-09-17 22:23:34 +0000992
Greg Claytona1e5dc82015-08-11 22:53:00 +0000993CompilerType
Greg Clayton56939cb2015-09-17 22:23:34 +0000994ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, size_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000995{
Greg Clayton57ee3062013-07-11 22:46:58 +0000996 return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000997}
998
Greg Claytona1e5dc82015-08-11 22:53:00 +0000999CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001000ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001001{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001002 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001003 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001004 switch (encoding)
1005 {
Greg Claytonc86103d2010-08-05 01:57:25 +00001006 case eEncodingInvalid:
Greg Clayton6beaaa62011-01-17 03:46:26 +00001007 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001008 return CompilerType (ast, ast->VoidPtrTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001009 break;
1010
Greg Claytonc86103d2010-08-05 01:57:25 +00001011 case eEncodingUint:
Greg Clayton6beaaa62011-01-17 03:46:26 +00001012 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001013 return CompilerType (ast, ast->UnsignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001014 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001015 return CompilerType (ast, ast->UnsignedShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001016 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001017 return CompilerType (ast, ast->UnsignedIntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001018 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001019 return CompilerType (ast, ast->UnsignedLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001020 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001021 return CompilerType (ast, ast->UnsignedLongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001022 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001023 return CompilerType (ast, ast->UnsignedInt128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001024 break;
1025
Greg Claytonc86103d2010-08-05 01:57:25 +00001026 case eEncodingSint:
Ulrich Weigand377e4212016-04-14 14:30:12 +00001027 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
1028 return CompilerType (ast, ast->SignedCharTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001029 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001030 return CompilerType (ast, ast->ShortTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001031 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001032 return CompilerType (ast, ast->IntTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001033 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001034 return CompilerType (ast, ast->LongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001035 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001036 return CompilerType (ast, ast->LongLongTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001037 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001038 return CompilerType (ast, ast->Int128Ty);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001039 break;
1040
Greg Claytonc86103d2010-08-05 01:57:25 +00001041 case eEncodingIEEE754:
Greg Clayton6beaaa62011-01-17 03:46:26 +00001042 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001043 return CompilerType (ast, ast->FloatTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001044 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001045 return CompilerType (ast, ast->DoubleTy);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001046 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001047 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +00001048 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
1049 return CompilerType (ast, ast->HalfTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001050 break;
1051
Greg Claytonc86103d2010-08-05 01:57:25 +00001052 case eEncodingVector:
Johnny Chenc79c93a2012-03-07 01:12:24 +00001053 // Sanity check that bit_size is a multiple of 8's.
1054 if (bit_size && !(bit_size & 0x7u))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001055 return CompilerType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8));
Johnny Chenc79c93a2012-03-07 01:12:24 +00001056 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001057 }
1058
Greg Claytona1e5dc82015-08-11 22:53:00 +00001059 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001060}
1061
Greg Clayton57ee3062013-07-11 22:46:58 +00001062
1063
1064lldb::BasicType
1065ClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
1066{
1067 if (name)
1068 {
1069 typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
1070 static TypeNameToBasicTypeMap g_type_map;
1071 static std::once_flag g_once_flag;
1072 std::call_once(g_once_flag, [](){
1073 // "void"
1074 g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
1075
1076 // "char"
1077 g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
1078 g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
1079 g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
1080 g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
1081 g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
1082 g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
1083 // "short"
1084 g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
1085 g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
1086 g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
1087 g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
1088
1089 // "int"
1090 g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
1091 g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
1092 g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
1093 g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
1094
1095 // "long"
1096 g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
1097 g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
1098 g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
1099 g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
1100
1101 // "long long"
1102 g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
1103 g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
1104 g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
1105 g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
1106
1107 // "int128"
1108 g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
1109 g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
1110
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001111 // Miscellaneous
Greg Clayton57ee3062013-07-11 22:46:58 +00001112 g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
1113 g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
1114 g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
1115 g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
1116 g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
1117 g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
1118 g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
1119 g_type_map.Sort();
1120 });
1121
1122 return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
1123 }
1124 return eBasicTypeInvalid;
1125}
1126
Greg Claytona1e5dc82015-08-11 22:53:00 +00001127CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +00001128ClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
1129{
1130 if (ast)
1131 {
1132 lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
1133 return ClangASTContext::GetBasicType (ast, basic_type);
1134 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001135 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +00001136}
1137
1138uint32_t
1139ClangASTContext::GetPointerByteSize ()
1140{
1141 if (m_pointer_byte_size == 0)
Enrico Granata1cd5e922015-01-28 00:07:51 +00001142 m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize(nullptr);
Greg Clayton57ee3062013-07-11 22:46:58 +00001143 return m_pointer_byte_size;
1144}
1145
Greg Claytona1e5dc82015-08-11 22:53:00 +00001146CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +00001147ClangASTContext::GetBasicType (lldb::BasicType basic_type)
1148{
1149 return GetBasicType (getASTContext(), basic_type);
1150}
1151
Greg Claytona1e5dc82015-08-11 22:53:00 +00001152CompilerType
Greg Clayton57ee3062013-07-11 22:46:58 +00001153ClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
1154{
Zachary Turner9d8a97e2016-04-01 23:20:35 +00001155 if (!ast)
1156 return CompilerType();
1157 lldb::opaque_compiler_type_t clang_type = GetOpaqueCompilerType(ast, basic_type);
1158
1159 if (clang_type)
1160 return CompilerType(GetASTContext(ast), clang_type);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001161 return CompilerType();
Greg Clayton57ee3062013-07-11 22:46:58 +00001162}
1163
1164
Greg Claytona1e5dc82015-08-11 22:53:00 +00001165CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001166ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
1167{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001168 ASTContext *ast = getASTContext();
Sean Callanan38d4df52012-04-03 01:10:10 +00001169
1170#define streq(a,b) strcmp(a,b) == 0
Ed Masted4612ad2014-04-20 13:17:36 +00001171 assert (ast != nullptr);
Greg Clayton6beaaa62011-01-17 03:46:26 +00001172 if (ast)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001173 {
1174 switch (dw_ate)
1175 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001176 default:
1177 break;
Greg Clayton605684e2011-10-28 23:06:08 +00001178
Sean Callanan38d4df52012-04-03 01:10:10 +00001179 case DW_ATE_address:
1180 if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001181 return CompilerType (ast, ast->VoidPtrTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001182 break;
1183
1184 case DW_ATE_boolean:
1185 if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001186 return CompilerType (ast, ast->BoolTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001187 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001188 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001189 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001190 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001191 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001192 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001193 break;
1194
1195 case DW_ATE_lo_user:
1196 // This has been seen to mean DW_AT_complex_integer
1197 if (type_name)
Greg Clayton605684e2011-10-28 23:06:08 +00001198 {
Sean Callanan38d4df52012-04-03 01:10:10 +00001199 if (::strstr(type_name, "complex"))
1200 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001201 CompilerType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
Zachary Turnerd133f6a2016-03-28 22:53:41 +00001202 return CompilerType(ast, ast->getComplexType(ClangUtil::GetQualType(complex_int_clang_type)));
Sean Callanan38d4df52012-04-03 01:10:10 +00001203 }
Greg Clayton605684e2011-10-28 23:06:08 +00001204 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001205 break;
1206
1207 case DW_ATE_complex_float:
1208 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001209 return CompilerType (ast, ast->FloatComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001210 else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001211 return CompilerType (ast, ast->DoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001212 else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001213 return CompilerType (ast, ast->LongDoubleComplexTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001214 else
Greg Clayton605684e2011-10-28 23:06:08 +00001215 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001216 CompilerType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
Zachary Turnerd133f6a2016-03-28 22:53:41 +00001217 return CompilerType(ast, ast->getComplexType(ClangUtil::GetQualType(complex_float_clang_type)));
Greg Clayton605684e2011-10-28 23:06:08 +00001218 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001219 break;
1220
1221 case DW_ATE_float:
Greg Clayton8012cad2014-11-17 19:39:20 +00001222 if (streq(type_name, "float") && QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001223 return CompilerType (ast, ast->FloatTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001224 if (streq(type_name, "double") && QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001225 return CompilerType (ast, ast->DoubleTy);
Greg Clayton8012cad2014-11-17 19:39:20 +00001226 if (streq(type_name, "long double") && QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001227 return CompilerType (ast, ast->LongDoubleTy);
Bruce Mitchenere171da52015-07-22 00:16:02 +00001228 // Fall back to not requiring a name match
Sean Callanan38d4df52012-04-03 01:10:10 +00001229 if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001230 return CompilerType (ast, ast->FloatTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001231 if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001232 return CompilerType (ast, ast->DoubleTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001233 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001234 return CompilerType (ast, ast->LongDoubleTy);
Greg Claytondee40e72015-11-03 23:23:22 +00001235 if (QualTypeMatchesBitSize (bit_size, ast, ast->HalfTy))
1236 return CompilerType (ast, ast->HalfTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001237 break;
1238
1239 case DW_ATE_signed:
1240 if (type_name)
1241 {
1242 if (streq(type_name, "wchar_t") &&
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001243 QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy) &&
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001244 (getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001245 return CompilerType (ast, ast->WCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001246 if (streq(type_name, "void") &&
1247 QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001248 return CompilerType (ast, ast->VoidTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001249 if (strstr(type_name, "long long") &&
1250 QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001251 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001252 if (strstr(type_name, "long") &&
1253 QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001254 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001255 if (strstr(type_name, "short") &&
1256 QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001257 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001258 if (strstr(type_name, "char"))
1259 {
1260 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001261 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001262 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001263 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001264 }
1265 if (strstr(type_name, "int"))
1266 {
1267 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001268 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001269 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001270 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001271 }
1272 }
1273 // We weren't able to match up a type name, just search by size
1274 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001275 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001276 if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001277 return CompilerType (ast, ast->ShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001278 if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001279 return CompilerType (ast, ast->IntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001280 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001281 return CompilerType (ast, ast->LongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001282 if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001283 return CompilerType (ast, ast->LongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001284 if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001285 return CompilerType (ast, ast->Int128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001286 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001287
Sean Callanan38d4df52012-04-03 01:10:10 +00001288 case DW_ATE_signed_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001289 if (ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
Sean Callanan38d4df52012-04-03 01:10:10 +00001290 {
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001291 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001292 return CompilerType (ast, ast->CharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001293 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001294 if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001295 return CompilerType (ast, ast->SignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001296 break;
1297
1298 case DW_ATE_unsigned:
1299 if (type_name)
1300 {
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001301 if (streq(type_name, "wchar_t"))
1302 {
1303 if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
1304 {
Greg Clayton28eb7bf2015-05-07 00:07:44 +00001305 if (!(getTargetInfo() && TargetInfo::isTypeSigned (getTargetInfo()->getWCharType())))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001306 return CompilerType (ast, ast->WCharTy);
Tamas Berghammer3c0d0052015-04-01 09:48:02 +00001307 }
1308 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001309 if (strstr(type_name, "long long"))
1310 {
1311 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001312 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001313 }
1314 else if (strstr(type_name, "long"))
1315 {
1316 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001317 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001318 }
1319 else if (strstr(type_name, "short"))
1320 {
1321 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001322 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001323 }
1324 else if (strstr(type_name, "char"))
1325 {
1326 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001327 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001328 }
1329 else if (strstr(type_name, "int"))
1330 {
1331 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001332 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001333 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001334 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001335 }
1336 }
1337 // We weren't able to match up a type name, just search by size
1338 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001339 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001340 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001341 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001342 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001343 return CompilerType (ast, ast->UnsignedIntTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001344 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001345 return CompilerType (ast, ast->UnsignedLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001346 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001347 return CompilerType (ast, ast->UnsignedLongLongTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001348 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001349 return CompilerType (ast, ast->UnsignedInt128Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001350 break;
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001351
Sean Callanan38d4df52012-04-03 01:10:10 +00001352 case DW_ATE_unsigned_char:
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001353 if (!ast->getLangOpts().CharIsSigned && type_name && streq(type_name, "char"))
1354 {
1355 if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001356 return CompilerType (ast, ast->CharTy);
Tamas Berghammerdccbfaf2015-03-31 10:21:50 +00001357 }
Sean Callanan38d4df52012-04-03 01:10:10 +00001358 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001359 return CompilerType (ast, ast->UnsignedCharTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001360 if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00001361 return CompilerType (ast, ast->UnsignedShortTy);
Sean Callanan38d4df52012-04-03 01:10:10 +00001362 break;
1363
1364 case DW_ATE_imaginary_float:
1365 break;
1366
1367 case DW_ATE_UTF:
1368 if (type_name)
1369 {
1370 if (streq(type_name, "char16_t"))
1371 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001372 return CompilerType (ast, ast->Char16Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001373 }
1374 else if (streq(type_name, "char32_t"))
1375 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00001376 return CompilerType (ast, ast->Char32Ty);
Sean Callanan38d4df52012-04-03 01:10:10 +00001377 }
1378 }
1379 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001380 }
1381 }
1382 // This assert should fire for anything that we don't catch above so we know
1383 // to fix any issues we run into.
Greg Claytondc968d12011-05-17 18:15:05 +00001384 if (type_name)
1385 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001386 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 +00001387 }
1388 else
1389 {
Greg Claytone38a5ed2012-01-05 03:57:59 +00001390 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 +00001391 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001392 return CompilerType ();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001393}
1394
Greg Claytona1e5dc82015-08-11 22:53:00 +00001395CompilerType
Sean Callanan77502262011-05-12 23:54:16 +00001396ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1397{
Greg Clayton57ee3062013-07-11 22:46:58 +00001398 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001399 return CompilerType (ast, ast->UnknownAnyTy);
1400 return CompilerType();
Sean Callanan77502262011-05-12 23:54:16 +00001401}
1402
Greg Claytona1e5dc82015-08-11 22:53:00 +00001403CompilerType
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001404ClangASTContext::GetCStringType (bool is_const)
1405{
Greg Clayton57ee3062013-07-11 22:46:58 +00001406 ASTContext *ast = getASTContext();
1407 QualType char_type(ast->CharTy);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001408
1409 if (is_const)
1410 char_type.addConst();
1411
Greg Claytona1e5dc82015-08-11 22:53:00 +00001412 return CompilerType (ast, ast->getPointerType(char_type));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001413}
1414
Sean Callanan09ab4b72011-11-30 22:11:59 +00001415clang::DeclContext *
1416ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1417{
1418 return ast->getTranslationUnitDecl();
1419}
1420
Greg Clayton526e5af2010-11-13 03:52:47 +00001421clang::Decl *
Greg Clayton38a61402010-12-02 23:20:03 +00001422ClangASTContext::CopyDecl (ASTContext *dst_ast,
1423 ASTContext *src_ast,
Greg Clayton526e5af2010-11-13 03:52:47 +00001424 clang::Decl *source_decl)
Sean Callanan7fddd4c2010-12-11 00:08:56 +00001425{
Sean Callanan79439e82010-11-18 02:56:27 +00001426 FileSystemOptions file_system_options;
Greg Clayton38a61402010-12-02 23:20:03 +00001427 FileManager file_manager (file_system_options);
1428 ASTImporter importer(*dst_ast, file_manager,
Sean Callanan2c777c42011-01-18 23:32:05 +00001429 *src_ast, file_manager,
1430 false);
Greg Clayton526e5af2010-11-13 03:52:47 +00001431
1432 return importer.Import(source_decl);
1433}
1434
Sean Callanan23a30272010-07-16 00:00:27 +00001435bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00001436ClangASTContext::AreTypesSame (CompilerType type1,
1437 CompilerType type2,
Greg Clayton84db9102012-03-26 23:03:23 +00001438 bool ignore_qualifiers)
Sean Callanan4dcca2622010-07-15 22:30:52 +00001439{
Greg Claytonf73034f2015-09-08 18:15:05 +00001440 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type1.GetTypeSystem());
1441 if (!ast || ast != type2.GetTypeSystem())
Greg Clayton57ee3062013-07-11 22:46:58 +00001442 return false;
1443
1444 if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
Greg Clayton55995eb2012-04-06 17:38:55 +00001445 return true;
1446
Zachary Turnerd133f6a2016-03-28 22:53:41 +00001447 QualType type1_qual = ClangUtil::GetQualType(type1);
1448 QualType type2_qual = ClangUtil::GetQualType(type2);
1449
Sean Callanan5056ab02012-02-18 02:01:03 +00001450 if (ignore_qualifiers)
1451 {
1452 type1_qual = type1_qual.getUnqualifiedType();
1453 type2_qual = type2_qual.getUnqualifiedType();
1454 }
1455
Greg Claytonf73034f2015-09-08 18:15:05 +00001456 return ast->getASTContext()->hasSameType (type1_qual, type2_qual);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001457}
1458
Greg Claytona1e5dc82015-08-11 22:53:00 +00001459CompilerType
Sean Callanan9998acd2014-12-05 01:21:59 +00001460ClangASTContext::GetTypeForDecl (clang::NamedDecl *decl)
1461{
1462 if (clang::ObjCInterfaceDecl *interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
1463 return GetTypeForDecl(interface_decl);
1464 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
1465 return GetTypeForDecl(tag_decl);
Greg Claytona1e5dc82015-08-11 22:53:00 +00001466 return CompilerType();
Sean Callanan9998acd2014-12-05 01:21:59 +00001467}
1468
Greg Clayton6beaaa62011-01-17 03:46:26 +00001469
Greg Claytona1e5dc82015-08-11 22:53:00 +00001470CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001471ClangASTContext::GetTypeForDecl (TagDecl *decl)
1472{
1473 // No need to call the getASTContext() accessor (which can create the AST
1474 // if it isn't created yet, because we can't have created a decl in this
1475 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001476 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001477 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001478 return CompilerType (ast, ast->getTagDeclType(decl));
1479 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001480}
1481
Greg Claytona1e5dc82015-08-11 22:53:00 +00001482CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00001483ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1484{
1485 // No need to call the getASTContext() accessor (which can create the AST
1486 // if it isn't created yet, because we can't have created a decl in this
1487 // AST if our AST didn't already exist...
Sean Callanan9998acd2014-12-05 01:21:59 +00001488 ASTContext *ast = &decl->getASTContext();
Greg Clayton57ee3062013-07-11 22:46:58 +00001489 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001490 return CompilerType (ast, ast->getObjCInterfaceType(decl));
1491 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001492}
1493
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001494#pragma mark Structure, Unions, Classes
1495
Greg Claytona1e5dc82015-08-11 22:53:00 +00001496CompilerType
Greg Claytonc4ffd662013-03-08 01:37:30 +00001497ClangASTContext::CreateRecordType (DeclContext *decl_ctx,
1498 AccessType access_type,
1499 const char *name,
1500 int kind,
1501 LanguageType language,
1502 ClangASTMetadata *metadata)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001503{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001504 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001505 assert (ast != nullptr);
Sean Callananad880762012-04-18 01:06:17 +00001506
Ed Masted4612ad2014-04-20 13:17:36 +00001507 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001508 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001509
Greg Clayton9e409562010-07-28 02:04:09 +00001510
Greg Claytone1be9962011-08-24 23:50:00 +00001511 if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
Greg Clayton9e409562010-07-28 02:04:09 +00001512 {
Greg Claytonaaf99e02010-10-11 02:25:34 +00001513 bool isForwardDecl = true;
Greg Clayton9e409562010-07-28 02:04:09 +00001514 bool isInternal = false;
Sean Callananad880762012-04-18 01:06:17 +00001515 return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
Greg Clayton9e409562010-07-28 02:04:09 +00001516 }
1517
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001518 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
1519 // we will need to update this code. I was told to currently always use
1520 // the CXXRecordDecl class since we often don't know from debug information
1521 // if something is struct or a class, so we default to always use the more
1522 // complete definition just in case.
Sean Callanan11e32d32014-02-18 00:31:38 +00001523
1524 bool is_anonymous = (!name) || (!name[0]);
1525
Greg Claytonf0705c82011-10-22 03:33:13 +00001526 CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1527 (TagDecl::TagKind)kind,
1528 decl_ctx,
1529 SourceLocation(),
1530 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001531 is_anonymous ? nullptr : &ast->Idents.get(name));
Sean Callanan11e32d32014-02-18 00:31:38 +00001532
1533 if (is_anonymous)
1534 decl->setAnonymousStructOrUnion(true);
Sean Callanan7282e2a2012-01-13 22:10:18 +00001535
Greg Claytonc4ffd662013-03-08 01:37:30 +00001536 if (decl)
Greg Clayton55561e92011-10-26 03:31:36 +00001537 {
Greg Claytonc4ffd662013-03-08 01:37:30 +00001538 if (metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001539 SetMetadata(ast, decl, *metadata);
Greg Claytonc4ffd662013-03-08 01:37:30 +00001540
Greg Clayton55561e92011-10-26 03:31:36 +00001541 if (access_type != eAccessNone)
1542 decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Greg Claytonc4ffd662013-03-08 01:37:30 +00001543
1544 if (decl_ctx)
1545 decl_ctx->addDecl (decl);
1546
Greg Claytona1e5dc82015-08-11 22:53:00 +00001547 return CompilerType(ast, ast->getTagDeclType(decl));
Greg Clayton55561e92011-10-26 03:31:36 +00001548 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001549 return CompilerType();
Greg Clayton6beaaa62011-01-17 03:46:26 +00001550}
1551
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001552static TemplateParameterList *
1553CreateTemplateParameterList (ASTContext *ast,
Sean Callanan3d654b32012-09-24 22:25:51 +00001554 const ClangASTContext::TemplateParameterInfos &template_param_infos,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001555 llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1556{
1557 const bool parameter_pack = false;
1558 const bool is_typename = false;
1559 const unsigned depth = 0;
1560 const size_t num_template_params = template_param_infos.GetSize();
1561 for (size_t i=0; i<num_template_params; ++i)
1562 {
1563 const char *name = template_param_infos.names[i];
Greg Clayton283b2652013-04-23 22:38:02 +00001564
Ed Masted4612ad2014-04-20 13:17:36 +00001565 IdentifierInfo *identifier_info = nullptr;
Greg Clayton283b2652013-04-23 22:38:02 +00001566 if (name && name[0])
1567 identifier_info = &ast->Idents.get(name);
Sean Callanan3d654b32012-09-24 22:25:51 +00001568 if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001569 {
1570 template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1571 ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1572 SourceLocation(),
1573 SourceLocation(),
1574 depth,
1575 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001576 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001577 template_param_infos.args[i].getIntegralType(),
1578 parameter_pack,
Ed Masted4612ad2014-04-20 13:17:36 +00001579 nullptr));
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001580
1581 }
1582 else
1583 {
1584 template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1585 ast->getTranslationUnitDecl(), // Is this the right decl context?
1586 SourceLocation(),
1587 SourceLocation(),
1588 depth,
1589 i,
Greg Clayton283b2652013-04-23 22:38:02 +00001590 identifier_info,
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001591 is_typename,
1592 parameter_pack));
1593 }
1594 }
1595
Hubert Tong3c02e182016-08-02 18:36:15 +00001596 clang::Expr *const requires_clause = nullptr; // TODO: Concepts
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001597 TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1598 SourceLocation(),
1599 SourceLocation(),
David Majnemer48a065d2015-12-27 07:16:55 +00001600 template_param_decls,
Hubert Tong3c02e182016-08-02 18:36:15 +00001601 SourceLocation(),
1602 requires_clause);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001603 return template_param_list;
1604}
1605
1606clang::FunctionTemplateDecl *
1607ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1608 clang::FunctionDecl *func_decl,
1609 const char *name,
1610 const TemplateParameterInfos &template_param_infos)
1611{
1612// /// \brief Create a function template node.
1613 ASTContext *ast = getASTContext();
1614
1615 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1616
1617 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1618 template_param_infos,
1619 template_param_decls);
1620 FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1621 decl_ctx,
1622 func_decl->getLocation(),
1623 func_decl->getDeclName(),
1624 template_param_list,
1625 func_decl);
1626
1627 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1628 i < template_param_decl_count;
1629 ++i)
1630 {
1631 // TODO: verify which decl context we should put template_param_decls into..
1632 template_param_decls[i]->setDeclContext (func_decl);
1633 }
1634
1635 return func_tmpl_decl;
1636}
1637
1638void
1639ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1640 clang::FunctionTemplateDecl *func_tmpl_decl,
1641 const TemplateParameterInfos &infos)
1642{
Tamas Berghammer40aac2b2016-07-04 09:11:08 +00001643 TemplateArgumentList template_args (TemplateArgumentList::OnStack, infos.args);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001644
1645 func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1646 &template_args,
Ed Masted4612ad2014-04-20 13:17:36 +00001647 nullptr);
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001648}
1649
1650
Greg Claytonf0705c82011-10-22 03:33:13 +00001651ClassTemplateDecl *
1652ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
Greg Clayton55561e92011-10-26 03:31:36 +00001653 lldb::AccessType access_type,
Greg Claytonf0705c82011-10-22 03:33:13 +00001654 const char *class_name,
1655 int kind,
1656 const TemplateParameterInfos &template_param_infos)
1657{
1658 ASTContext *ast = getASTContext();
1659
Ed Masted4612ad2014-04-20 13:17:36 +00001660 ClassTemplateDecl *class_template_decl = nullptr;
1661 if (decl_ctx == nullptr)
Greg Claytonf0705c82011-10-22 03:33:13 +00001662 decl_ctx = ast->getTranslationUnitDecl();
1663
1664 IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1665 DeclarationName decl_name (&identifier_info);
1666
1667 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001668
1669 for (NamedDecl *decl : result)
Greg Claytonf0705c82011-10-22 03:33:13 +00001670 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001671 class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
Greg Claytonf0705c82011-10-22 03:33:13 +00001672 if (class_template_decl)
1673 return class_template_decl;
1674 }
1675
1676 llvm::SmallVector<NamedDecl *, 8> template_param_decls;
Greg Claytonf0705c82011-10-22 03:33:13 +00001677
Greg Clayton3c2e3ae2012-02-06 06:42:51 +00001678 TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1679 template_param_infos,
1680 template_param_decls);
Greg Claytonf0705c82011-10-22 03:33:13 +00001681
1682 CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1683 (TagDecl::TagKind)kind,
1684 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1685 SourceLocation(),
1686 SourceLocation(),
1687 &identifier_info);
Greg Claytone04741d2011-12-02 02:09:28 +00001688
1689 for (size_t i=0, template_param_decl_count = template_param_decls.size();
1690 i < template_param_decl_count;
1691 ++i)
1692 {
1693 template_param_decls[i]->setDeclContext (template_cxx_decl);
1694 }
1695
Sean Callananb5c79622011-11-19 01:35:08 +00001696 // With templated classes, we say that a class is templated with
1697 // specializations, but that the bare class has no functions.
Sean Callananfa4fab72013-02-01 06:55:48 +00001698 //template_cxx_decl->startDefinition();
1699 //template_cxx_decl->completeDefinition();
Sean Callananb5c79622011-11-19 01:35:08 +00001700
Greg Claytonf0705c82011-10-22 03:33:13 +00001701 class_template_decl = ClassTemplateDecl::Create (*ast,
1702 decl_ctx, // What decl context do we use here? TU? The actual decl context?
1703 SourceLocation(),
1704 decl_name,
1705 template_param_list,
1706 template_cxx_decl,
Ed Masted4612ad2014-04-20 13:17:36 +00001707 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001708
1709 if (class_template_decl)
Sean Callanan5e9e1992011-10-26 01:06:27 +00001710 {
Greg Clayton55561e92011-10-26 03:31:36 +00001711 if (access_type != eAccessNone)
1712 class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
Sean Callanan5b26f272012-02-04 08:49:35 +00001713
1714 //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
1715 // CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
1716
Greg Claytonf0705c82011-10-22 03:33:13 +00001717 decl_ctx->addDecl (class_template_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00001718
1719#ifdef LLDB_CONFIGURATION_DEBUG
1720 VerifyDecl(class_template_decl);
1721#endif
1722 }
Greg Claytonf0705c82011-10-22 03:33:13 +00001723
1724 return class_template_decl;
1725}
1726
1727
1728ClassTemplateSpecializationDecl *
1729ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1730 ClassTemplateDecl *class_template_decl,
1731 int kind,
1732 const TemplateParameterInfos &template_param_infos)
1733{
1734 ASTContext *ast = getASTContext();
1735 ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1736 (TagDecl::TagKind)kind,
1737 decl_ctx,
1738 SourceLocation(),
1739 SourceLocation(),
1740 class_template_decl,
Tamas Berghammer40aac2b2016-07-04 09:11:08 +00001741 template_param_infos.args,
Ed Masted4612ad2014-04-20 13:17:36 +00001742 nullptr);
Greg Claytonf0705c82011-10-22 03:33:13 +00001743
Sean Callananfa4fab72013-02-01 06:55:48 +00001744 class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1745
Greg Claytonf0705c82011-10-22 03:33:13 +00001746 return class_template_specialization_decl;
1747}
1748
Greg Claytona1e5dc82015-08-11 22:53:00 +00001749CompilerType
Greg Claytonf0705c82011-10-22 03:33:13 +00001750ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1751{
1752 if (class_template_specialization_decl)
1753 {
1754 ASTContext *ast = getASTContext();
1755 if (ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00001756 return CompilerType(ast, ast->getTagDeclType(class_template_specialization_decl));
Greg Claytonf0705c82011-10-22 03:33:13 +00001757 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00001758 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001759}
1760
Greg Clayton090d0982011-06-19 03:43:27 +00001761static inline bool
Pavel Labath1ac2b202016-08-15 14:32:32 +00001762check_op_param(bool is_method, clang::OverloadedOperatorKind op_kind, bool unary, bool binary, uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001763{
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001764 // Special-case call since it can take any number of operands
1765 if(op_kind == OO_Call)
1766 return true;
1767
Bruce Mitchenerd93c4a32014-07-01 21:22:11 +00001768 // The parameter count doesn't include "this"
Pavel Labath1ac2b202016-08-15 14:32:32 +00001769 if (is_method)
1770 ++num_params;
Greg Clayton090d0982011-06-19 03:43:27 +00001771 if (num_params == 1)
Pavel Labath1ac2b202016-08-15 14:32:32 +00001772 return unary;
1773 if (num_params == 2)
Greg Clayton090d0982011-06-19 03:43:27 +00001774 return binary;
Sean Callanan6d9f5db2011-10-15 01:15:07 +00001775 else
Greg Clayton090d0982011-06-19 03:43:27 +00001776 return false;
1777}
Daniel Dunbardacdfb52011-10-31 22:50:57 +00001778
Greg Clayton090d0982011-06-19 03:43:27 +00001779bool
Pavel Labath1ac2b202016-08-15 14:32:32 +00001780ClangASTContext::CheckOverloadedOperatorKindParameterCount(bool is_method, clang::OverloadedOperatorKind op_kind,
1781 uint32_t num_params)
Greg Clayton090d0982011-06-19 03:43:27 +00001782{
Sean Callanan5b26f272012-02-04 08:49:35 +00001783 switch (op_kind)
1784 {
1785 default:
1786 break;
1787 // C++ standard allows any number of arguments to new/delete
1788 case OO_New:
1789 case OO_Array_New:
1790 case OO_Delete:
1791 case OO_Array_Delete:
1792 return true;
1793 }
Pavel Labath1ac2b202016-08-15 14:32:32 +00001794
1795#define OVERLOADED_OPERATOR(Name, Spelling, Token, Unary, Binary, MemberOnly) \
1796 case OO_##Name: \
1797 return check_op_param(is_method, op_kind, Unary, Binary, num_params);
Greg Clayton090d0982011-06-19 03:43:27 +00001798 switch (op_kind)
1799 {
1800#include "clang/Basic/OperatorKinds.def"
1801 default: break;
1802 }
1803 return false;
1804}
1805
Greg Clayton57ee3062013-07-11 22:46:58 +00001806clang::AccessSpecifier
1807ClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001808{
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001809 // Make the access equal to the stricter of the field and the nested field's access
Zachary Turner9d8a97e2016-04-01 23:20:35 +00001810 if (lhs == AS_none || rhs == AS_none)
1811 return AS_none;
1812 if (lhs == AS_private || rhs == AS_private)
1813 return AS_private;
1814 if (lhs == AS_protected || rhs == AS_protected)
1815 return AS_protected;
1816 return AS_public;
Sean Callanane8c0cfb2012-03-02 01:03:45 +00001817}
1818
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001819bool
1820ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
1821{
1822 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
1823}
1824
1825bool
1826ClangASTContext::FieldIsBitfield
1827(
Greg Clayton6beaaa62011-01-17 03:46:26 +00001828 ASTContext *ast,
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001829 FieldDecl* field,
1830 uint32_t& bitfield_bit_size
1831)
1832{
Ed Masted4612ad2014-04-20 13:17:36 +00001833 if (ast == nullptr || field == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001834 return false;
1835
1836 if (field->isBitField())
1837 {
1838 Expr* bit_width_expr = field->getBitWidth();
1839 if (bit_width_expr)
1840 {
1841 llvm::APSInt bit_width_apsint;
Greg Clayton6beaaa62011-01-17 03:46:26 +00001842 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001843 {
1844 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
1845 return true;
1846 }
1847 }
1848 }
1849 return false;
1850}
1851
1852bool
1853ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
1854{
Ed Masted4612ad2014-04-20 13:17:36 +00001855 if (record_decl == nullptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001856 return false;
1857
1858 if (!record_decl->field_empty())
1859 return true;
1860
1861 // No fields, lets check this is a CXX record and check the base classes
1862 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1863 if (cxx_record_decl)
1864 {
1865 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1866 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1867 base_class != base_class_end;
1868 ++base_class)
1869 {
1870 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1871 if (RecordHasFields(base_class_decl))
1872 return true;
1873 }
1874 }
1875 return false;
1876}
1877
Greg Clayton8cf05932010-07-22 18:30:50 +00001878#pragma mark Objective C Classes
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001879
Greg Claytona1e5dc82015-08-11 22:53:00 +00001880CompilerType
Sean Callananad880762012-04-18 01:06:17 +00001881ClangASTContext::CreateObjCClass
Greg Clayton8cf05932010-07-22 18:30:50 +00001882(
1883 const char *name,
1884 DeclContext *decl_ctx,
1885 bool isForwardDecl,
Sean Callananad880762012-04-18 01:06:17 +00001886 bool isInternal,
Jim Ingham379397632012-10-27 02:54:13 +00001887 ClangASTMetadata *metadata
Greg Clayton8cf05932010-07-22 18:30:50 +00001888)
1889{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001890 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00001891 assert (ast != nullptr);
Greg Clayton8cf05932010-07-22 18:30:50 +00001892 assert (name && name[0]);
Ed Masted4612ad2014-04-20 13:17:36 +00001893 if (decl_ctx == nullptr)
Greg Clayton6beaaa62011-01-17 03:46:26 +00001894 decl_ctx = ast->getTranslationUnitDecl();
Greg Clayton8cf05932010-07-22 18:30:50 +00001895
Greg Clayton6beaaa62011-01-17 03:46:26 +00001896 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
Greg Clayton8cf05932010-07-22 18:30:50 +00001897 decl_ctx,
1898 SourceLocation(),
Greg Clayton6beaaa62011-01-17 03:46:26 +00001899 &ast->Idents.get(name),
Ed Masted4612ad2014-04-20 13:17:36 +00001900 nullptr,
Pavel Labath67add942015-07-07 10:11:16 +00001901 nullptr,
Greg Clayton8cf05932010-07-22 18:30:50 +00001902 SourceLocation(),
Sean Callanan5b26f272012-02-04 08:49:35 +00001903 /*isForwardDecl,*/
Greg Clayton8cf05932010-07-22 18:30:50 +00001904 isInternal);
Greg Clayton9e409562010-07-28 02:04:09 +00001905
Jim Ingham379397632012-10-27 02:54:13 +00001906 if (decl && metadata)
Greg Claytond0029442013-03-27 01:48:02 +00001907 SetMetadata(ast, decl, *metadata);
Sean Callananad880762012-04-18 01:06:17 +00001908
Greg Claytona1e5dc82015-08-11 22:53:00 +00001909 return CompilerType (ast, ast->getObjCInterfaceType(decl));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001910}
1911
1912static inline bool
1913BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1914{
Greg Clayton6beaaa62011-01-17 03:46:26 +00001915 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001916}
1917
Greg Clayton57ee3062013-07-11 22:46:58 +00001918uint32_t
1919ClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001920{
1921 uint32_t num_bases = 0;
1922 if (cxx_record_decl)
1923 {
1924 if (omit_empty_base_classes)
1925 {
1926 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1927 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1928 base_class != base_class_end;
1929 ++base_class)
1930 {
1931 // Skip empty base classes
1932 if (omit_empty_base_classes)
1933 {
1934 if (BaseSpecifierIsEmpty (base_class))
1935 continue;
1936 }
1937 ++num_bases;
1938 }
1939 }
1940 else
1941 num_bases = cxx_record_decl->getNumBases();
1942 }
1943 return num_bases;
1944}
1945
1946
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001947#pragma mark Namespace Declarations
1948
1949NamespaceDecl *
Greg Clayton030a2042011-10-14 21:34:45 +00001950ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001951{
Ed Masted4612ad2014-04-20 13:17:36 +00001952 NamespaceDecl *namespace_decl = nullptr;
Greg Clayton9d3d6882011-10-31 23:51:19 +00001953 ASTContext *ast = getASTContext();
1954 TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
Ed Masted4612ad2014-04-20 13:17:36 +00001955 if (decl_ctx == nullptr)
Greg Clayton9d3d6882011-10-31 23:51:19 +00001956 decl_ctx = translation_unit_decl;
1957
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001958 if (name)
1959 {
Greg Clayton030a2042011-10-14 21:34:45 +00001960 IdentifierInfo &identifier_info = ast->Idents.get(name);
1961 DeclarationName decl_name (&identifier_info);
1962 clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001963 for (NamedDecl *decl : result)
Greg Clayton030a2042011-10-14 21:34:45 +00001964 {
Sean Callanan5deaa4c2012-12-21 21:34:42 +00001965 namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
Greg Clayton030a2042011-10-14 21:34:45 +00001966 if (namespace_decl)
1967 return namespace_decl;
1968 }
1969
Sean Callanan5b26f272012-02-04 08:49:35 +00001970 namespace_decl = NamespaceDecl::Create(*ast,
1971 decl_ctx,
1972 false,
1973 SourceLocation(),
1974 SourceLocation(),
1975 &identifier_info,
Ed Masted4612ad2014-04-20 13:17:36 +00001976 nullptr);
Greg Clayton030a2042011-10-14 21:34:45 +00001977
Greg Clayton9d3d6882011-10-31 23:51:19 +00001978 decl_ctx->addDecl (namespace_decl);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001979 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00001980 else
1981 {
1982 if (decl_ctx == translation_unit_decl)
1983 {
1984 namespace_decl = translation_unit_decl->getAnonymousNamespace();
1985 if (namespace_decl)
1986 return namespace_decl;
1987
Sean Callanan5b26f272012-02-04 08:49:35 +00001988 namespace_decl = NamespaceDecl::Create(*ast,
1989 decl_ctx,
1990 false,
1991 SourceLocation(),
1992 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00001993 nullptr,
1994 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00001995 translation_unit_decl->setAnonymousNamespace (namespace_decl);
1996 translation_unit_decl->addDecl (namespace_decl);
1997 assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
1998 }
1999 else
2000 {
2001 NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
2002 if (parent_namespace_decl)
2003 {
2004 namespace_decl = parent_namespace_decl->getAnonymousNamespace();
2005 if (namespace_decl)
2006 return namespace_decl;
Sean Callanan5b26f272012-02-04 08:49:35 +00002007 namespace_decl = NamespaceDecl::Create(*ast,
2008 decl_ctx,
2009 false,
2010 SourceLocation(),
2011 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002012 nullptr,
2013 nullptr);
Greg Clayton9d3d6882011-10-31 23:51:19 +00002014 parent_namespace_decl->setAnonymousNamespace (namespace_decl);
2015 parent_namespace_decl->addDecl (namespace_decl);
2016 assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
2017 }
2018 else
2019 {
2020 // BAD!!!
2021 }
2022 }
Greg Clayton9d3d6882011-10-31 23:51:19 +00002023 }
2024#ifdef LLDB_CONFIGURATION_DEBUG
2025 VerifyDecl(namespace_decl);
2026#endif
Greg Clayton030a2042011-10-14 21:34:45 +00002027 return namespace_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002028}
2029
Siva Chandra03ff5c82016-02-05 19:10:04 +00002030NamespaceDecl *
2031ClangASTContext::GetUniqueNamespaceDeclaration (clang::ASTContext *ast,
2032 const char *name,
2033 clang::DeclContext *decl_ctx)
2034{
2035 ClangASTContext *ast_ctx = ClangASTContext::GetASTContext(ast);
2036 if (ast_ctx == nullptr)
2037 return nullptr;
2038
2039 return ast_ctx->GetUniqueNamespaceDeclaration(name, decl_ctx);
2040}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002041
Paul Hermand628cbb2015-09-15 23:44:17 +00002042clang::BlockDecl *
2043ClangASTContext::CreateBlockDeclaration (clang::DeclContext *ctx)
2044{
2045 if (ctx != nullptr)
2046 {
2047 clang::BlockDecl *decl = clang::BlockDecl::Create(*getASTContext(), ctx, clang::SourceLocation());
2048 ctx->addDecl(decl);
2049 return decl;
2050 }
2051 return nullptr;
2052}
2053
Paul Hermanea188fc2015-09-16 18:48:30 +00002054clang::DeclContext *
2055FindLCABetweenDecls(clang::DeclContext *left, clang::DeclContext *right, clang::DeclContext *root)
2056{
2057 if (root == nullptr)
2058 return nullptr;
2059
2060 std::set<clang::DeclContext *> path_left;
2061 for (clang::DeclContext *d = left; d != nullptr; d = d->getParent())
2062 path_left.insert(d);
2063
2064 for (clang::DeclContext *d = right; d != nullptr; d = d->getParent())
2065 if (path_left.find(d) != path_left.end())
2066 return d;
2067
2068 return nullptr;
2069}
2070
Paul Hermand628cbb2015-09-15 23:44:17 +00002071clang::UsingDirectiveDecl *
2072ClangASTContext::CreateUsingDirectiveDeclaration (clang::DeclContext *decl_ctx, clang::NamespaceDecl *ns_decl)
2073{
2074 if (decl_ctx != nullptr && ns_decl != nullptr)
2075 {
Paul Hermanea188fc2015-09-16 18:48:30 +00002076 clang::TranslationUnitDecl *translation_unit = (clang::TranslationUnitDecl *)GetTranslationUnitDecl(getASTContext());
Paul Hermand628cbb2015-09-15 23:44:17 +00002077 clang::UsingDirectiveDecl *using_decl = clang::UsingDirectiveDecl::Create(*getASTContext(),
2078 decl_ctx,
2079 clang::SourceLocation(),
2080 clang::SourceLocation(),
2081 clang::NestedNameSpecifierLoc(),
2082 clang::SourceLocation(),
2083 ns_decl,
Paul Hermanea188fc2015-09-16 18:48:30 +00002084 FindLCABetweenDecls(decl_ctx, ns_decl, translation_unit));
Paul Hermand628cbb2015-09-15 23:44:17 +00002085 decl_ctx->addDecl(using_decl);
2086 return using_decl;
2087 }
2088 return nullptr;
2089}
2090
2091clang::UsingDecl *
2092ClangASTContext::CreateUsingDeclaration (clang::DeclContext *current_decl_ctx, clang::NamedDecl *target)
2093{
2094 if (current_decl_ctx != nullptr && target != nullptr)
2095 {
2096 clang::UsingDecl *using_decl = clang::UsingDecl::Create(*getASTContext(),
2097 current_decl_ctx,
2098 clang::SourceLocation(),
2099 clang::NestedNameSpecifierLoc(),
2100 clang::DeclarationNameInfo(),
2101 false);
2102 clang::UsingShadowDecl *shadow_decl = clang::UsingShadowDecl::Create(*getASTContext(),
2103 current_decl_ctx,
2104 clang::SourceLocation(),
2105 using_decl,
2106 target);
2107 using_decl->addShadowDecl(shadow_decl);
2108 current_decl_ctx->addDecl(using_decl);
2109 return using_decl;
2110 }
2111 return nullptr;
2112}
2113
2114clang::VarDecl *
2115ClangASTContext::CreateVariableDeclaration (clang::DeclContext *decl_context, const char *name, clang::QualType type)
2116{
2117 if (decl_context != nullptr)
2118 {
2119 clang::VarDecl *var_decl = clang::VarDecl::Create(*getASTContext(),
2120 decl_context,
2121 clang::SourceLocation(),
2122 clang::SourceLocation(),
2123 name && name[0] ? &getASTContext()->Idents.getOwn(name) : nullptr,
2124 type,
2125 nullptr,
2126 clang::SC_None);
2127 var_decl->setAccess(clang::AS_public);
2128 decl_context->addDecl(var_decl);
Paul Hermand628cbb2015-09-15 23:44:17 +00002129 return var_decl;
2130 }
2131 return nullptr;
2132}
2133
Zachary Turner9d8a97e2016-04-01 23:20:35 +00002134lldb::opaque_compiler_type_t
2135ClangASTContext::GetOpaqueCompilerType(clang::ASTContext *ast, lldb::BasicType basic_type)
2136{
2137 switch (basic_type)
2138 {
2139 case eBasicTypeVoid:
2140 return ast->VoidTy.getAsOpaquePtr();
2141 case eBasicTypeChar:
2142 return ast->CharTy.getAsOpaquePtr();
2143 case eBasicTypeSignedChar:
2144 return ast->SignedCharTy.getAsOpaquePtr();
2145 case eBasicTypeUnsignedChar:
2146 return ast->UnsignedCharTy.getAsOpaquePtr();
2147 case eBasicTypeWChar:
2148 return ast->getWCharType().getAsOpaquePtr();
2149 case eBasicTypeSignedWChar:
2150 return ast->getSignedWCharType().getAsOpaquePtr();
2151 case eBasicTypeUnsignedWChar:
2152 return ast->getUnsignedWCharType().getAsOpaquePtr();
2153 case eBasicTypeChar16:
2154 return ast->Char16Ty.getAsOpaquePtr();
2155 case eBasicTypeChar32:
2156 return ast->Char32Ty.getAsOpaquePtr();
2157 case eBasicTypeShort:
2158 return ast->ShortTy.getAsOpaquePtr();
2159 case eBasicTypeUnsignedShort:
2160 return ast->UnsignedShortTy.getAsOpaquePtr();
2161 case eBasicTypeInt:
2162 return ast->IntTy.getAsOpaquePtr();
2163 case eBasicTypeUnsignedInt:
2164 return ast->UnsignedIntTy.getAsOpaquePtr();
2165 case eBasicTypeLong:
2166 return ast->LongTy.getAsOpaquePtr();
2167 case eBasicTypeUnsignedLong:
2168 return ast->UnsignedLongTy.getAsOpaquePtr();
2169 case eBasicTypeLongLong:
2170 return ast->LongLongTy.getAsOpaquePtr();
2171 case eBasicTypeUnsignedLongLong:
2172 return ast->UnsignedLongLongTy.getAsOpaquePtr();
2173 case eBasicTypeInt128:
2174 return ast->Int128Ty.getAsOpaquePtr();
2175 case eBasicTypeUnsignedInt128:
2176 return ast->UnsignedInt128Ty.getAsOpaquePtr();
2177 case eBasicTypeBool:
2178 return ast->BoolTy.getAsOpaquePtr();
2179 case eBasicTypeHalf:
2180 return ast->HalfTy.getAsOpaquePtr();
2181 case eBasicTypeFloat:
2182 return ast->FloatTy.getAsOpaquePtr();
2183 case eBasicTypeDouble:
2184 return ast->DoubleTy.getAsOpaquePtr();
2185 case eBasicTypeLongDouble:
2186 return ast->LongDoubleTy.getAsOpaquePtr();
2187 case eBasicTypeFloatComplex:
2188 return ast->FloatComplexTy.getAsOpaquePtr();
2189 case eBasicTypeDoubleComplex:
2190 return ast->DoubleComplexTy.getAsOpaquePtr();
2191 case eBasicTypeLongDoubleComplex:
2192 return ast->LongDoubleComplexTy.getAsOpaquePtr();
2193 case eBasicTypeObjCID:
2194 return ast->getObjCIdType().getAsOpaquePtr();
2195 case eBasicTypeObjCClass:
2196 return ast->getObjCClassType().getAsOpaquePtr();
2197 case eBasicTypeObjCSel:
2198 return ast->getObjCSelType().getAsOpaquePtr();
2199 case eBasicTypeNullPtr:
2200 return ast->NullPtrTy.getAsOpaquePtr();
2201 default:
2202 return nullptr;
2203 }
2204}
2205
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002206#pragma mark Function Types
2207
Pavel Labath1ac2b202016-08-15 14:32:32 +00002208clang::DeclarationName
2209ClangASTContext::GetDeclarationName(const char *name, const CompilerType &function_clang_type)
2210{
2211 if (!name || !name[0])
2212 return clang::DeclarationName();
2213
2214 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
2215 if (!IsOperator(name, op_kind) || op_kind == clang::NUM_OVERLOADED_OPERATORS)
2216 return DeclarationName(&getASTContext()->Idents.get(name)); // Not operator, but a regular function.
2217
2218 // Check the number of operator parameters. Sometimes we have
2219 // seen bad DWARF that doesn't correctly describe operators and
2220 // if we try to create a method and add it to the class, clang
2221 // will assert and crash, so we need to make sure things are
2222 // acceptable.
2223 clang::QualType method_qual_type(ClangUtil::GetQualType(function_clang_type));
2224 const clang::FunctionProtoType *function_type =
2225 llvm::dyn_cast<clang::FunctionProtoType>(method_qual_type.getTypePtr());
2226 if (function_type == nullptr)
2227 return clang::DeclarationName();
2228
2229 const bool is_method = false;
2230 const unsigned int num_params = function_type->getNumParams();
2231 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount(is_method, op_kind, num_params))
2232 return clang::DeclarationName();
2233
2234 return getASTContext()->DeclarationNames.getCXXOperatorName(op_kind);
2235}
2236
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002237FunctionDecl *
Greg Clayton57ee3062013-07-11 22:46:58 +00002238ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
2239 const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002240 const CompilerType &function_clang_type,
Greg Clayton57ee3062013-07-11 22:46:58 +00002241 int storage,
2242 bool is_inline)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002243{
Ed Masted4612ad2014-04-20 13:17:36 +00002244 FunctionDecl *func_decl = nullptr;
Greg Clayton147e1fa2011-10-14 22:47:18 +00002245 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002246 if (decl_ctx == nullptr)
Greg Clayton147e1fa2011-10-14 22:47:18 +00002247 decl_ctx = ast->getTranslationUnitDecl();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002248
Greg Clayton0d551042013-06-28 21:08:47 +00002249
2250 const bool hasWrittenPrototype = true;
2251 const bool isConstexprSpecified = false;
2252
Pavel Labath1ac2b202016-08-15 14:32:32 +00002253 clang::DeclarationName declarationName = GetDeclarationName(name, function_clang_type);
2254 func_decl = FunctionDecl::Create(*ast, decl_ctx, SourceLocation(), SourceLocation(), declarationName,
2255 ClangUtil::GetQualType(function_clang_type), nullptr, (clang::StorageClass)storage,
2256 is_inline, hasWrittenPrototype, isConstexprSpecified);
Greg Clayton147e1fa2011-10-14 22:47:18 +00002257 if (func_decl)
2258 decl_ctx->addDecl (func_decl);
Sean Callanan5e9e1992011-10-26 01:06:27 +00002259
2260#ifdef LLDB_CONFIGURATION_DEBUG
2261 VerifyDecl(func_decl);
2262#endif
2263
Greg Clayton147e1fa2011-10-14 22:47:18 +00002264 return func_decl;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002265}
2266
Greg Claytona1e5dc82015-08-11 22:53:00 +00002267CompilerType
Greg Clayton6beaaa62011-01-17 03:46:26 +00002268ClangASTContext::CreateFunctionType (ASTContext *ast,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002269 const CompilerType& result_type,
2270 const CompilerType *args,
Sean Callananc81256a2010-09-16 20:40:25 +00002271 unsigned num_args,
2272 bool is_variadic,
2273 unsigned type_quals)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002274{
Greg Claytonceeb5212016-05-26 22:33:25 +00002275 if (ast == nullptr)
2276 return CompilerType(); // invalid AST
2277
2278 if (!result_type || !ClangUtil::IsClangType(result_type))
2279 return CompilerType(); // invalid return type
2280
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002281 std::vector<QualType> qual_type_args;
Greg Claytonceeb5212016-05-26 22:33:25 +00002282 if (num_args > 0 && args == nullptr)
2283 return CompilerType(); // invalid argument array passed in
2284
2285 // Verify that all arguments are valid and the right type
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002286 for (unsigned i=0; i<num_args; ++i)
Greg Claytonceeb5212016-05-26 22:33:25 +00002287 {
2288 if (args[i])
2289 {
2290 // Make sure we have a clang type in args[i] and not a type from another
2291 // language whose name might match
2292 const bool is_clang_type = ClangUtil::IsClangType(args[i]);
2293 lldbassert(is_clang_type);
2294 if (is_clang_type)
2295 qual_type_args.push_back(ClangUtil::GetQualType(args[i]));
2296 else
2297 return CompilerType(); // invalid argument type (must be a clang type)
2298 }
2299 else
2300 return CompilerType(); // invalid argument type (empty)
2301 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002302
2303 // TODO: Detect calling convention in DWARF?
Sean Callanan2c777c42011-01-18 23:32:05 +00002304 FunctionProtoType::ExtProtoInfo proto_info;
2305 proto_info.Variadic = is_variadic;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002306 proto_info.ExceptionSpec = EST_None;
Sean Callanan2c777c42011-01-18 23:32:05 +00002307 proto_info.TypeQuals = type_quals;
Sean Callananfb0b7582011-03-15 00:17:19 +00002308 proto_info.RefQualifier = RQ_None;
Sylvestre Ledru186ca7d2014-08-01 12:19:15 +00002309
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002310 return CompilerType(ast, ast->getFunctionType(ClangUtil::GetQualType(result_type), qual_type_args, proto_info));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002311}
2312
2313ParmVarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00002314ClangASTContext::CreateParameterDeclaration (const char *name, const CompilerType &param_type, int storage)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002315{
Greg Clayton6beaaa62011-01-17 03:46:26 +00002316 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002317 assert (ast != nullptr);
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002318 return ParmVarDecl::Create(*ast, ast->getTranslationUnitDecl(), SourceLocation(), SourceLocation(),
2319 name && name[0] ? &ast->Idents.get(name) : nullptr, ClangUtil::GetQualType(param_type),
2320 nullptr, (clang::StorageClass)storage, nullptr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002321}
2322
2323void
2324ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
2325{
2326 if (function_decl)
Sean Callanan880e6802011-10-07 23:18:13 +00002327 function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002328}
2329
Sean Callananc530ba92016-05-02 21:15:31 +00002330CompilerType
2331ClangASTContext::CreateBlockPointerType (const CompilerType &function_type)
2332{
2333 QualType block_type = m_ast_ap->getBlockPointerType(clang::QualType::getFromOpaquePtr(function_type.GetOpaqueQualType()));
2334
2335 return CompilerType (this, block_type.getAsOpaquePtr());
2336}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002337
2338#pragma mark Array Types
2339
Greg Claytona1e5dc82015-08-11 22:53:00 +00002340CompilerType
2341ClangASTContext::CreateArrayType (const CompilerType &element_type,
Greg Clayton1c8ef472013-04-05 23:27:21 +00002342 size_t element_count,
2343 bool is_vector)
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002344{
Greg Clayton57ee3062013-07-11 22:46:58 +00002345 if (element_type.IsValid())
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002346 {
Greg Clayton6beaaa62011-01-17 03:46:26 +00002347 ASTContext *ast = getASTContext();
Ed Masted4612ad2014-04-20 13:17:36 +00002348 assert (ast != nullptr);
Greg Clayton4ef877f2012-12-06 02:33:54 +00002349
Greg Clayton1c8ef472013-04-05 23:27:21 +00002350 if (is_vector)
2351 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002352 return CompilerType(ast, ast->getExtVectorType(ClangUtil::GetQualType(element_type), element_count));
Greg Clayton4ef877f2012-12-06 02:33:54 +00002353 }
2354 else
2355 {
Greg Clayton1c8ef472013-04-05 23:27:21 +00002356
2357 llvm::APInt ap_element_count (64, element_count);
2358 if (element_count == 0)
2359 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002360 return CompilerType(ast, ast->getIncompleteArrayType(ClangUtil::GetQualType(element_type),
2361 clang::ArrayType::Normal, 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002362 }
2363 else
2364 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002365 return CompilerType(ast, ast->getConstantArrayType(ClangUtil::GetQualType(element_type),
2366 ap_element_count, clang::ArrayType::Normal, 0));
Greg Clayton1c8ef472013-04-05 23:27:21 +00002367 }
Greg Clayton4ef877f2012-12-06 02:33:54 +00002368 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002369 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002370 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002371}
2372
Greg Claytona1e5dc82015-08-11 22:53:00 +00002373CompilerType
Sean Callananc530ba92016-05-02 21:15:31 +00002374ClangASTContext::CreateStructForIdentifier (const ConstString &type_name,
2375 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
2376 bool packed)
Enrico Granata76b08d52014-10-29 23:08:02 +00002377{
Greg Claytona1e5dc82015-08-11 22:53:00 +00002378 CompilerType type;
Sean Callananc530ba92016-05-02 21:15:31 +00002379 if (!type_name.IsEmpty() && (type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2380 {
2381 lldbassert("Trying to create a type for an existing name");
Enrico Granata76b08d52014-10-29 23:08:02 +00002382 return type;
Sean Callananc530ba92016-05-02 21:15:31 +00002383 }
2384
Enrico Granata76b08d52014-10-29 23:08:02 +00002385 type = CreateRecordType(nullptr, lldb::eAccessPublic, type_name.GetCString(), clang::TTK_Struct, lldb::eLanguageTypeC);
Greg Claytond8d4a572015-08-11 21:38:15 +00002386 StartTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002387 for (const auto& field : type_fields)
Greg Claytond8d4a572015-08-11 21:38:15 +00002388 AddFieldToRecordType(type, field.first, field.second, lldb::eAccessPublic, 0);
Enrico Granataa449e862014-10-30 00:53:28 +00002389 if (packed)
Greg Claytond8d4a572015-08-11 21:38:15 +00002390 SetIsPacked(type);
2391 CompleteTagDeclarationDefinition(type);
Enrico Granata76b08d52014-10-29 23:08:02 +00002392 return type;
2393}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002394
Sean Callananc530ba92016-05-02 21:15:31 +00002395CompilerType
2396ClangASTContext::GetOrCreateStructForIdentifier (const ConstString &type_name,
2397 const std::initializer_list< std::pair < const char *, CompilerType > >& type_fields,
2398 bool packed)
2399{
2400 CompilerType type;
2401 if ((type = GetTypeForIdentifier<clang::CXXRecordDecl>(type_name)).IsValid())
2402 return type;
2403
2404 return CreateStructForIdentifier (type_name,
2405 type_fields,
2406 packed);
2407}
2408
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002409#pragma mark Enumeration Types
2410
Greg Claytona1e5dc82015-08-11 22:53:00 +00002411CompilerType
Greg Claytond8d4a572015-08-11 21:38:15 +00002412ClangASTContext::CreateEnumerationType
Greg Claytonca512b32011-01-14 04:54:56 +00002413(
Greg Claytond8d4a572015-08-11 21:38:15 +00002414 const char *name,
2415 DeclContext *decl_ctx,
2416 const Declaration &decl,
Greg Claytona1e5dc82015-08-11 22:53:00 +00002417 const CompilerType &integer_clang_type
Greg Claytond8d4a572015-08-11 21:38:15 +00002418 )
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002419{
2420 // TODO: Do something intelligent with the Declaration object passed in
2421 // like maybe filling in the SourceLocation with it...
Greg Clayton6beaaa62011-01-17 03:46:26 +00002422 ASTContext *ast = getASTContext();
Greg Claytond8d4a572015-08-11 21:38:15 +00002423
Greg Claytone02b8502010-10-12 04:29:14 +00002424 // TODO: ask about these...
Greg Claytond8d4a572015-08-11 21:38:15 +00002425 // const bool IsScoped = false;
2426 // const bool IsFixed = false;
2427
Greg Clayton6beaaa62011-01-17 03:46:26 +00002428 EnumDecl *enum_decl = EnumDecl::Create (*ast,
Greg Claytonca512b32011-01-14 04:54:56 +00002429 decl_ctx,
Greg Claytone02b8502010-10-12 04:29:14 +00002430 SourceLocation(),
Greg Claytone02b8502010-10-12 04:29:14 +00002431 SourceLocation(),
Ed Masted4612ad2014-04-20 13:17:36 +00002432 name && name[0] ? &ast->Idents.get(name) : nullptr,
2433 nullptr,
Sean Callanan48114472010-12-13 01:26:27 +00002434 false, // IsScoped
2435 false, // IsScopedUsingClassTag
2436 false); // IsFixed
Sean Callanan2652ad22011-01-18 01:03:44 +00002437
2438
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002439 if (enum_decl)
Greg Clayton83ff3892010-09-12 23:17:56 +00002440 {
2441 // TODO: check if we should be setting the promotion type too?
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002442 enum_decl->setIntegerType(ClangUtil::GetQualType(integer_clang_type));
2443
Sean Callanan2652ad22011-01-18 01:03:44 +00002444 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
2445
Greg Claytona1e5dc82015-08-11 22:53:00 +00002446 return CompilerType (ast, ast->getTagDeclType(enum_decl));
Greg Clayton83ff3892010-09-12 23:17:56 +00002447 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002448 return CompilerType();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002449}
2450
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002451// Disable this for now since I can't seem to get a nicely formatted float
2452// out of the APFloat class without just getting the float, double or quad
2453// and then using a formatted print on it which defeats the purpose. We ideally
2454// would like to get perfect string values for any kind of float semantics
2455// so we can support remote targets. The code below also requires a patch to
2456// llvm::APInt.
2457//bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00002458//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 +00002459//{
2460// uint32_t count = 0;
2461// bool is_complex = false;
2462// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2463// {
2464// unsigned num_bytes_per_float = byte_size / count;
2465// unsigned num_bits_per_float = num_bytes_per_float * 8;
2466//
2467// float_str.clear();
2468// uint32_t i;
2469// for (i=0; i<count; i++)
2470// {
2471// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
2472// bool is_ieee = false;
2473// APFloat ap_float(ap_int, is_ieee);
2474// char s[1024];
2475// unsigned int hex_digits = 0;
2476// bool upper_case = false;
2477//
2478// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2479// {
2480// if (i > 0)
2481// float_str.append(", ");
2482// float_str.append(s);
2483// if (i == 1 && is_complex)
2484// float_str.append(1, 'i');
2485// }
2486// }
2487// return !float_str.empty();
2488// }
2489// return false;
2490//}
2491
Greg Claytona1e5dc82015-08-11 22:53:00 +00002492CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002493ClangASTContext::GetIntTypeFromBitSize (clang::ASTContext *ast,
2494 size_t bit_size, bool is_signed)
2495{
2496 if (ast)
2497 {
2498 if (is_signed)
2499 {
2500 if (bit_size == ast->getTypeSize(ast->SignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002501 return CompilerType(ast, ast->SignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002502
2503 if (bit_size == ast->getTypeSize(ast->ShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002504 return CompilerType(ast, ast->ShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002505
2506 if (bit_size == ast->getTypeSize(ast->IntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002507 return CompilerType(ast, ast->IntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002508
2509 if (bit_size == ast->getTypeSize(ast->LongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002510 return CompilerType(ast, ast->LongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002511
2512 if (bit_size == ast->getTypeSize(ast->LongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002513 return CompilerType(ast, ast->LongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002514
2515 if (bit_size == ast->getTypeSize(ast->Int128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002516 return CompilerType(ast, ast->Int128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002517 }
2518 else
2519 {
2520 if (bit_size == ast->getTypeSize(ast->UnsignedCharTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002521 return CompilerType(ast, ast->UnsignedCharTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002522
2523 if (bit_size == ast->getTypeSize(ast->UnsignedShortTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002524 return CompilerType(ast, ast->UnsignedShortTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002525
2526 if (bit_size == ast->getTypeSize(ast->UnsignedIntTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002527 return CompilerType(ast, ast->UnsignedIntTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002528
2529 if (bit_size == ast->getTypeSize(ast->UnsignedLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002530 return CompilerType(ast, ast->UnsignedLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002531
2532 if (bit_size == ast->getTypeSize(ast->UnsignedLongLongTy))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002533 return CompilerType(ast, ast->UnsignedLongLongTy);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002534
2535 if (bit_size == ast->getTypeSize(ast->UnsignedInt128Ty))
Greg Claytona1e5dc82015-08-11 22:53:00 +00002536 return CompilerType(ast, ast->UnsignedInt128Ty);
Enrico Granatae8bf7492014-08-15 23:00:02 +00002537 }
2538 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00002539 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002540}
2541
Greg Claytona1e5dc82015-08-11 22:53:00 +00002542CompilerType
Enrico Granatae8bf7492014-08-15 23:00:02 +00002543ClangASTContext::GetPointerSizedIntType (clang::ASTContext *ast, bool is_signed)
2544{
2545 if (ast)
2546 return GetIntTypeFromBitSize(ast, ast->getTypeSize(ast->VoidPtrTy), is_signed);
Greg Claytona1e5dc82015-08-11 22:53:00 +00002547 return CompilerType();
Enrico Granatae8bf7492014-08-15 23:00:02 +00002548}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002549
Greg Claytone6b36cd2015-12-08 01:02:08 +00002550void
2551ClangASTContext::DumpDeclContextHiearchy (clang::DeclContext *decl_ctx)
2552{
2553 if (decl_ctx)
2554 {
2555 DumpDeclContextHiearchy (decl_ctx->getParent());
2556
2557 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl_ctx);
2558 if (named_decl)
2559 {
2560 printf ("%20s: %s\n", decl_ctx->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2561 }
2562 else
2563 {
2564 printf ("%20s\n", decl_ctx->getDeclKindName());
2565 }
2566 }
2567}
2568
2569void
2570ClangASTContext::DumpDeclHiearchy (clang::Decl *decl)
2571{
2572 if (decl == nullptr)
2573 return;
2574 DumpDeclContextHiearchy(decl->getDeclContext());
2575
2576 clang::RecordDecl *record_decl = llvm::dyn_cast<clang::RecordDecl>(decl);
2577 if (record_decl)
2578 {
2579 printf ("%20s: %s%s\n", decl->getDeclKindName(), record_decl->getDeclName().getAsString().c_str(), record_decl->isInjectedClassName() ? " (injected class name)" : "");
2580
2581 }
2582 else
2583 {
2584 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>(decl);
2585 if (named_decl)
2586 {
2587 printf ("%20s: %s\n", decl->getDeclKindName(), named_decl->getDeclName().getAsString().c_str());
2588 }
2589 else
2590 {
2591 printf ("%20s\n", decl->getDeclKindName());
2592 }
2593 }
2594}
2595
2596bool
2597ClangASTContext::DeclsAreEquivalent (clang::Decl *lhs_decl, clang::Decl *rhs_decl)
2598{
2599 if (lhs_decl && rhs_decl)
2600 {
2601 //----------------------------------------------------------------------
2602 // Make sure the decl kinds match first
2603 //----------------------------------------------------------------------
2604 const clang::Decl::Kind lhs_decl_kind = lhs_decl->getKind();
2605 const clang::Decl::Kind rhs_decl_kind = rhs_decl->getKind();
2606
2607 if (lhs_decl_kind == rhs_decl_kind)
2608 {
2609 //------------------------------------------------------------------
2610 // Now check that the decl contexts kinds are all equivalent
2611 // before we have to check any names of the decl contexts...
2612 //------------------------------------------------------------------
2613 clang::DeclContext *lhs_decl_ctx = lhs_decl->getDeclContext();
2614 clang::DeclContext *rhs_decl_ctx = rhs_decl->getDeclContext();
2615 if (lhs_decl_ctx && rhs_decl_ctx)
2616 {
2617 while (1)
2618 {
2619 if (lhs_decl_ctx && rhs_decl_ctx)
2620 {
2621 const clang::Decl::Kind lhs_decl_ctx_kind = lhs_decl_ctx->getDeclKind();
2622 const clang::Decl::Kind rhs_decl_ctx_kind = rhs_decl_ctx->getDeclKind();
2623 if (lhs_decl_ctx_kind == rhs_decl_ctx_kind)
2624 {
2625 lhs_decl_ctx = lhs_decl_ctx->getParent();
2626 rhs_decl_ctx = rhs_decl_ctx->getParent();
2627
2628 if (lhs_decl_ctx == nullptr && rhs_decl_ctx == nullptr)
2629 break;
2630 }
2631 else
2632 return false;
2633 }
2634 else
2635 return false;
2636 }
2637
2638 //--------------------------------------------------------------
2639 // Now make sure the name of the decls match
2640 //--------------------------------------------------------------
2641 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl);
2642 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl);
2643 if (lhs_named_decl && rhs_named_decl)
2644 {
2645 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2646 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2647 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2648 {
2649 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2650 return false;
2651 }
2652 else
2653 return false;
2654 }
2655 else
2656 return false;
2657
2658 //--------------------------------------------------------------
2659 // We know that the decl context kinds all match, so now we need
2660 // to make sure the names match as well
2661 //--------------------------------------------------------------
2662 lhs_decl_ctx = lhs_decl->getDeclContext();
2663 rhs_decl_ctx = rhs_decl->getDeclContext();
2664 while (1)
2665 {
2666 switch (lhs_decl_ctx->getDeclKind())
2667 {
2668 case clang::Decl::TranslationUnit:
2669 // We don't care about the translation unit names
2670 return true;
2671 default:
2672 {
2673 clang::NamedDecl *lhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(lhs_decl_ctx);
2674 clang::NamedDecl *rhs_named_decl = llvm::dyn_cast<clang::NamedDecl>(rhs_decl_ctx);
2675 if (lhs_named_decl && rhs_named_decl)
2676 {
2677 clang::DeclarationName lhs_decl_name = lhs_named_decl->getDeclName();
2678 clang::DeclarationName rhs_decl_name = rhs_named_decl->getDeclName();
2679 if (lhs_decl_name.getNameKind() == rhs_decl_name.getNameKind())
2680 {
2681 if (lhs_decl_name.getAsString() != rhs_decl_name.getAsString())
2682 return false;
2683 }
2684 else
2685 return false;
2686 }
2687 else
2688 return false;
2689 }
2690 break;
2691
2692 }
2693 lhs_decl_ctx = lhs_decl_ctx->getParent();
2694 rhs_decl_ctx = rhs_decl_ctx->getParent();
2695 }
2696 }
2697 }
2698 }
2699 return false;
2700}
Enrico Granata86027e92012-03-24 01:11:14 +00002701bool
Greg Claytona2721472011-06-25 00:44:06 +00002702ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2703 clang::Decl *decl)
2704{
2705 if (!decl)
2706 return false;
2707
2708 ExternalASTSource *ast_source = ast->getExternalSource();
2709
2710 if (!ast_source)
2711 return false;
2712
2713 if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2714 {
Greg Clayton219cf312012-03-30 00:51:13 +00002715 if (tag_decl->isCompleteDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002716 return true;
2717
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00002718 if (!tag_decl->hasExternalLexicalStorage())
2719 return false;
2720
Greg Claytona2721472011-06-25 00:44:06 +00002721 ast_source->CompleteType(tag_decl);
2722
2723 return !tag_decl->getTypeForDecl()->isIncompleteType();
2724 }
2725 else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2726 {
Sean Callanan5b26f272012-02-04 08:49:35 +00002727 if (objc_interface_decl->getDefinition())
Greg Claytona2721472011-06-25 00:44:06 +00002728 return true;
2729
2730 if (!objc_interface_decl->hasExternalLexicalStorage())
2731 return false;
2732
2733 ast_source->CompleteType(objc_interface_decl);
2734
Sean Callanan5b26f272012-02-04 08:49:35 +00002735 return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
Greg Claytona2721472011-06-25 00:44:06 +00002736 }
2737 else
2738 {
2739 return false;
2740 }
2741}
2742
Sean Callanan60217122012-04-13 00:10:03 +00002743void
Greg Claytond0029442013-03-27 01:48:02 +00002744ClangASTContext::SetMetadataAsUserID (const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002745 user_id_t user_id)
2746{
2747 ClangASTMetadata meta_data;
2748 meta_data.SetUserID (user_id);
2749 SetMetadata (object, meta_data);
2750}
2751
2752void
Sean Callanan60217122012-04-13 00:10:03 +00002753ClangASTContext::SetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002754 const void *object,
Jim Ingham379397632012-10-27 02:54:13 +00002755 ClangASTMetadata &metadata)
Sean Callanan60217122012-04-13 00:10:03 +00002756{
2757 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002758 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002759
2760 if (external_source)
2761 external_source->SetMetadata(object, metadata);
2762}
2763
Jim Ingham379397632012-10-27 02:54:13 +00002764ClangASTMetadata *
Sean Callanan60217122012-04-13 00:10:03 +00002765ClangASTContext::GetMetadata (clang::ASTContext *ast,
Greg Claytond0029442013-03-27 01:48:02 +00002766 const void *object)
Sean Callanan60217122012-04-13 00:10:03 +00002767{
2768 ClangExternalASTSourceCommon *external_source =
Sean Callananceeb74e2014-12-06 01:03:30 +00002769 ClangExternalASTSourceCommon::Lookup(ast->getExternalSource());
Sean Callanan60217122012-04-13 00:10:03 +00002770
2771 if (external_source && external_source->HasMetadata(object))
2772 return external_source->GetMetadata(object);
2773 else
Ed Masted4612ad2014-04-20 13:17:36 +00002774 return nullptr;
Sean Callanan60217122012-04-13 00:10:03 +00002775}
2776
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002777clang::DeclContext *
2778ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2779{
Sean Callanana87bee82011-08-19 06:19:25 +00002780 return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002781}
2782
2783clang::DeclContext *
2784ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2785{
Sean Callanana87bee82011-08-19 06:19:25 +00002786 return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
Greg Clayton2c5f0e92011-08-04 21:02:57 +00002787}
2788
Greg Claytond8d4a572015-08-11 21:38:15 +00002789bool
2790ClangASTContext::SetTagTypeKind (clang::QualType tag_qual_type, int kind) const
2791{
2792 const clang::Type *clang_type = tag_qual_type.getTypePtr();
2793 if (clang_type)
2794 {
2795 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(clang_type);
2796 if (tag_type)
2797 {
2798 clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(tag_type->getDecl());
2799 if (tag_decl)
2800 {
2801 tag_decl->setTagKind ((clang::TagDecl::TagKind)kind);
2802 return true;
2803 }
2804 }
2805 }
2806 return false;
2807}
2808
2809
2810bool
2811ClangASTContext::SetDefaultAccessForRecordFields (clang::RecordDecl* record_decl,
2812 int default_accessibility,
2813 int *assigned_accessibilities,
2814 size_t num_assigned_accessibilities)
2815{
2816 if (record_decl)
2817 {
2818 uint32_t field_idx;
2819 clang::RecordDecl::field_iterator field, field_end;
2820 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
2821 field != field_end;
2822 ++field, ++field_idx)
2823 {
2824 // If no accessibility was assigned, assign the correct one
2825 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
2826 field->setAccess ((clang::AccessSpecifier)default_accessibility);
2827 }
2828 return true;
2829 }
2830 return false;
2831}
2832
2833clang::DeclContext *
Greg Clayton99558cc42015-08-24 23:46:31 +00002834ClangASTContext::GetDeclContextForType (const CompilerType& type)
2835{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00002836 return GetDeclContextForType(ClangUtil::GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00002837}
2838
2839clang::DeclContext *
Greg Claytond8d4a572015-08-11 21:38:15 +00002840ClangASTContext::GetDeclContextForType (clang::QualType type)
2841{
2842 if (type.isNull())
2843 return nullptr;
2844
2845 clang::QualType qual_type = type.getCanonicalType();
2846 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2847 switch (type_class)
2848 {
Greg Claytond8d4a572015-08-11 21:38:15 +00002849 case clang::Type::ObjCInterface: return llvm::cast<clang::ObjCObjectType>(qual_type.getTypePtr())->getInterface();
2850 case clang::Type::ObjCObjectPointer: return GetDeclContextForType (llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
2851 case clang::Type::Record: return llvm::cast<clang::RecordType>(qual_type)->getDecl();
2852 case clang::Type::Enum: return llvm::cast<clang::EnumType>(qual_type)->getDecl();
2853 case clang::Type::Typedef: return GetDeclContextForType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00002854 case clang::Type::Auto: return GetDeclContextForType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00002855 case clang::Type::Elaborated: return GetDeclContextForType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
2856 case clang::Type::Paren: return GetDeclContextForType (llvm::cast<clang::ParenType>(qual_type)->desugar());
Greg Clayton99558cc42015-08-24 23:46:31 +00002857 default:
2858 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002859 }
2860 // No DeclContext in this type...
2861 return nullptr;
2862}
2863
2864static bool
2865GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
2866{
2867 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
2868 switch (type_class)
2869 {
2870 case clang::Type::ConstantArray:
2871 case clang::Type::IncompleteArray:
2872 case clang::Type::VariableArray:
Greg Claytond8d4a572015-08-11 21:38:15 +00002873 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002874 const clang::ArrayType *array_type = llvm::dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
2875
2876 if (array_type)
2877 return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
2878 }
2879 break;
2880 case clang::Type::Record:
2881 {
2882 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
2883 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002884 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002885 if (cxx_record_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002886 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002887 const bool is_complete = cxx_record_decl->isCompleteDefinition();
2888 const bool fields_loaded = cxx_record_decl->hasLoadedFieldsFromExternalStorage();
2889 if (is_complete && fields_loaded)
2890 return true;
2891
2892 if (!allow_completion)
2893 return false;
2894
2895 // Call the field_begin() accessor to for it to use the external source
2896 // to load the fields...
2897 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2898 if (external_ast_source)
Greg Claytond8d4a572015-08-11 21:38:15 +00002899 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002900 external_ast_source->CompleteType(cxx_record_decl);
2901 if (cxx_record_decl->isCompleteDefinition())
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002902 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002903 cxx_record_decl->field_begin();
Jim Inghamc44644d2016-05-04 00:06:23 +00002904 cxx_record_decl->setHasLoadedFieldsFromExternalStorage (true);
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002905 }
2906 }
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002907 }
2908 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002909 const clang::TagType *tag_type = llvm::cast<clang::TagType>(qual_type.getTypePtr());
2910 return !tag_type->isIncompleteType();
Greg Clayton5dfc4a42015-12-02 00:43:32 +00002911 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002912 break;
Greg Claytone6b36cd2015-12-08 01:02:08 +00002913
2914 case clang::Type::Enum:
2915 {
2916 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
2917 if (tag_type)
2918 {
2919 clang::TagDecl *tag_decl = tag_type->getDecl();
2920 if (tag_decl)
2921 {
2922 if (tag_decl->getDefinition())
2923 return true;
2924
2925 if (!allow_completion)
2926 return false;
2927
2928 if (tag_decl->hasExternalLexicalStorage())
2929 {
2930 if (ast)
2931 {
2932 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2933 if (external_ast_source)
2934 {
2935 external_ast_source->CompleteType(tag_decl);
2936 return !tag_type->isIncompleteType();
2937 }
2938 }
2939 }
2940 return false;
2941 }
2942 }
2943
2944 }
2945 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00002946 case clang::Type::ObjCObject:
2947 case clang::Type::ObjCInterface:
Greg Claytond8d4a572015-08-11 21:38:15 +00002948 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002949 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
2950 if (objc_class_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00002951 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002952 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
2953 // We currently can't complete objective C types through the newly added ASTContext
2954 // because it only supports TagDecl objects right now...
2955 if (class_interface_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00002956 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002957 if (class_interface_decl->getDefinition())
2958 return true;
2959
2960 if (!allow_completion)
2961 return false;
2962
2963 if (class_interface_decl->hasExternalLexicalStorage())
Greg Claytond8d4a572015-08-11 21:38:15 +00002964 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002965 if (ast)
Greg Claytond8d4a572015-08-11 21:38:15 +00002966 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00002967 clang::ExternalASTSource *external_ast_source = ast->getExternalSource();
2968 if (external_ast_source)
2969 {
2970 external_ast_source->CompleteType (class_interface_decl);
2971 return !objc_class_type->isIncompleteType();
2972 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002973 }
2974 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00002975 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00002976 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002977 }
2978 }
Greg Claytond8d4a572015-08-11 21:38:15 +00002979 break;
2980
2981 case clang::Type::Typedef:
2982 return GetCompleteQualType (ast, llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
2983
Enrico Granata36f51e42015-12-18 22:41:25 +00002984 case clang::Type::Auto:
2985 return GetCompleteQualType (ast, llvm::cast<clang::AutoType>(qual_type)->getDeducedType(), allow_completion);
2986
Greg Claytond8d4a572015-08-11 21:38:15 +00002987 case clang::Type::Elaborated:
2988 return GetCompleteQualType (ast, llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType(), allow_completion);
2989
2990 case clang::Type::Paren:
2991 return GetCompleteQualType (ast, llvm::cast<clang::ParenType>(qual_type)->desugar(), allow_completion);
Greg Claytone6b36cd2015-12-08 01:02:08 +00002992
2993 case clang::Type::Attributed:
2994 return GetCompleteQualType (ast, llvm::cast<clang::AttributedType>(qual_type)->getModifiedType(), allow_completion);
2995
Greg Claytond8d4a572015-08-11 21:38:15 +00002996 default:
2997 break;
2998 }
2999
3000 return true;
3001}
3002
3003static clang::ObjCIvarDecl::AccessControl
3004ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
3005{
3006 switch (access)
3007 {
3008 case eAccessNone: return clang::ObjCIvarDecl::None;
3009 case eAccessPublic: return clang::ObjCIvarDecl::Public;
3010 case eAccessPrivate: return clang::ObjCIvarDecl::Private;
3011 case eAccessProtected: return clang::ObjCIvarDecl::Protected;
3012 case eAccessPackage: return clang::ObjCIvarDecl::Package;
3013 }
3014 return clang::ObjCIvarDecl::None;
3015}
3016
3017
3018//----------------------------------------------------------------------
3019// Tests
3020//----------------------------------------------------------------------
3021
3022bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003023ClangASTContext::IsAggregateType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003024{
3025 clang::QualType qual_type (GetCanonicalQualType(type));
3026
3027 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3028 switch (type_class)
3029 {
3030 case clang::Type::IncompleteArray:
3031 case clang::Type::VariableArray:
3032 case clang::Type::ConstantArray:
3033 case clang::Type::ExtVector:
3034 case clang::Type::Vector:
3035 case clang::Type::Record:
3036 case clang::Type::ObjCObject:
3037 case clang::Type::ObjCInterface:
3038 return true;
Enrico Granata36f51e42015-12-18 22:41:25 +00003039 case clang::Type::Auto:
3040 return IsAggregateType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003041 case clang::Type::Elaborated:
3042 return IsAggregateType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3043 case clang::Type::Typedef:
3044 return IsAggregateType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3045 case clang::Type::Paren:
3046 return IsAggregateType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3047 default:
3048 break;
3049 }
3050 // The clang type does have a value
3051 return false;
3052}
3053
3054bool
Enrico Granata7123e2b2015-11-07 02:06:57 +00003055ClangASTContext::IsAnonymousType (lldb::opaque_compiler_type_t type)
3056{
3057 clang::QualType qual_type (GetCanonicalQualType(type));
3058
3059 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3060 switch (type_class)
3061 {
3062 case clang::Type::Record:
3063 {
3064 if (const clang::RecordType *record_type = llvm::dyn_cast_or_null<clang::RecordType>(qual_type.getTypePtrOrNull()))
3065 {
3066 if (const clang::RecordDecl *record_decl = record_type->getDecl())
3067 {
3068 return record_decl->isAnonymousStructOrUnion();
3069 }
3070 }
3071 break;
3072 }
Enrico Granata36f51e42015-12-18 22:41:25 +00003073 case clang::Type::Auto:
3074 return IsAnonymousType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Enrico Granata7123e2b2015-11-07 02:06:57 +00003075 case clang::Type::Elaborated:
3076 return IsAnonymousType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3077 case clang::Type::Typedef:
3078 return IsAnonymousType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
3079 case clang::Type::Paren:
3080 return IsAnonymousType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3081 default:
3082 break;
3083 }
3084 // The clang type does have a value
3085 return false;
3086}
3087
3088bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003089ClangASTContext::IsArrayType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00003090 CompilerType *element_type_ptr,
Greg Claytond8d4a572015-08-11 21:38:15 +00003091 uint64_t *size,
3092 bool *is_incomplete)
3093{
3094 clang::QualType qual_type (GetCanonicalQualType(type));
3095
3096 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3097 switch (type_class)
3098 {
3099 default:
3100 break;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003101
Greg Claytond8d4a572015-08-11 21:38:15 +00003102 case clang::Type::ConstantArray:
3103 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00003104 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::ConstantArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003105 if (size)
3106 *size = llvm::cast<clang::ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003107 if (is_incomplete)
3108 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00003109 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003110
Greg Claytond8d4a572015-08-11 21:38:15 +00003111 case clang::Type::IncompleteArray:
3112 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00003113 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::IncompleteArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003114 if (size)
3115 *size = 0;
3116 if (is_incomplete)
3117 *is_incomplete = true;
3118 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003119
Greg Claytond8d4a572015-08-11 21:38:15 +00003120 case clang::Type::VariableArray:
3121 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00003122 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::VariableArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003123 if (size)
3124 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003125 if (is_incomplete)
3126 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00003127 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003128
Greg Claytond8d4a572015-08-11 21:38:15 +00003129 case clang::Type::DependentSizedArray:
3130 if (element_type_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00003131 element_type_ptr->SetCompilerType (getASTContext(), llvm::cast<clang::DependentSizedArrayType>(qual_type)->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003132 if (size)
3133 *size = 0;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003134 if (is_incomplete)
3135 *is_incomplete = false;
Greg Claytond8d4a572015-08-11 21:38:15 +00003136 return true;
Tamas Berghammer69d0b332015-10-09 12:43:08 +00003137
Greg Claytond8d4a572015-08-11 21:38:15 +00003138 case clang::Type::Typedef:
3139 return IsArrayType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3140 element_type_ptr,
3141 size,
3142 is_incomplete);
Enrico Granata36f51e42015-12-18 22:41:25 +00003143 case clang::Type::Auto:
3144 return IsArrayType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(),
3145 element_type_ptr,
3146 size,
3147 is_incomplete);
Greg Claytond8d4a572015-08-11 21:38:15 +00003148 case clang::Type::Elaborated:
3149 return IsArrayType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3150 element_type_ptr,
3151 size,
3152 is_incomplete);
3153 case clang::Type::Paren:
3154 return IsArrayType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3155 element_type_ptr,
3156 size,
3157 is_incomplete);
3158 }
3159 if (element_type_ptr)
3160 element_type_ptr->Clear();
3161 if (size)
3162 *size = 0;
3163 if (is_incomplete)
3164 *is_incomplete = false;
Bruce Mitchener778e7ab2015-09-16 00:00:16 +00003165 return false;
Greg Claytond8d4a572015-08-11 21:38:15 +00003166}
3167
3168bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003169ClangASTContext::IsVectorType (lldb::opaque_compiler_type_t type,
Greg Claytona1e5dc82015-08-11 22:53:00 +00003170 CompilerType *element_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003171 uint64_t *size)
3172{
3173 clang::QualType qual_type (GetCanonicalQualType(type));
3174
3175 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3176 switch (type_class)
3177 {
3178 case clang::Type::Vector:
3179 {
3180 const clang::VectorType *vector_type = qual_type->getAs<clang::VectorType>();
3181 if (vector_type)
3182 {
3183 if (size)
3184 *size = vector_type->getNumElements();
3185 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003186 *element_type = CompilerType(getASTContext(), vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003187 }
3188 return true;
3189 }
3190 break;
3191 case clang::Type::ExtVector:
3192 {
3193 const clang::ExtVectorType *ext_vector_type = qual_type->getAs<clang::ExtVectorType>();
3194 if (ext_vector_type)
3195 {
3196 if (size)
3197 *size = ext_vector_type->getNumElements();
3198 if (element_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003199 *element_type = CompilerType(getASTContext(), ext_vector_type->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003200 }
3201 return true;
3202 }
3203 default:
3204 break;
3205 }
3206 return false;
3207}
3208
3209bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003210ClangASTContext::IsRuntimeGeneratedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003211{
3212 clang::DeclContext* decl_ctx = ClangASTContext::GetASTContext(getASTContext())->GetDeclContextForType(GetQualType(type));
3213 if (!decl_ctx)
3214 return false;
3215
3216 if (!llvm::isa<clang::ObjCInterfaceDecl>(decl_ctx))
3217 return false;
3218
3219 clang::ObjCInterfaceDecl *result_iface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl_ctx);
3220
3221 ClangASTMetadata* ast_metadata = ClangASTContext::GetMetadata(getASTContext(), result_iface_decl);
3222 if (!ast_metadata)
3223 return false;
3224 return (ast_metadata->GetISAPtr() != 0);
3225}
3226
3227bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003228ClangASTContext::IsCharType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003229{
3230 return GetQualType(type).getUnqualifiedType()->isCharType();
3231}
3232
3233
3234bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003235ClangASTContext::IsCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003236{
3237 const bool allow_completion = false;
3238 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
3239}
3240
3241bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003242ClangASTContext::IsConst(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003243{
3244 return GetQualType(type).isConstQualified();
3245}
3246
3247bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003248ClangASTContext::IsCStringType (lldb::opaque_compiler_type_t type, uint32_t &length)
Greg Claytond8d4a572015-08-11 21:38:15 +00003249{
Greg Claytona1e5dc82015-08-11 22:53:00 +00003250 CompilerType pointee_or_element_clang_type;
Greg Claytond8d4a572015-08-11 21:38:15 +00003251 length = 0;
3252 Flags type_flags (GetTypeInfo (type, &pointee_or_element_clang_type));
3253
3254 if (!pointee_or_element_clang_type.IsValid())
3255 return false;
3256
3257 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
3258 {
3259 if (pointee_or_element_clang_type.IsCharType())
3260 {
3261 if (type_flags.Test (eTypeIsArray))
3262 {
3263 // We know the size of the array and it could be a C string
3264 // since it is an array of characters
3265 length = llvm::cast<clang::ConstantArrayType>(GetCanonicalQualType(type).getTypePtr())->getSize().getLimitedValue();
3266 }
3267 return true;
3268
3269 }
3270 }
3271 return false;
3272}
3273
3274bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003275ClangASTContext::IsFunctionType (lldb::opaque_compiler_type_t type, bool *is_variadic_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003276{
3277 if (type)
3278 {
3279 clang::QualType qual_type (GetCanonicalQualType(type));
3280
3281 if (qual_type->isFunctionType())
3282 {
3283 if (is_variadic_ptr)
3284 {
3285 const clang::FunctionProtoType *function_proto_type = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3286 if (function_proto_type)
3287 *is_variadic_ptr = function_proto_type->isVariadic();
3288 else
3289 *is_variadic_ptr = false;
3290 }
3291 return true;
3292 }
3293
3294 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3295 switch (type_class)
3296 {
3297 default:
3298 break;
3299 case clang::Type::Typedef:
3300 return IsFunctionType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), nullptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00003301 case clang::Type::Auto:
3302 return IsFunctionType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), nullptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00003303 case clang::Type::Elaborated:
3304 return IsFunctionType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), nullptr);
3305 case clang::Type::Paren:
3306 return IsFunctionType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), nullptr);
3307 case clang::Type::LValueReference:
3308 case clang::Type::RValueReference:
3309 {
3310 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3311 if (reference_type)
3312 return IsFunctionType(reference_type->getPointeeType().getAsOpaquePtr(), nullptr);
3313 }
3314 break;
3315 }
3316 }
3317 return false;
3318}
3319
3320// Used to detect "Homogeneous Floating-point Aggregates"
3321uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003322ClangASTContext::IsHomogeneousAggregate (lldb::opaque_compiler_type_t type, CompilerType* base_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00003323{
3324 if (!type)
3325 return 0;
3326
3327 clang::QualType qual_type(GetCanonicalQualType(type));
3328 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3329 switch (type_class)
3330 {
3331 case clang::Type::Record:
3332 if (GetCompleteType (type))
3333 {
3334 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
3335 if (cxx_record_decl)
3336 {
3337 if (cxx_record_decl->getNumBases() ||
3338 cxx_record_decl->isDynamicClass())
3339 return 0;
3340 }
3341 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3342 if (record_type)
3343 {
3344 const clang::RecordDecl *record_decl = record_type->getDecl();
3345 if (record_decl)
3346 {
3347 // We are looking for a structure that contains only floating point types
3348 clang::RecordDecl::field_iterator field_pos, field_end = record_decl->field_end();
3349 uint32_t num_fields = 0;
3350 bool is_hva = false;
3351 bool is_hfa = false;
3352 clang::QualType base_qual_type;
Omair Javaid92a8ded2016-02-24 12:17:43 +00003353 uint64_t base_bitwidth = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00003354 for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos)
3355 {
3356 clang::QualType field_qual_type = field_pos->getType();
Omair Javaid92a8ded2016-02-24 12:17:43 +00003357 uint64_t field_bitwidth = getASTContext()->getTypeSize (qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003358 if (field_qual_type->isFloatingType())
3359 {
3360 if (field_qual_type->isComplexType())
3361 return 0;
3362 else
3363 {
3364 if (num_fields == 0)
3365 base_qual_type = field_qual_type;
3366 else
3367 {
3368 if (is_hva)
3369 return 0;
3370 is_hfa = true;
3371 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3372 return 0;
3373 }
3374 }
3375 }
3376 else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType())
3377 {
Omair Javaid92a8ded2016-02-24 12:17:43 +00003378 if (num_fields == 0)
Greg Claytond8d4a572015-08-11 21:38:15 +00003379 {
Omair Javaid92a8ded2016-02-24 12:17:43 +00003380 base_qual_type = field_qual_type;
3381 base_bitwidth = field_bitwidth;
Greg Claytond8d4a572015-08-11 21:38:15 +00003382 }
3383 else
Omair Javaid92a8ded2016-02-24 12:17:43 +00003384 {
3385 if (is_hfa)
3386 return 0;
3387 is_hva = true;
3388 if (base_bitwidth != field_bitwidth)
3389 return 0;
3390 if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr())
3391 return 0;
3392 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003393 }
3394 else
3395 return 0;
3396 ++num_fields;
3397 }
3398 if (base_type_ptr)
Greg Claytona1e5dc82015-08-11 22:53:00 +00003399 *base_type_ptr = CompilerType (getASTContext(), base_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003400 return num_fields;
3401 }
3402 }
3403 }
3404 break;
3405
3406 case clang::Type::Typedef:
3407 return IsHomogeneousAggregate(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), base_type_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00003408
3409 case clang::Type::Auto:
3410 return IsHomogeneousAggregate(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), base_type_ptr);
Greg Claytond8d4a572015-08-11 21:38:15 +00003411
3412 case clang::Type::Elaborated:
3413 return IsHomogeneousAggregate(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), base_type_ptr);
3414 default:
3415 break;
3416 }
3417 return 0;
3418}
3419
3420size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003421ClangASTContext::GetNumberOfFunctionArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003422{
3423 if (type)
3424 {
3425 clang::QualType qual_type (GetCanonicalQualType(type));
3426 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3427 if (func)
3428 return func->getNumParams();
3429 }
3430 return 0;
3431}
3432
Greg Claytona1e5dc82015-08-11 22:53:00 +00003433CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003434ClangASTContext::GetFunctionArgumentAtIndex (lldb::opaque_compiler_type_t type, const size_t index)
Greg Claytond8d4a572015-08-11 21:38:15 +00003435{
3436 if (type)
3437 {
Greg Clayton0a5f8052016-03-15 22:43:26 +00003438 clang::QualType qual_type (GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00003439 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
3440 if (func)
3441 {
3442 if (index < func->getNumParams())
Greg Claytona1e5dc82015-08-11 22:53:00 +00003443 return CompilerType(getASTContext(), func->getParamType(index));
Greg Claytond8d4a572015-08-11 21:38:15 +00003444 }
3445 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00003446 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003447}
3448
3449bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003450ClangASTContext::IsFunctionPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003451{
3452 if (type)
3453 {
3454 clang::QualType qual_type (GetCanonicalQualType(type));
3455
3456 if (qual_type->isFunctionPointerType())
3457 return true;
3458
3459 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3460 switch (type_class)
3461 {
3462 default:
3463 break;
3464 case clang::Type::Typedef:
3465 return IsFunctionPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
Enrico Granata36f51e42015-12-18 22:41:25 +00003466 case clang::Type::Auto:
3467 return IsFunctionPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00003468 case clang::Type::Elaborated:
3469 return IsFunctionPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
3470 case clang::Type::Paren:
3471 return IsFunctionPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
3472
3473 case clang::Type::LValueReference:
3474 case clang::Type::RValueReference:
3475 {
3476 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3477 if (reference_type)
3478 return IsFunctionPointerType(reference_type->getPointeeType().getAsOpaquePtr());
3479 }
3480 break;
3481 }
3482 }
3483 return false;
3484
3485}
3486
3487bool
Sean Callananc530ba92016-05-02 21:15:31 +00003488ClangASTContext::IsBlockPointerType (lldb::opaque_compiler_type_t type, CompilerType *function_pointer_type_ptr)
3489{
3490 if (type)
3491 {
3492 clang::QualType qual_type (GetCanonicalQualType(type));
3493
3494 if (qual_type->isBlockPointerType())
3495 {
3496 if (function_pointer_type_ptr)
3497 {
3498 const clang::BlockPointerType *block_pointer_type = qual_type->getAs<clang::BlockPointerType>();
3499 QualType pointee_type = block_pointer_type->getPointeeType();
3500 QualType function_pointer_type = m_ast_ap->getPointerType(pointee_type);
3501 *function_pointer_type_ptr = CompilerType (getASTContext(), function_pointer_type);
3502 }
3503 return true;
3504 }
3505
3506 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3507 switch (type_class)
3508 {
3509 default:
3510 break;
3511 case clang::Type::Typedef:
3512 return IsBlockPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), function_pointer_type_ptr);
3513 case clang::Type::Auto:
3514 return IsBlockPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), function_pointer_type_ptr);
3515 case clang::Type::Elaborated:
3516 return IsBlockPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), function_pointer_type_ptr);
3517 case clang::Type::Paren:
3518 return IsBlockPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), function_pointer_type_ptr);
3519
3520 case clang::Type::LValueReference:
3521 case clang::Type::RValueReference:
3522 {
3523 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
3524 if (reference_type)
3525 return IsBlockPointerType(reference_type->getPointeeType().getAsOpaquePtr(), function_pointer_type_ptr);
3526 }
3527 break;
3528 }
3529 }
3530 return false;
3531}
3532
3533bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003534ClangASTContext::IsIntegerType (lldb::opaque_compiler_type_t type, bool &is_signed)
Greg Claytond8d4a572015-08-11 21:38:15 +00003535{
3536 if (!type)
3537 return false;
3538
3539 clang::QualType qual_type (GetCanonicalQualType(type));
3540 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
3541
3542 if (builtin_type)
3543 {
3544 if (builtin_type->isInteger())
3545 {
3546 is_signed = builtin_type->isSignedInteger();
3547 return true;
3548 }
3549 }
3550
3551 return false;
3552}
3553
3554bool
Greg Claytond7f71ad2016-06-24 23:48:00 +00003555ClangASTContext::IsEnumerationType(lldb::opaque_compiler_type_t type, bool &is_signed)
3556{
3557 if (type)
3558 {
3559 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type)->getCanonicalTypeInternal());
3560
3561 if (enum_type)
3562 {
3563 IsIntegerType(enum_type->getDecl()->getIntegerType().getAsOpaquePtr(), is_signed);
3564 return true;
3565 }
3566 }
3567
3568 return false;
3569}
3570
3571bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003572ClangASTContext::IsPointerType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003573{
3574 if (type)
3575 {
3576 clang::QualType qual_type (GetCanonicalQualType(type));
3577 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3578 switch (type_class)
3579 {
3580 case clang::Type::Builtin:
3581 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3582 {
3583 default:
3584 break;
3585 case clang::BuiltinType::ObjCId:
3586 case clang::BuiltinType::ObjCClass:
3587 return true;
3588 }
3589 return false;
3590 case clang::Type::ObjCObjectPointer:
3591 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003592 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003593 return true;
3594 case clang::Type::BlockPointer:
3595 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003596 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003597 return true;
3598 case clang::Type::Pointer:
3599 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003600 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003601 return true;
3602 case clang::Type::MemberPointer:
3603 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003604 pointee_type->SetCompilerType (getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003605 return true;
3606 case clang::Type::Typedef:
3607 return IsPointerType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003608 case clang::Type::Auto:
3609 return IsPointerType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003610 case clang::Type::Elaborated:
3611 return IsPointerType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3612 case clang::Type::Paren:
3613 return IsPointerType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3614 default:
3615 break;
3616 }
3617 }
3618 if (pointee_type)
3619 pointee_type->Clear();
3620 return false;
3621}
3622
3623
3624bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003625ClangASTContext::IsPointerOrReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003626{
3627 if (type)
3628 {
3629 clang::QualType qual_type (GetCanonicalQualType(type));
3630 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3631 switch (type_class)
3632 {
3633 case clang::Type::Builtin:
3634 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
3635 {
3636 default:
3637 break;
3638 case clang::BuiltinType::ObjCId:
3639 case clang::BuiltinType::ObjCClass:
3640 return true;
3641 }
3642 return false;
3643 case clang::Type::ObjCObjectPointer:
3644 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003645 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003646 return true;
3647 case clang::Type::BlockPointer:
3648 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003649 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::BlockPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003650 return true;
3651 case clang::Type::Pointer:
3652 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003653 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::PointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003654 return true;
3655 case clang::Type::MemberPointer:
3656 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003657 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::MemberPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003658 return true;
3659 case clang::Type::LValueReference:
3660 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003661 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003662 return true;
3663 case clang::Type::RValueReference:
3664 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003665 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003666 return true;
3667 case clang::Type::Typedef:
3668 return IsPointerOrReferenceType(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type);
Enrico Granata36f51e42015-12-18 22:41:25 +00003669 case clang::Type::Auto:
3670 return IsPointerOrReferenceType(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003671 case clang::Type::Elaborated:
3672 return IsPointerOrReferenceType(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type);
3673 case clang::Type::Paren:
3674 return IsPointerOrReferenceType(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type);
3675 default:
3676 break;
3677 }
3678 }
3679 if (pointee_type)
3680 pointee_type->Clear();
3681 return false;
3682}
3683
3684
3685bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003686ClangASTContext::IsReferenceType (lldb::opaque_compiler_type_t type, CompilerType *pointee_type, bool* is_rvalue)
Greg Claytond8d4a572015-08-11 21:38:15 +00003687{
3688 if (type)
3689 {
3690 clang::QualType qual_type (GetCanonicalQualType(type));
3691 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3692
3693 switch (type_class)
3694 {
3695 case clang::Type::LValueReference:
3696 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003697 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::LValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003698 if (is_rvalue)
3699 *is_rvalue = false;
3700 return true;
3701 case clang::Type::RValueReference:
3702 if (pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003703 pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::RValueReferenceType>(qual_type)->desugar());
Greg Claytond8d4a572015-08-11 21:38:15 +00003704 if (is_rvalue)
3705 *is_rvalue = true;
3706 return true;
3707 case clang::Type::Typedef:
3708 return IsReferenceType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), pointee_type, is_rvalue);
Enrico Granata36f51e42015-12-18 22:41:25 +00003709 case clang::Type::Auto:
3710 return IsReferenceType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), pointee_type, is_rvalue);
Greg Claytond8d4a572015-08-11 21:38:15 +00003711 case clang::Type::Elaborated:
3712 return IsReferenceType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), pointee_type, is_rvalue);
3713 case clang::Type::Paren:
3714 return IsReferenceType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), pointee_type, is_rvalue);
3715
3716 default:
3717 break;
3718 }
3719 }
3720 if (pointee_type)
3721 pointee_type->Clear();
3722 return false;
3723}
3724
3725bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003726ClangASTContext::IsFloatingPointType (lldb::opaque_compiler_type_t type, uint32_t &count, bool &is_complex)
Greg Claytond8d4a572015-08-11 21:38:15 +00003727{
3728 if (type)
3729 {
3730 clang::QualType qual_type (GetCanonicalQualType(type));
3731
3732 if (const clang::BuiltinType *BT = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal()))
3733 {
3734 clang::BuiltinType::Kind kind = BT->getKind();
3735 if (kind >= clang::BuiltinType::Float && kind <= clang::BuiltinType::LongDouble)
3736 {
3737 count = 1;
3738 is_complex = false;
3739 return true;
3740 }
3741 }
3742 else if (const clang::ComplexType *CT = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal()))
3743 {
3744 if (IsFloatingPointType (CT->getElementType().getAsOpaquePtr(), count, is_complex))
3745 {
3746 count = 2;
3747 is_complex = true;
3748 return true;
3749 }
3750 }
3751 else if (const clang::VectorType *VT = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal()))
3752 {
3753 if (IsFloatingPointType (VT->getElementType().getAsOpaquePtr(), count, is_complex))
3754 {
3755 count = VT->getNumElements();
3756 is_complex = false;
3757 return true;
3758 }
3759 }
3760 }
3761 count = 0;
3762 is_complex = false;
3763 return false;
3764}
3765
3766
3767bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003768ClangASTContext::IsDefined(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003769{
3770 if (!type)
3771 return false;
3772
3773 clang::QualType qual_type(GetQualType(type));
3774 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
3775 if (tag_type)
3776 {
3777 clang::TagDecl *tag_decl = tag_type->getDecl();
3778 if (tag_decl)
3779 return tag_decl->isCompleteDefinition();
3780 return false;
3781 }
3782 else
3783 {
3784 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
3785 if (objc_class_type)
3786 {
3787 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
3788 if (class_interface_decl)
3789 return class_interface_decl->getDefinition() != nullptr;
3790 return false;
3791 }
3792 }
3793 return true;
3794}
3795
3796bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003797ClangASTContext::IsObjCClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003798{
3799 if (type)
3800 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00003801 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
3802
Greg Claytond8d4a572015-08-11 21:38:15 +00003803 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
3804
3805 if (obj_pointer_type)
3806 return obj_pointer_type->isObjCClassType();
3807 }
3808 return false;
3809}
3810
3811bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00003812ClangASTContext::IsObjCObjectOrInterfaceType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003813{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00003814 if (ClangUtil::IsClangType(type))
3815 return ClangUtil::GetCanonicalQualType(type)->isObjCObjectOrInterfaceType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003816 return false;
3817}
3818
3819bool
Zachary Turner42dff792016-04-15 00:21:26 +00003820ClangASTContext::IsClassType(lldb::opaque_compiler_type_t type)
3821{
3822 if (!type)
3823 return false;
3824 clang::QualType qual_type(GetCanonicalQualType(type));
3825 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3826 return (type_class == clang::Type::Record);
3827}
3828
3829bool
3830ClangASTContext::IsEnumType(lldb::opaque_compiler_type_t type)
3831{
3832 if (!type)
3833 return false;
3834 clang::QualType qual_type(GetCanonicalQualType(type));
3835 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3836 return (type_class == clang::Type::Enum);
3837}
3838
3839bool
3840ClangASTContext::IsPolymorphicClass(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00003841{
3842 if (type)
3843 {
3844 clang::QualType qual_type(GetCanonicalQualType(type));
3845 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3846 switch (type_class)
3847 {
3848 case clang::Type::Record:
3849 if (GetCompleteType(type))
3850 {
3851 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
3852 const clang::RecordDecl *record_decl = record_type->getDecl();
3853 if (record_decl)
3854 {
3855 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
3856 if (cxx_record_decl)
3857 return cxx_record_decl->isPolymorphic();
3858 }
3859 }
3860 break;
3861
3862 default:
3863 break;
3864 }
3865 }
3866 return false;
3867}
3868
3869bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00003870ClangASTContext::IsPossibleDynamicType (lldb::opaque_compiler_type_t type, CompilerType *dynamic_pointee_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00003871 bool check_cplusplus,
3872 bool check_objc)
3873{
3874 clang::QualType pointee_qual_type;
3875 if (type)
3876 {
3877 clang::QualType qual_type (GetCanonicalQualType(type));
3878 bool success = false;
3879 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
3880 switch (type_class)
3881 {
3882 case clang::Type::Builtin:
3883 if (check_objc && llvm::cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
3884 {
3885 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003886 dynamic_pointee_type->SetCompilerType(this, type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003887 return true;
3888 }
3889 break;
3890
3891 case clang::Type::ObjCObjectPointer:
3892 if (check_objc)
3893 {
Enrico Granatae1e5ac32016-06-24 20:45:08 +00003894 if (auto objc_pointee_type = qual_type->getPointeeType().getTypePtrOrNull())
3895 {
3896 if (auto objc_object_type = llvm::dyn_cast_or_null<clang::ObjCObjectType>(objc_pointee_type))
3897 {
3898 if (objc_object_type->isObjCClass())
3899 return false;
3900 }
3901 }
Greg Claytond8d4a572015-08-11 21:38:15 +00003902 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003903 dynamic_pointee_type->SetCompilerType(getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type)->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00003904 return true;
3905 }
3906 break;
3907
3908 case clang::Type::Pointer:
3909 pointee_qual_type = llvm::cast<clang::PointerType>(qual_type)->getPointeeType();
3910 success = true;
3911 break;
3912
3913 case clang::Type::LValueReference:
3914 case clang::Type::RValueReference:
3915 pointee_qual_type = llvm::cast<clang::ReferenceType>(qual_type)->getPointeeType();
3916 success = true;
3917 break;
3918
3919 case clang::Type::Typedef:
3920 return IsPossibleDynamicType (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
3921 dynamic_pointee_type,
3922 check_cplusplus,
3923 check_objc);
Enrico Granata36f51e42015-12-18 22:41:25 +00003924
3925 case clang::Type::Auto:
3926 return IsPossibleDynamicType (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(),
3927 dynamic_pointee_type,
3928 check_cplusplus,
3929 check_objc);
Greg Claytond8d4a572015-08-11 21:38:15 +00003930
3931 case clang::Type::Elaborated:
3932 return IsPossibleDynamicType (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
3933 dynamic_pointee_type,
3934 check_cplusplus,
3935 check_objc);
3936
3937 case clang::Type::Paren:
3938 return IsPossibleDynamicType (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(),
3939 dynamic_pointee_type,
3940 check_cplusplus,
3941 check_objc);
3942 default:
3943 break;
3944 }
3945
3946 if (success)
3947 {
3948 // Check to make sure what we are pointing too is a possible dynamic C++ type
3949 // We currently accept any "void *" (in case we have a class that has been
3950 // watered down to an opaque pointer) and virtual C++ classes.
3951 const clang::Type::TypeClass pointee_type_class = pointee_qual_type.getCanonicalType()->getTypeClass();
3952 switch (pointee_type_class)
3953 {
3954 case clang::Type::Builtin:
3955 switch (llvm::cast<clang::BuiltinType>(pointee_qual_type)->getKind())
3956 {
3957 case clang::BuiltinType::UnknownAny:
3958 case clang::BuiltinType::Void:
3959 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003960 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003961 return true;
Zachary Turnerdd07e002015-09-16 18:08:45 +00003962 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00003963 break;
3964 }
3965 break;
3966
3967 case clang::Type::Record:
3968 if (check_cplusplus)
3969 {
3970 clang::CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
3971 if (cxx_record_decl)
3972 {
3973 bool is_complete = cxx_record_decl->isCompleteDefinition();
3974
3975 if (is_complete)
3976 success = cxx_record_decl->isDynamicClass();
3977 else
3978 {
3979 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), cxx_record_decl);
3980 if (metadata)
3981 success = metadata->GetIsDynamicCXXType();
3982 else
3983 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00003984 is_complete = CompilerType(getASTContext(), pointee_qual_type).GetCompleteType();
Greg Claytond8d4a572015-08-11 21:38:15 +00003985 if (is_complete)
3986 success = cxx_record_decl->isDynamicClass();
3987 else
3988 success = false;
3989 }
3990 }
3991
3992 if (success)
3993 {
3994 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00003995 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00003996 return true;
3997 }
3998 }
3999 }
4000 break;
4001
4002 case clang::Type::ObjCObject:
4003 case clang::Type::ObjCInterface:
4004 if (check_objc)
4005 {
4006 if (dynamic_pointee_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004007 dynamic_pointee_type->SetCompilerType(getASTContext(), pointee_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004008 return true;
4009 }
4010 break;
4011
4012 default:
4013 break;
4014 }
4015 }
4016 }
4017 if (dynamic_pointee_type)
4018 dynamic_pointee_type->Clear();
4019 return false;
4020}
4021
4022
4023bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004024ClangASTContext::IsScalarType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004025{
4026 if (!type)
4027 return false;
4028
4029 return (GetTypeInfo (type, nullptr) & eTypeIsScalar) != 0;
4030}
4031
4032bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004033ClangASTContext::IsTypedefType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004034{
4035 if (!type)
4036 return false;
4037 return GetQualType(type)->getTypeClass() == clang::Type::Typedef;
4038}
4039
4040bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004041ClangASTContext::IsVoidType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004042{
4043 if (!type)
4044 return false;
4045 return GetCanonicalQualType(type)->isVoidType();
4046}
4047
4048bool
Greg Clayton56939cb2015-09-17 22:23:34 +00004049ClangASTContext::SupportsLanguage (lldb::LanguageType language)
4050{
4051 return ClangASTContextSupportsLanguage(language);
4052}
4053
4054bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00004055ClangASTContext::GetCXXClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00004056{
4057 if (type)
4058 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00004059 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00004060 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00004061 {
Ryan Brown57bee1e2015-09-14 22:45:11 +00004062 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
4063 if (cxx_record_decl)
4064 {
4065 class_name.assign(cxx_record_decl->getIdentifier()->getNameStart());
4066 return true;
4067 }
Greg Claytond8d4a572015-08-11 21:38:15 +00004068 }
4069 }
4070 class_name.clear();
4071 return false;
4072}
4073
4074
4075bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00004076ClangASTContext::IsCXXClassType (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004077{
4078 if (!type)
4079 return false;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00004080
4081 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00004082 if (!qual_type.isNull() && qual_type->getAsCXXRecordDecl() != nullptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00004083 return true;
4084 return false;
4085}
4086
4087bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004088ClangASTContext::IsBeingDefined (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004089{
4090 if (!type)
4091 return false;
4092 clang::QualType qual_type (GetCanonicalQualType(type));
4093 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type);
4094 if (tag_type)
4095 return tag_type->isBeingDefined();
4096 return false;
4097}
4098
4099bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00004100ClangASTContext::IsObjCObjectPointerType (const CompilerType& type, CompilerType *class_type_ptr)
Greg Claytond8d4a572015-08-11 21:38:15 +00004101{
4102 if (!type)
4103 return false;
4104
Zachary Turnerd133f6a2016-03-28 22:53:41 +00004105 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
Ryan Brown57bee1e2015-09-14 22:45:11 +00004106
4107 if (!qual_type.isNull() && qual_type->isObjCObjectPointerType())
Greg Claytond8d4a572015-08-11 21:38:15 +00004108 {
4109 if (class_type_ptr)
4110 {
4111 if (!qual_type->isObjCClassType() &&
4112 !qual_type->isObjCIdType())
4113 {
4114 const clang::ObjCObjectPointerType *obj_pointer_type = llvm::dyn_cast<clang::ObjCObjectPointerType>(qual_type);
4115 if (obj_pointer_type == nullptr)
4116 class_type_ptr->Clear();
4117 else
Greg Clayton99558cc42015-08-24 23:46:31 +00004118 class_type_ptr->SetCompilerType (type.GetTypeSystem(), clang::QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr());
Greg Claytond8d4a572015-08-11 21:38:15 +00004119 }
4120 }
4121 return true;
4122 }
4123 if (class_type_ptr)
4124 class_type_ptr->Clear();
4125 return false;
4126}
4127
4128bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00004129ClangASTContext::GetObjCClassName (const CompilerType& type, std::string &class_name)
Greg Claytond8d4a572015-08-11 21:38:15 +00004130{
4131 if (!type)
4132 return false;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00004133
4134 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
4135
Greg Claytond8d4a572015-08-11 21:38:15 +00004136 const clang::ObjCObjectType *object_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
4137 if (object_type)
4138 {
4139 const clang::ObjCInterfaceDecl *interface = object_type->getInterface();
4140 if (interface)
4141 {
4142 class_name = interface->getNameAsString();
4143 return true;
4144 }
4145 }
4146 return false;
4147}
4148
4149
4150//----------------------------------------------------------------------
4151// Type Completion
4152//----------------------------------------------------------------------
4153
4154bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004155ClangASTContext::GetCompleteType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004156{
4157 if (!type)
4158 return false;
4159 const bool allow_completion = true;
4160 return GetCompleteQualType (getASTContext(), GetQualType(type), allow_completion);
4161}
4162
4163ConstString
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004164ClangASTContext::GetTypeName (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004165{
4166 std::string type_name;
4167 if (type)
4168 {
4169 clang::PrintingPolicy printing_policy (getASTContext()->getPrintingPolicy());
4170 clang::QualType qual_type(GetQualType(type));
4171 printing_policy.SuppressTagKeyword = true;
Greg Claytond8d4a572015-08-11 21:38:15 +00004172 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
4173 if (typedef_type)
4174 {
4175 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
4176 type_name = typedef_decl->getQualifiedNameAsString();
4177 }
4178 else
4179 {
4180 type_name = qual_type.getAsString(printing_policy);
4181 }
4182 }
4183 return ConstString(type_name);
4184}
4185
4186uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004187ClangASTContext::GetTypeInfo (lldb::opaque_compiler_type_t type, CompilerType *pointee_or_element_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004188{
4189 if (!type)
4190 return 0;
4191
4192 if (pointee_or_element_clang_type)
4193 pointee_or_element_clang_type->Clear();
4194
4195 clang::QualType qual_type (GetQualType(type));
4196
4197 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4198 switch (type_class)
4199 {
4200 case clang::Type::Builtin:
4201 {
4202 const clang::BuiltinType *builtin_type = llvm::dyn_cast<clang::BuiltinType>(qual_type->getCanonicalTypeInternal());
4203
4204 uint32_t builtin_type_flags = eTypeIsBuiltIn | eTypeHasValue;
4205 switch (builtin_type->getKind())
4206 {
4207 case clang::BuiltinType::ObjCId:
4208 case clang::BuiltinType::ObjCClass:
4209 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004210 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00004211 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
4212 break;
4213
4214 case clang::BuiltinType::ObjCSel:
4215 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004216 pointee_or_element_clang_type->SetCompilerType(getASTContext(), getASTContext()->CharTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00004217 builtin_type_flags |= eTypeIsPointer | eTypeIsObjC;
4218 break;
4219
4220 case clang::BuiltinType::Bool:
4221 case clang::BuiltinType::Char_U:
4222 case clang::BuiltinType::UChar:
4223 case clang::BuiltinType::WChar_U:
4224 case clang::BuiltinType::Char16:
4225 case clang::BuiltinType::Char32:
4226 case clang::BuiltinType::UShort:
4227 case clang::BuiltinType::UInt:
4228 case clang::BuiltinType::ULong:
4229 case clang::BuiltinType::ULongLong:
4230 case clang::BuiltinType::UInt128:
4231 case clang::BuiltinType::Char_S:
4232 case clang::BuiltinType::SChar:
4233 case clang::BuiltinType::WChar_S:
4234 case clang::BuiltinType::Short:
4235 case clang::BuiltinType::Int:
4236 case clang::BuiltinType::Long:
4237 case clang::BuiltinType::LongLong:
4238 case clang::BuiltinType::Int128:
4239 case clang::BuiltinType::Float:
4240 case clang::BuiltinType::Double:
4241 case clang::BuiltinType::LongDouble:
4242 builtin_type_flags |= eTypeIsScalar;
4243 if (builtin_type->isInteger())
4244 {
4245 builtin_type_flags |= eTypeIsInteger;
4246 if (builtin_type->isSignedInteger())
4247 builtin_type_flags |= eTypeIsSigned;
4248 }
4249 else if (builtin_type->isFloatingPoint())
4250 builtin_type_flags |= eTypeIsFloat;
4251 break;
4252 default:
4253 break;
4254 }
4255 return builtin_type_flags;
4256 }
4257
4258 case clang::Type::BlockPointer:
4259 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004260 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004261 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
4262
4263 case clang::Type::Complex:
4264 {
4265 uint32_t complex_type_flags = eTypeIsBuiltIn | eTypeHasValue | eTypeIsComplex;
4266 const clang::ComplexType *complex_type = llvm::dyn_cast<clang::ComplexType>(qual_type->getCanonicalTypeInternal());
4267 if (complex_type)
4268 {
4269 clang::QualType complex_element_type (complex_type->getElementType());
4270 if (complex_element_type->isIntegerType())
4271 complex_type_flags |= eTypeIsFloat;
4272 else if (complex_element_type->isFloatingType())
4273 complex_type_flags |= eTypeIsInteger;
4274 }
4275 return complex_type_flags;
4276 }
4277 break;
4278
4279 case clang::Type::ConstantArray:
4280 case clang::Type::DependentSizedArray:
4281 case clang::Type::IncompleteArray:
4282 case clang::Type::VariableArray:
4283 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004284 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ArrayType>(qual_type.getTypePtr())->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004285 return eTypeHasChildren | eTypeIsArray;
4286
4287 case clang::Type::DependentName: return 0;
4288 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector;
4289 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate;
4290 case clang::Type::Decltype: return 0;
4291
4292 case clang::Type::Enum:
4293 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004294 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::EnumType>(qual_type)->getDecl()->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004295 return eTypeIsEnumeration | eTypeHasValue;
Enrico Granata36f51e42015-12-18 22:41:25 +00004296
4297 case clang::Type::Auto:
4298 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004299 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004300 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004301 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004302 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeInfo (pointee_or_element_clang_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00004303
4304 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue;
4305 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue;
4306 case clang::Type::InjectedClassName: return 0;
4307
4308 case clang::Type::LValueReference:
4309 case clang::Type::RValueReference:
4310 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004311 pointee_or_element_clang_type->SetCompilerType(getASTContext(), llvm::cast<clang::ReferenceType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004312 return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
4313
4314 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue;
4315
4316 case clang::Type::ObjCObjectPointer:
4317 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004318 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004319 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
4320
4321 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
4322 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
4323
4324 case clang::Type::Pointer:
4325 if (pointee_or_element_clang_type)
Greg Clayton99558cc42015-08-24 23:46:31 +00004326 pointee_or_element_clang_type->SetCompilerType(getASTContext(), qual_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004327 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
4328
4329 case clang::Type::Record:
4330 if (qual_type->getAsCXXRecordDecl())
4331 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
4332 else
4333 return eTypeHasChildren | eTypeIsStructUnion;
4334 break;
4335 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate;
4336 case clang::Type::TemplateTypeParm: return eTypeIsTemplate;
4337 case clang::Type::TemplateSpecialization: return eTypeIsTemplate;
4338
4339 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004340 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 +00004341 case clang::Type::TypeOfExpr: return 0;
4342 case clang::Type::TypeOf: return 0;
4343 case clang::Type::UnresolvedUsing: return 0;
4344
4345 case clang::Type::ExtVector:
4346 case clang::Type::Vector:
4347 {
4348 uint32_t vector_type_flags = eTypeHasChildren | eTypeIsVector;
4349 const clang::VectorType *vector_type = llvm::dyn_cast<clang::VectorType>(qual_type->getCanonicalTypeInternal());
4350 if (vector_type)
4351 {
4352 if (vector_type->isIntegerType())
4353 vector_type_flags |= eTypeIsFloat;
4354 else if (vector_type->isFloatingType())
4355 vector_type_flags |= eTypeIsInteger;
4356 }
4357 return vector_type_flags;
4358 }
4359 default: return 0;
4360 }
4361 return 0;
4362}
4363
4364
4365
4366lldb::LanguageType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004367ClangASTContext::GetMinimumLanguage (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004368{
4369 if (!type)
4370 return lldb::eLanguageTypeC;
4371
4372 // If the type is a reference, then resolve it to what it refers to first:
4373 clang::QualType qual_type (GetCanonicalQualType(type).getNonReferenceType());
4374 if (qual_type->isAnyPointerType())
4375 {
4376 if (qual_type->isObjCObjectPointerType())
4377 return lldb::eLanguageTypeObjC;
4378
4379 clang::QualType pointee_type (qual_type->getPointeeType());
4380 if (pointee_type->getPointeeCXXRecordDecl() != nullptr)
4381 return lldb::eLanguageTypeC_plus_plus;
4382 if (pointee_type->isObjCObjectOrInterfaceType())
4383 return lldb::eLanguageTypeObjC;
4384 if (pointee_type->isObjCClassType())
4385 return lldb::eLanguageTypeObjC;
4386 if (pointee_type.getTypePtr() == getASTContext()->ObjCBuiltinIdTy.getTypePtr())
4387 return lldb::eLanguageTypeObjC;
4388 }
4389 else
4390 {
4391 if (qual_type->isObjCObjectOrInterfaceType())
4392 return lldb::eLanguageTypeObjC;
4393 if (qual_type->getAsCXXRecordDecl())
4394 return lldb::eLanguageTypeC_plus_plus;
4395 switch (qual_type->getTypeClass())
4396 {
4397 default:
4398 break;
4399 case clang::Type::Builtin:
4400 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
4401 {
4402 default:
4403 case clang::BuiltinType::Void:
4404 case clang::BuiltinType::Bool:
4405 case clang::BuiltinType::Char_U:
4406 case clang::BuiltinType::UChar:
4407 case clang::BuiltinType::WChar_U:
4408 case clang::BuiltinType::Char16:
4409 case clang::BuiltinType::Char32:
4410 case clang::BuiltinType::UShort:
4411 case clang::BuiltinType::UInt:
4412 case clang::BuiltinType::ULong:
4413 case clang::BuiltinType::ULongLong:
4414 case clang::BuiltinType::UInt128:
4415 case clang::BuiltinType::Char_S:
4416 case clang::BuiltinType::SChar:
4417 case clang::BuiltinType::WChar_S:
4418 case clang::BuiltinType::Short:
4419 case clang::BuiltinType::Int:
4420 case clang::BuiltinType::Long:
4421 case clang::BuiltinType::LongLong:
4422 case clang::BuiltinType::Int128:
4423 case clang::BuiltinType::Float:
4424 case clang::BuiltinType::Double:
4425 case clang::BuiltinType::LongDouble:
4426 break;
4427
4428 case clang::BuiltinType::NullPtr:
4429 return eLanguageTypeC_plus_plus;
4430
4431 case clang::BuiltinType::ObjCId:
4432 case clang::BuiltinType::ObjCClass:
4433 case clang::BuiltinType::ObjCSel:
4434 return eLanguageTypeObjC;
4435
4436 case clang::BuiltinType::Dependent:
4437 case clang::BuiltinType::Overload:
4438 case clang::BuiltinType::BoundMember:
4439 case clang::BuiltinType::UnknownAny:
4440 break;
4441 }
4442 break;
4443 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004444 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetMinimumLanguage();
Greg Claytond8d4a572015-08-11 21:38:15 +00004445 }
4446 }
4447 return lldb::eLanguageTypeC;
4448}
4449
4450lldb::TypeClass
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004451ClangASTContext::GetTypeClass (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004452{
4453 if (!type)
4454 return lldb::eTypeClassInvalid;
4455
4456 clang::QualType qual_type(GetQualType(type));
4457
4458 switch (qual_type->getTypeClass())
4459 {
4460 case clang::Type::UnaryTransform: break;
4461 case clang::Type::FunctionNoProto: return lldb::eTypeClassFunction;
4462 case clang::Type::FunctionProto: return lldb::eTypeClassFunction;
4463 case clang::Type::IncompleteArray: return lldb::eTypeClassArray;
4464 case clang::Type::VariableArray: return lldb::eTypeClassArray;
4465 case clang::Type::ConstantArray: return lldb::eTypeClassArray;
4466 case clang::Type::DependentSizedArray: return lldb::eTypeClassArray;
4467 case clang::Type::DependentSizedExtVector: return lldb::eTypeClassVector;
4468 case clang::Type::ExtVector: return lldb::eTypeClassVector;
4469 case clang::Type::Vector: return lldb::eTypeClassVector;
4470 case clang::Type::Builtin: return lldb::eTypeClassBuiltin;
4471 case clang::Type::ObjCObjectPointer: return lldb::eTypeClassObjCObjectPointer;
4472 case clang::Type::BlockPointer: return lldb::eTypeClassBlockPointer;
4473 case clang::Type::Pointer: return lldb::eTypeClassPointer;
4474 case clang::Type::LValueReference: return lldb::eTypeClassReference;
4475 case clang::Type::RValueReference: return lldb::eTypeClassReference;
4476 case clang::Type::MemberPointer: return lldb::eTypeClassMemberPointer;
4477 case clang::Type::Complex:
4478 if (qual_type->isComplexType())
4479 return lldb::eTypeClassComplexFloat;
4480 else
4481 return lldb::eTypeClassComplexInteger;
4482 case clang::Type::ObjCObject: return lldb::eTypeClassObjCObject;
4483 case clang::Type::ObjCInterface: return lldb::eTypeClassObjCInterface;
4484 case clang::Type::Record:
4485 {
4486 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4487 const clang::RecordDecl *record_decl = record_type->getDecl();
4488 if (record_decl->isUnion())
4489 return lldb::eTypeClassUnion;
4490 else if (record_decl->isStruct())
4491 return lldb::eTypeClassStruct;
4492 else
4493 return lldb::eTypeClassClass;
4494 }
4495 break;
4496 case clang::Type::Enum: return lldb::eTypeClassEnumeration;
4497 case clang::Type::Typedef: return lldb::eTypeClassTypedef;
4498 case clang::Type::UnresolvedUsing: break;
4499 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004500 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetTypeClass();
Enrico Granata36f51e42015-12-18 22:41:25 +00004501 case clang::Type::Auto:
4502 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004503 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004504 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetTypeClass();
Greg Claytond8d4a572015-08-11 21:38:15 +00004505
4506 case clang::Type::Attributed: break;
4507 case clang::Type::TemplateTypeParm: break;
4508 case clang::Type::SubstTemplateTypeParm: break;
4509 case clang::Type::SubstTemplateTypeParmPack:break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004510 case clang::Type::InjectedClassName: break;
4511 case clang::Type::DependentName: break;
4512 case clang::Type::DependentTemplateSpecialization: break;
4513 case clang::Type::PackExpansion: break;
4514
4515 case clang::Type::TypeOfExpr: break;
4516 case clang::Type::TypeOf: break;
4517 case clang::Type::Decltype: break;
4518 case clang::Type::TemplateSpecialization: break;
4519 case clang::Type::Atomic: break;
Pavel Labath484f0a32016-01-12 08:51:28 +00004520 case clang::Type::Pipe: break;
Greg Claytond8d4a572015-08-11 21:38:15 +00004521
4522 // pointer type decayed from an array or function type.
4523 case clang::Type::Decayed: break;
4524 case clang::Type::Adjusted: break;
4525 }
4526 // We don't know hot to display this type...
4527 return lldb::eTypeClassOther;
4528
4529}
4530
4531unsigned
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004532ClangASTContext::GetTypeQualifiers(lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004533{
4534 if (type)
4535 return GetQualType(type).getQualifiers().getCVRQualifiers();
4536 return 0;
4537}
4538
4539//----------------------------------------------------------------------
4540// Creating related types
4541//----------------------------------------------------------------------
4542
Greg Claytona1e5dc82015-08-11 22:53:00 +00004543CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004544ClangASTContext::GetArrayElementType (lldb::opaque_compiler_type_t type, uint64_t *stride)
Greg Claytond8d4a572015-08-11 21:38:15 +00004545{
4546 if (type)
4547 {
4548 clang::QualType qual_type(GetCanonicalQualType(type));
4549
4550 const clang::Type *array_eletype = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual();
4551
4552 if (!array_eletype)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004553 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004554
Greg Claytona1e5dc82015-08-11 22:53:00 +00004555 CompilerType element_type (getASTContext(), array_eletype->getCanonicalTypeUnqualified());
Greg Claytond8d4a572015-08-11 21:38:15 +00004556
4557 // TODO: the real stride will be >= this value.. find the real one!
4558 if (stride)
4559 *stride = element_type.GetByteSize(nullptr);
4560
4561 return element_type;
4562
4563 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004564 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004565}
4566
Greg Claytona1e5dc82015-08-11 22:53:00 +00004567CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004568ClangASTContext::GetCanonicalType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004569{
4570 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004571 return CompilerType (getASTContext(), GetCanonicalQualType(type));
4572 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004573}
4574
4575static clang::QualType
4576GetFullyUnqualifiedType_Impl (clang::ASTContext *ast, clang::QualType qual_type)
4577{
4578 if (qual_type->isPointerType())
4579 qual_type = ast->getPointerType(GetFullyUnqualifiedType_Impl(ast, qual_type->getPointeeType()));
4580 else
4581 qual_type = qual_type.getUnqualifiedType();
4582 qual_type.removeLocalConst();
4583 qual_type.removeLocalRestrict();
4584 qual_type.removeLocalVolatile();
4585 return qual_type;
4586}
4587
Greg Claytona1e5dc82015-08-11 22:53:00 +00004588CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004589ClangASTContext::GetFullyUnqualifiedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004590{
4591 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004592 return CompilerType(getASTContext(), GetFullyUnqualifiedType_Impl(getASTContext(), GetQualType(type)));
4593 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004594}
4595
4596
4597int
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004598ClangASTContext::GetFunctionArgumentCount (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004599{
4600 if (type)
4601 {
4602 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetCanonicalQualType(type));
4603 if (func)
4604 return func->getNumParams();
4605 }
4606 return -1;
4607}
4608
Greg Claytona1e5dc82015-08-11 22:53:00 +00004609CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004610ClangASTContext::GetFunctionArgumentTypeAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004611{
4612 if (type)
4613 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004614 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004615 if (func)
4616 {
4617 const uint32_t num_args = func->getNumParams();
4618 if (idx < num_args)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004619 return CompilerType(getASTContext(), func->getParamType(idx));
Greg Claytond8d4a572015-08-11 21:38:15 +00004620 }
4621 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004622 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004623}
4624
Greg Claytona1e5dc82015-08-11 22:53:00 +00004625CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004626ClangASTContext::GetFunctionReturnType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004627{
4628 if (type)
4629 {
Greg Clayton8b8874e2015-12-17 00:58:41 +00004630 clang::QualType qual_type(GetQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004631 const clang::FunctionProtoType* func = llvm::dyn_cast<clang::FunctionProtoType>(qual_type.getTypePtr());
4632 if (func)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004633 return CompilerType(getASTContext(), func->getReturnType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004634 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004635 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004636}
4637
4638size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004639ClangASTContext::GetNumMemberFunctions (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004640{
4641 size_t num_functions = 0;
4642 if (type)
4643 {
4644 clang::QualType qual_type(GetCanonicalQualType(type));
4645 switch (qual_type->getTypeClass()) {
4646 case clang::Type::Record:
4647 if (GetCompleteQualType (getASTContext(), qual_type))
4648 {
4649 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4650 const clang::RecordDecl *record_decl = record_type->getDecl();
4651 assert(record_decl);
4652 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4653 if (cxx_record_decl)
4654 num_functions = std::distance(cxx_record_decl->method_begin(), cxx_record_decl->method_end());
4655 }
4656 break;
4657
4658 case clang::Type::ObjCObjectPointer:
4659 if (GetCompleteType(type))
4660 {
4661 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4662 if (objc_class_type)
4663 {
4664 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4665 if (class_interface_decl)
4666 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4667 }
4668 }
4669 break;
4670
4671 case clang::Type::ObjCObject:
4672 case clang::Type::ObjCInterface:
4673 if (GetCompleteType(type))
4674 {
4675 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4676 if (objc_class_type)
4677 {
4678 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4679 if (class_interface_decl)
4680 num_functions = std::distance(class_interface_decl->meth_begin(), class_interface_decl->meth_end());
4681 }
4682 }
4683 break;
4684
4685
4686 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004687 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumMemberFunctions();
Enrico Granata36f51e42015-12-18 22:41:25 +00004688
4689 case clang::Type::Auto:
4690 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004691
4692 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004693 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004694
4695 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004696 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumMemberFunctions();
Greg Claytond8d4a572015-08-11 21:38:15 +00004697
4698 default:
4699 break;
4700 }
4701 }
4702 return num_functions;
4703}
4704
4705TypeMemberFunctionImpl
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004706ClangASTContext::GetMemberFunctionAtIndex (lldb::opaque_compiler_type_t type, size_t idx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004707{
Greg Claytonfe689042015-11-10 17:47:04 +00004708 std::string name;
Greg Claytond8d4a572015-08-11 21:38:15 +00004709 MemberFunctionKind kind(MemberFunctionKind::eMemberFunctionKindUnknown);
Greg Claytonfe689042015-11-10 17:47:04 +00004710 CompilerType clang_type;
4711 CompilerDecl clang_decl;
Greg Claytond8d4a572015-08-11 21:38:15 +00004712 if (type)
4713 {
4714 clang::QualType qual_type(GetCanonicalQualType(type));
4715 switch (qual_type->getTypeClass()) {
4716 case clang::Type::Record:
4717 if (GetCompleteQualType (getASTContext(), qual_type))
4718 {
4719 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
4720 const clang::RecordDecl *record_decl = record_type->getDecl();
4721 assert(record_decl);
4722 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
4723 if (cxx_record_decl)
4724 {
4725 auto method_iter = cxx_record_decl->method_begin();
4726 auto method_end = cxx_record_decl->method_end();
4727 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4728 {
4729 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004730 clang::CXXMethodDecl *cxx_method_decl = method_iter->getCanonicalDecl();
4731 if (cxx_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004732 {
Greg Claytonfe689042015-11-10 17:47:04 +00004733 name = cxx_method_decl->getDeclName().getAsString();
4734 if (cxx_method_decl->isStatic())
Greg Claytond8d4a572015-08-11 21:38:15 +00004735 kind = lldb::eMemberFunctionKindStaticMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004736 else if (llvm::isa<clang::CXXConstructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004737 kind = lldb::eMemberFunctionKindConstructor;
Greg Claytonfe689042015-11-10 17:47:04 +00004738 else if (llvm::isa<clang::CXXDestructorDecl>(cxx_method_decl))
Greg Claytond8d4a572015-08-11 21:38:15 +00004739 kind = lldb::eMemberFunctionKindDestructor;
4740 else
4741 kind = lldb::eMemberFunctionKindInstanceMethod;
Greg Claytonfe689042015-11-10 17:47:04 +00004742 clang_type = CompilerType(this, cxx_method_decl->getType().getAsOpaquePtr());
4743 clang_decl = CompilerDecl(this, cxx_method_decl);
Greg Claytond8d4a572015-08-11 21:38:15 +00004744 }
4745 }
4746 }
4747 }
4748 break;
4749
4750 case clang::Type::ObjCObjectPointer:
4751 if (GetCompleteType(type))
4752 {
4753 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
4754 if (objc_class_type)
4755 {
4756 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
4757 if (class_interface_decl)
4758 {
4759 auto method_iter = class_interface_decl->meth_begin();
4760 auto method_end = class_interface_decl->meth_end();
4761 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4762 {
4763 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004764 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4765 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004766 {
Greg Claytonfe689042015-11-10 17:47:04 +00004767 clang_decl = CompilerDecl(this, objc_method_decl);
4768 name = objc_method_decl->getSelector().getAsString();
4769 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004770 kind = lldb::eMemberFunctionKindStaticMethod;
4771 else
4772 kind = lldb::eMemberFunctionKindInstanceMethod;
4773 }
4774 }
4775 }
4776 }
4777 }
4778 break;
4779
4780 case clang::Type::ObjCObject:
4781 case clang::Type::ObjCInterface:
4782 if (GetCompleteType(type))
4783 {
4784 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
4785 if (objc_class_type)
4786 {
4787 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
4788 if (class_interface_decl)
4789 {
4790 auto method_iter = class_interface_decl->meth_begin();
4791 auto method_end = class_interface_decl->meth_end();
4792 if (idx < static_cast<size_t>(std::distance(method_iter, method_end)))
4793 {
4794 std::advance(method_iter, idx);
Greg Claytonfe689042015-11-10 17:47:04 +00004795 clang::ObjCMethodDecl *objc_method_decl = method_iter->getCanonicalDecl();
4796 if (objc_method_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00004797 {
Greg Claytonfe689042015-11-10 17:47:04 +00004798 clang_decl = CompilerDecl(this, objc_method_decl);
4799 name = objc_method_decl->getSelector().getAsString();
4800 if (objc_method_decl->isClassMethod())
Greg Claytond8d4a572015-08-11 21:38:15 +00004801 kind = lldb::eMemberFunctionKindStaticMethod;
4802 else
4803 kind = lldb::eMemberFunctionKindInstanceMethod;
4804 }
4805 }
4806 }
4807 }
4808 }
4809 break;
4810
4811 case clang::Type::Typedef:
4812 return GetMemberFunctionAtIndex(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx);
Enrico Granata36f51e42015-12-18 22:41:25 +00004813
4814 case clang::Type::Auto:
4815 return GetMemberFunctionAtIndex(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004816
4817 case clang::Type::Elaborated:
4818 return GetMemberFunctionAtIndex(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx);
4819
4820 case clang::Type::Paren:
4821 return GetMemberFunctionAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx);
4822
4823 default:
4824 break;
4825 }
4826 }
4827
4828 if (kind == eMemberFunctionKindUnknown)
4829 return TypeMemberFunctionImpl();
Greg Claytonfe689042015-11-10 17:47:04 +00004830 else
4831 return TypeMemberFunctionImpl(clang_type, clang_decl, name, kind);
Greg Claytond8d4a572015-08-11 21:38:15 +00004832}
4833
Greg Claytona1e5dc82015-08-11 22:53:00 +00004834CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004835ClangASTContext::GetNonReferenceType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004836{
4837 if (type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004838 return CompilerType(getASTContext(), GetQualType(type).getNonReferenceType());
4839 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004840}
4841
Greg Claytona1e5dc82015-08-11 22:53:00 +00004842CompilerType
4843ClangASTContext::CreateTypedefType (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00004844 const char *typedef_name,
Greg Clayton99558cc42015-08-24 23:46:31 +00004845 const CompilerDeclContext &compiler_decl_ctx)
Greg Claytond8d4a572015-08-11 21:38:15 +00004846{
4847 if (type && typedef_name && typedef_name[0])
4848 {
Greg Claytonf73034f2015-09-08 18:15:05 +00004849 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00004850 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00004851 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004852 clang::ASTContext* clang_ast = ast->getASTContext();
Zachary Turnerd133f6a2016-03-28 22:53:41 +00004853 clang::QualType qual_type(ClangUtil::GetQualType(type));
Greg Clayton99558cc42015-08-24 23:46:31 +00004854
4855 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
Greg Claytond8d4a572015-08-11 21:38:15 +00004856 if (decl_ctx == nullptr)
4857 decl_ctx = ast->getASTContext()->getTranslationUnitDecl();
Greg Clayton99558cc42015-08-24 23:46:31 +00004858
Greg Claytond8d4a572015-08-11 21:38:15 +00004859 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4860 decl_ctx,
4861 clang::SourceLocation(),
4862 clang::SourceLocation(),
4863 &clang_ast->Idents.get(typedef_name),
4864 clang_ast->getTrivialTypeSourceInfo(qual_type));
4865
4866 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4867
4868 // Get a uniqued clang::QualType for the typedef decl type
Greg Claytona1e5dc82015-08-11 22:53:00 +00004869 return CompilerType (clang_ast, clang_ast->getTypedefType (decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00004870 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004871 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004872
4873}
4874
Greg Claytona1e5dc82015-08-11 22:53:00 +00004875CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004876ClangASTContext::GetPointeeType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004877{
4878 if (type)
4879 {
4880 clang::QualType qual_type(GetQualType(type));
Greg Claytona1e5dc82015-08-11 22:53:00 +00004881 return CompilerType (getASTContext(), qual_type.getTypePtr()->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00004882 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004883 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004884}
4885
Greg Claytona1e5dc82015-08-11 22:53:00 +00004886CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004887ClangASTContext::GetPointerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00004888{
4889 if (type)
4890 {
4891 clang::QualType qual_type (GetQualType(type));
4892
4893 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
4894 switch (type_class)
4895 {
4896 case clang::Type::ObjCObject:
4897 case clang::Type::ObjCInterface:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004898 return CompilerType(getASTContext(), getASTContext()->getObjCObjectPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004899
4900 default:
Greg Claytona1e5dc82015-08-11 22:53:00 +00004901 return CompilerType(getASTContext(), getASTContext()->getPointerType(qual_type));
Greg Claytond8d4a572015-08-11 21:38:15 +00004902 }
4903 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00004904 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00004905}
4906
Greg Clayton56939cb2015-09-17 22:23:34 +00004907
4908CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004909ClangASTContext::GetLValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004910{
4911 if (type)
4912 return CompilerType(this, getASTContext()->getLValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4913 else
4914 return CompilerType();
4915}
4916
4917CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004918ClangASTContext::GetRValueReferenceType (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004919{
4920 if (type)
4921 return CompilerType(this, getASTContext()->getRValueReferenceType(GetQualType(type)).getAsOpaquePtr());
4922 else
4923 return CompilerType();
4924}
4925
4926CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004927ClangASTContext::AddConstModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004928{
4929 if (type)
4930 {
4931 clang::QualType result(GetQualType(type));
4932 result.addConst();
4933 return CompilerType (this, result.getAsOpaquePtr());
4934 }
4935 return CompilerType();
4936}
4937
4938CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004939ClangASTContext::AddVolatileModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004940{
4941 if (type)
4942 {
4943 clang::QualType result(GetQualType(type));
4944 result.addVolatile();
4945 return CompilerType (this, result.getAsOpaquePtr());
4946 }
4947 return CompilerType();
4948
4949}
4950
4951CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004952ClangASTContext::AddRestrictModifier (lldb::opaque_compiler_type_t type)
Greg Clayton56939cb2015-09-17 22:23:34 +00004953{
4954 if (type)
4955 {
4956 clang::QualType result(GetQualType(type));
4957 result.addRestrict();
4958 return CompilerType (this, result.getAsOpaquePtr());
4959 }
4960 return CompilerType();
4961
4962}
4963
4964CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00004965ClangASTContext::CreateTypedef (lldb::opaque_compiler_type_t type, const char *typedef_name, const CompilerDeclContext &compiler_decl_ctx)
Greg Clayton56939cb2015-09-17 22:23:34 +00004966{
4967 if (type)
4968 {
4969 clang::ASTContext* clang_ast = getASTContext();
4970 clang::QualType qual_type (GetQualType(type));
4971
4972 clang::DeclContext *decl_ctx = ClangASTContext::DeclContextGetAsDeclContext(compiler_decl_ctx);
4973 if (decl_ctx == nullptr)
4974 decl_ctx = getASTContext()->getTranslationUnitDecl();
4975
4976 clang::TypedefDecl *decl = clang::TypedefDecl::Create (*clang_ast,
4977 decl_ctx,
4978 clang::SourceLocation(),
4979 clang::SourceLocation(),
4980 &clang_ast->Idents.get(typedef_name),
4981 clang_ast->getTrivialTypeSourceInfo(qual_type));
4982
Ewan Crawford27fc7a72016-03-15 09:50:16 +00004983 clang::TagDecl *tdecl = nullptr;
4984 if (!qual_type.isNull())
4985 {
4986 if (const clang::RecordType *rt = qual_type->getAs<clang::RecordType>())
4987 tdecl = rt->getDecl();
4988 if (const clang::EnumType *et = qual_type->getAs<clang::EnumType>())
4989 tdecl = et->getDecl();
4990 }
4991
4992 // Check whether this declaration is an anonymous struct, union, or enum, hidden behind a typedef. If so, we
4993 // try to check whether we have a typedef tag to attach to the original record declaration
4994 if (tdecl && !tdecl->getIdentifier() && !tdecl->getTypedefNameForAnonDecl())
4995 tdecl->setTypedefNameForAnonDecl(decl);
4996
Greg Clayton56939cb2015-09-17 22:23:34 +00004997 decl->setAccess(clang::AS_public); // TODO respect proper access specifier
4998
4999 // Get a uniqued clang::QualType for the typedef decl type
5000 return CompilerType (this, clang_ast->getTypedefType (decl).getAsOpaquePtr());
5001
5002 }
5003 return CompilerType();
5004
5005}
5006
Greg Claytona1e5dc82015-08-11 22:53:00 +00005007CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005008ClangASTContext::GetTypedefedType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005009{
5010 if (type)
5011 {
5012 const clang::TypedefType *typedef_type = llvm::dyn_cast<clang::TypedefType>(GetQualType(type));
5013 if (typedef_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005014 return CompilerType (getASTContext(), typedef_type->getDecl()->getUnderlyingType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005015 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005016 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005017}
5018
Greg Claytond8d4a572015-08-11 21:38:15 +00005019
5020//----------------------------------------------------------------------
5021// Create related types using the current type's AST
5022//----------------------------------------------------------------------
5023
Greg Claytona1e5dc82015-08-11 22:53:00 +00005024CompilerType
Greg Clayton99558cc42015-08-24 23:46:31 +00005025ClangASTContext::GetBasicTypeFromAST (lldb::BasicType basic_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005026{
Greg Clayton99558cc42015-08-24 23:46:31 +00005027 return ClangASTContext::GetBasicType(getASTContext(), basic_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00005028}
5029//----------------------------------------------------------------------
5030// Exploring the type
5031//----------------------------------------------------------------------
5032
5033uint64_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005034ClangASTContext::GetBitSize (lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope)
Greg Claytond8d4a572015-08-11 21:38:15 +00005035{
5036 if (GetCompleteType (type))
5037 {
5038 clang::QualType qual_type(GetCanonicalQualType(type));
Greg Clayton6e5c1fe2016-03-29 17:36:38 +00005039 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5040 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00005041 {
Greg Clayton6e5c1fe2016-03-29 17:36:38 +00005042 case clang::Type::Record:
5043 if (GetCompleteType(type))
5044 return getASTContext()->getTypeSize(qual_type);
5045 else
5046 return 0;
5047 break;
5048
Greg Claytond8d4a572015-08-11 21:38:15 +00005049 case clang::Type::ObjCInterface:
5050 case clang::Type::ObjCObject:
5051 {
5052 ExecutionContext exe_ctx (exe_scope);
5053 Process *process = exe_ctx.GetProcessPtr();
5054 if (process)
5055 {
5056 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
5057 if (objc_runtime)
5058 {
5059 uint64_t bit_size = 0;
Greg Claytona1e5dc82015-08-11 22:53:00 +00005060 if (objc_runtime->GetTypeBitSize(CompilerType(getASTContext(), qual_type), bit_size))
Greg Claytond8d4a572015-08-11 21:38:15 +00005061 return bit_size;
5062 }
5063 }
5064 else
5065 {
5066 static bool g_printed = false;
5067 if (!g_printed)
5068 {
5069 StreamString s;
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00005070 DumpTypeDescription(type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00005071
5072 llvm::outs() << "warning: trying to determine the size of type ";
5073 llvm::outs() << s.GetString() << "\n";
5074 llvm::outs() << "without a valid ExecutionContext. this is not reliable. please file a bug against LLDB.\n";
5075 llvm::outs() << "backtrace:\n";
5076 llvm::sys::PrintStackTrace(llvm::outs());
5077 llvm::outs() << "\n";
5078 g_printed = true;
5079 }
5080 }
5081 }
Jason Molenda62e06812016-02-16 04:14:33 +00005082 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00005083 default:
5084 const uint32_t bit_size = getASTContext()->getTypeSize (qual_type);
5085 if (bit_size == 0)
5086 {
5087 if (qual_type->isIncompleteArrayType())
5088 return getASTContext()->getTypeSize (qual_type->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified());
5089 }
5090 if (qual_type->isObjCObjectOrInterfaceType())
5091 return bit_size + getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy);
5092 return bit_size;
5093 }
5094 }
5095 return 0;
5096}
5097
5098size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005099ClangASTContext::GetTypeBitAlign (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005100{
5101 if (GetCompleteType(type))
5102 return getASTContext()->getTypeAlign(GetQualType(type));
5103 return 0;
5104}
5105
5106
5107lldb::Encoding
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005108ClangASTContext::GetEncoding (lldb::opaque_compiler_type_t type, uint64_t &count)
Greg Claytond8d4a572015-08-11 21:38:15 +00005109{
5110 if (!type)
5111 return lldb::eEncodingInvalid;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005112
Greg Claytond8d4a572015-08-11 21:38:15 +00005113 count = 1;
5114 clang::QualType qual_type(GetCanonicalQualType(type));
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005115
Greg Claytond8d4a572015-08-11 21:38:15 +00005116 switch (qual_type->getTypeClass())
5117 {
5118 case clang::Type::UnaryTransform:
5119 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005120
Greg Claytond8d4a572015-08-11 21:38:15 +00005121 case clang::Type::FunctionNoProto:
5122 case clang::Type::FunctionProto:
5123 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005124
Greg Claytond8d4a572015-08-11 21:38:15 +00005125 case clang::Type::IncompleteArray:
5126 case clang::Type::VariableArray:
5127 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005128
Greg Claytond8d4a572015-08-11 21:38:15 +00005129 case clang::Type::ConstantArray:
5130 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005131
Greg Claytond8d4a572015-08-11 21:38:15 +00005132 case clang::Type::ExtVector:
5133 case clang::Type::Vector:
5134 // TODO: Set this to more than one???
5135 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005136
Greg Claytond8d4a572015-08-11 21:38:15 +00005137 case clang::Type::Builtin:
5138 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005139 {
5140 case clang::BuiltinType::Void:
5141 break;
5142
5143 case clang::BuiltinType::Bool:
5144 case clang::BuiltinType::Char_S:
5145 case clang::BuiltinType::SChar:
5146 case clang::BuiltinType::WChar_S:
5147 case clang::BuiltinType::Char16:
5148 case clang::BuiltinType::Char32:
5149 case clang::BuiltinType::Short:
5150 case clang::BuiltinType::Int:
5151 case clang::BuiltinType::Long:
5152 case clang::BuiltinType::LongLong:
5153 case clang::BuiltinType::Int128:
5154 return lldb::eEncodingSint;
5155
5156 case clang::BuiltinType::Char_U:
5157 case clang::BuiltinType::UChar:
5158 case clang::BuiltinType::WChar_U:
5159 case clang::BuiltinType::UShort:
5160 case clang::BuiltinType::UInt:
5161 case clang::BuiltinType::ULong:
5162 case clang::BuiltinType::ULongLong:
5163 case clang::BuiltinType::UInt128:
5164 return lldb::eEncodingUint;
5165
5166 case clang::BuiltinType::Half:
5167 case clang::BuiltinType::Float:
5168 case clang::BuiltinType::Float128:
5169 case clang::BuiltinType::Double:
5170 case clang::BuiltinType::LongDouble:
5171 return lldb::eEncodingIEEE754;
5172
5173 case clang::BuiltinType::ObjCClass:
5174 case clang::BuiltinType::ObjCId:
5175 case clang::BuiltinType::ObjCSel:
5176 return lldb::eEncodingUint;
5177
5178 case clang::BuiltinType::NullPtr:
5179 return lldb::eEncodingUint;
5180
5181 case clang::BuiltinType::Kind::ARCUnbridgedCast:
5182 case clang::BuiltinType::Kind::BoundMember:
5183 case clang::BuiltinType::Kind::BuiltinFn:
5184 case clang::BuiltinType::Kind::Dependent:
5185 case clang::BuiltinType::Kind::OCLClkEvent:
5186 case clang::BuiltinType::Kind::OCLEvent:
5187 case clang::BuiltinType::Kind::OCLImage1dRO:
5188 case clang::BuiltinType::Kind::OCLImage1dWO:
5189 case clang::BuiltinType::Kind::OCLImage1dRW:
5190 case clang::BuiltinType::Kind::OCLImage1dArrayRO:
5191 case clang::BuiltinType::Kind::OCLImage1dArrayWO:
5192 case clang::BuiltinType::Kind::OCLImage1dArrayRW:
5193 case clang::BuiltinType::Kind::OCLImage1dBufferRO:
5194 case clang::BuiltinType::Kind::OCLImage1dBufferWO:
5195 case clang::BuiltinType::Kind::OCLImage1dBufferRW:
5196 case clang::BuiltinType::Kind::OCLImage2dRO:
5197 case clang::BuiltinType::Kind::OCLImage2dWO:
5198 case clang::BuiltinType::Kind::OCLImage2dRW:
5199 case clang::BuiltinType::Kind::OCLImage2dArrayRO:
5200 case clang::BuiltinType::Kind::OCLImage2dArrayWO:
5201 case clang::BuiltinType::Kind::OCLImage2dArrayRW:
5202 case clang::BuiltinType::Kind::OCLImage2dArrayDepthRO:
5203 case clang::BuiltinType::Kind::OCLImage2dArrayDepthWO:
5204 case clang::BuiltinType::Kind::OCLImage2dArrayDepthRW:
5205 case clang::BuiltinType::Kind::OCLImage2dArrayMSAARO:
5206 case clang::BuiltinType::Kind::OCLImage2dArrayMSAAWO:
5207 case clang::BuiltinType::Kind::OCLImage2dArrayMSAARW:
5208 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRO:
5209 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthWO:
5210 case clang::BuiltinType::Kind::OCLImage2dArrayMSAADepthRW:
5211 case clang::BuiltinType::Kind::OCLImage2dDepthRO:
5212 case clang::BuiltinType::Kind::OCLImage2dDepthWO:
5213 case clang::BuiltinType::Kind::OCLImage2dDepthRW:
5214 case clang::BuiltinType::Kind::OCLImage2dMSAARO:
5215 case clang::BuiltinType::Kind::OCLImage2dMSAAWO:
5216 case clang::BuiltinType::Kind::OCLImage2dMSAARW:
5217 case clang::BuiltinType::Kind::OCLImage2dMSAADepthRO:
5218 case clang::BuiltinType::Kind::OCLImage2dMSAADepthWO:
5219 case clang::BuiltinType::Kind::OCLImage2dMSAADepthRW:
5220 case clang::BuiltinType::Kind::OCLImage3dRO:
5221 case clang::BuiltinType::Kind::OCLImage3dWO:
5222 case clang::BuiltinType::Kind::OCLImage3dRW:
5223 case clang::BuiltinType::Kind::OCLQueue:
5224 case clang::BuiltinType::Kind::OCLNDRange:
5225 case clang::BuiltinType::Kind::OCLReserveID:
5226 case clang::BuiltinType::Kind::OCLSampler:
5227 case clang::BuiltinType::Kind::OMPArraySection:
5228 case clang::BuiltinType::Kind::Overload:
5229 case clang::BuiltinType::Kind::PseudoObject:
5230 case clang::BuiltinType::Kind::UnknownAny:
5231 break;
5232 }
Greg Claytond8d4a572015-08-11 21:38:15 +00005233 break;
5234 // All pointer types are represented as unsigned integer encodings.
5235 // We may nee to add a eEncodingPointer if we ever need to know the
5236 // difference
5237 case clang::Type::ObjCObjectPointer:
5238 case clang::Type::BlockPointer:
5239 case clang::Type::Pointer:
5240 case clang::Type::LValueReference:
5241 case clang::Type::RValueReference:
5242 case clang::Type::MemberPointer: return lldb::eEncodingUint;
5243 case clang::Type::Complex:
5244 {
5245 lldb::Encoding encoding = lldb::eEncodingIEEE754;
5246 if (qual_type->isComplexType())
5247 encoding = lldb::eEncodingIEEE754;
5248 else
5249 {
5250 const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
5251 if (complex_type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005252 encoding = CompilerType(getASTContext(), complex_type->getElementType()).GetEncoding(count);
Greg Claytond8d4a572015-08-11 21:38:15 +00005253 else
5254 encoding = lldb::eEncodingSint;
5255 }
5256 count = 2;
5257 return encoding;
5258 }
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005259
Greg Claytond8d4a572015-08-11 21:38:15 +00005260 case clang::Type::ObjCInterface: break;
5261 case clang::Type::Record: break;
5262 case clang::Type::Enum: return lldb::eEncodingSint;
5263 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005264 return CompilerType(getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetEncoding(count);
Enrico Granata36f51e42015-12-18 22:41:25 +00005265
5266 case clang::Type::Auto:
5267 return CompilerType(getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetEncoding(count);
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005268
Greg Claytond8d4a572015-08-11 21:38:15 +00005269 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005270 return CompilerType(getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetEncoding(count);
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005271
Greg Claytond8d4a572015-08-11 21:38:15 +00005272 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005273 return CompilerType(getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetEncoding(count);
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005274
Greg Claytond8d4a572015-08-11 21:38:15 +00005275 case clang::Type::DependentSizedArray:
5276 case clang::Type::DependentSizedExtVector:
5277 case clang::Type::UnresolvedUsing:
5278 case clang::Type::Attributed:
5279 case clang::Type::TemplateTypeParm:
5280 case clang::Type::SubstTemplateTypeParm:
5281 case clang::Type::SubstTemplateTypeParmPack:
Greg Claytond8d4a572015-08-11 21:38:15 +00005282 case clang::Type::InjectedClassName:
5283 case clang::Type::DependentName:
5284 case clang::Type::DependentTemplateSpecialization:
5285 case clang::Type::PackExpansion:
5286 case clang::Type::ObjCObject:
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005287
Greg Claytond8d4a572015-08-11 21:38:15 +00005288 case clang::Type::TypeOfExpr:
5289 case clang::Type::TypeOf:
5290 case clang::Type::Decltype:
5291 case clang::Type::TemplateSpecialization:
5292 case clang::Type::Atomic:
5293 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00005294 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00005295 break;
Saleem Abdulrasoolf431e682016-05-15 18:18:16 +00005296
Greg Claytond8d4a572015-08-11 21:38:15 +00005297 // pointer type decayed from an array or function type.
5298 case clang::Type::Decayed:
5299 break;
5300 }
5301 count = 0;
5302 return lldb::eEncodingInvalid;
5303}
5304
5305lldb::Format
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005306ClangASTContext::GetFormat (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005307{
5308 if (!type)
5309 return lldb::eFormatDefault;
5310
5311 clang::QualType qual_type(GetCanonicalQualType(type));
5312
5313 switch (qual_type->getTypeClass())
5314 {
5315 case clang::Type::UnaryTransform:
5316 break;
5317
5318 case clang::Type::FunctionNoProto:
5319 case clang::Type::FunctionProto:
5320 break;
5321
5322 case clang::Type::IncompleteArray:
5323 case clang::Type::VariableArray:
5324 break;
5325
5326 case clang::Type::ConstantArray:
5327 return lldb::eFormatVoid; // no value
5328
5329 case clang::Type::ExtVector:
5330 case clang::Type::Vector:
5331 break;
5332
5333 case clang::Type::Builtin:
5334 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5335 {
5336 //default: assert(0 && "Unknown builtin type!");
5337 case clang::BuiltinType::UnknownAny:
5338 case clang::BuiltinType::Void:
5339 case clang::BuiltinType::BoundMember:
5340 break;
5341
5342 case clang::BuiltinType::Bool: return lldb::eFormatBoolean;
5343 case clang::BuiltinType::Char_S:
5344 case clang::BuiltinType::SChar:
5345 case clang::BuiltinType::WChar_S:
5346 case clang::BuiltinType::Char_U:
5347 case clang::BuiltinType::UChar:
5348 case clang::BuiltinType::WChar_U: return lldb::eFormatChar;
5349 case clang::BuiltinType::Char16: return lldb::eFormatUnicode16;
5350 case clang::BuiltinType::Char32: return lldb::eFormatUnicode32;
5351 case clang::BuiltinType::UShort: return lldb::eFormatUnsigned;
5352 case clang::BuiltinType::Short: return lldb::eFormatDecimal;
5353 case clang::BuiltinType::UInt: return lldb::eFormatUnsigned;
5354 case clang::BuiltinType::Int: return lldb::eFormatDecimal;
5355 case clang::BuiltinType::ULong: return lldb::eFormatUnsigned;
5356 case clang::BuiltinType::Long: return lldb::eFormatDecimal;
5357 case clang::BuiltinType::ULongLong: return lldb::eFormatUnsigned;
5358 case clang::BuiltinType::LongLong: return lldb::eFormatDecimal;
5359 case clang::BuiltinType::UInt128: return lldb::eFormatUnsigned;
5360 case clang::BuiltinType::Int128: return lldb::eFormatDecimal;
Greg Claytondee40e72015-11-03 23:23:22 +00005361 case clang::BuiltinType::Half:
5362 case clang::BuiltinType::Float:
5363 case clang::BuiltinType::Double:
Greg Claytond8d4a572015-08-11 21:38:15 +00005364 case clang::BuiltinType::LongDouble: return lldb::eFormatFloat;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005365 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005366 return lldb::eFormatHex;
5367 }
5368 break;
5369 case clang::Type::ObjCObjectPointer: return lldb::eFormatHex;
5370 case clang::Type::BlockPointer: return lldb::eFormatHex;
5371 case clang::Type::Pointer: return lldb::eFormatHex;
5372 case clang::Type::LValueReference:
5373 case clang::Type::RValueReference: return lldb::eFormatHex;
5374 case clang::Type::MemberPointer: break;
5375 case clang::Type::Complex:
5376 {
5377 if (qual_type->isComplexType())
5378 return lldb::eFormatComplex;
5379 else
5380 return lldb::eFormatComplexInteger;
5381 }
5382 case clang::Type::ObjCInterface: break;
5383 case clang::Type::Record: break;
5384 case clang::Type::Enum: return lldb::eFormatEnum;
5385 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005386 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005387 case clang::Type::Auto:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005388 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005389 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005390 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005391 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005392 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetFormat();
Greg Claytond8d4a572015-08-11 21:38:15 +00005393 case clang::Type::DependentSizedArray:
5394 case clang::Type::DependentSizedExtVector:
5395 case clang::Type::UnresolvedUsing:
5396 case clang::Type::Attributed:
5397 case clang::Type::TemplateTypeParm:
5398 case clang::Type::SubstTemplateTypeParm:
5399 case clang::Type::SubstTemplateTypeParmPack:
5400 case clang::Type::InjectedClassName:
5401 case clang::Type::DependentName:
5402 case clang::Type::DependentTemplateSpecialization:
5403 case clang::Type::PackExpansion:
5404 case clang::Type::ObjCObject:
5405
5406 case clang::Type::TypeOfExpr:
5407 case clang::Type::TypeOf:
5408 case clang::Type::Decltype:
5409 case clang::Type::TemplateSpecialization:
5410 case clang::Type::Atomic:
5411 case clang::Type::Adjusted:
Pavel Labath484f0a32016-01-12 08:51:28 +00005412 case clang::Type::Pipe:
Greg Claytond8d4a572015-08-11 21:38:15 +00005413 break;
5414
5415 // pointer type decayed from an array or function type.
5416 case clang::Type::Decayed:
5417 break;
5418 }
5419 // We don't know hot to display this type...
5420 return lldb::eFormatBytes;
5421}
5422
5423static bool
5424ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
5425{
5426 while (class_interface_decl)
5427 {
5428 if (class_interface_decl->ivar_size() > 0)
5429 return true;
5430
5431 if (check_superclass)
5432 class_interface_decl = class_interface_decl->getSuperClass();
5433 else
5434 break;
5435 }
5436 return false;
5437}
5438
5439uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005440ClangASTContext::GetNumChildren (lldb::opaque_compiler_type_t type, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00005441{
5442 if (!type)
5443 return 0;
5444
5445 uint32_t num_children = 0;
5446 clang::QualType qual_type(GetQualType(type));
5447 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5448 switch (type_class)
5449 {
5450 case clang::Type::Builtin:
5451 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5452 {
5453 case clang::BuiltinType::ObjCId: // child is Class
5454 case clang::BuiltinType::ObjCClass: // child is Class
5455 num_children = 1;
5456 break;
5457
5458 default:
5459 break;
5460 }
5461 break;
5462
5463 case clang::Type::Complex: return 0;
5464
5465 case clang::Type::Record:
5466 if (GetCompleteQualType (getASTContext(), qual_type))
5467 {
5468 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5469 const clang::RecordDecl *record_decl = record_type->getDecl();
5470 assert(record_decl);
5471 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
5472 if (cxx_record_decl)
5473 {
5474 if (omit_empty_base_classes)
5475 {
5476 // Check each base classes to see if it or any of its
5477 // base classes contain any fields. This can help
5478 // limit the noise in variable views by not having to
5479 // show base classes that contain no members.
5480 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
5481 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
5482 base_class != base_class_end;
5483 ++base_class)
5484 {
5485 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
5486
5487 // Skip empty base classes
5488 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
5489 continue;
5490
5491 num_children++;
5492 }
5493 }
5494 else
5495 {
5496 // Include all base classes
5497 num_children += cxx_record_decl->getNumBases();
5498 }
5499
5500 }
5501 clang::RecordDecl::field_iterator field, field_end;
5502 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5503 ++num_children;
5504 }
5505 break;
5506
5507 case clang::Type::ObjCObject:
5508 case clang::Type::ObjCInterface:
5509 if (GetCompleteQualType (getASTContext(), qual_type))
5510 {
5511 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5512 assert (objc_class_type);
5513 if (objc_class_type)
5514 {
5515 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5516
5517 if (class_interface_decl)
5518 {
5519
5520 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
5521 if (superclass_interface_decl)
5522 {
5523 if (omit_empty_base_classes)
5524 {
5525 if (ObjCDeclHasIVars (superclass_interface_decl, true))
5526 ++num_children;
5527 }
5528 else
5529 ++num_children;
5530 }
5531
5532 num_children += class_interface_decl->ivar_size();
5533 }
5534 }
5535 }
5536 break;
5537
5538 case clang::Type::ObjCObjectPointer:
5539 {
5540 const clang::ObjCObjectPointerType *pointer_type = llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr());
5541 clang::QualType pointee_type = pointer_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005542 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005543 // If this type points to a simple type, then it has 1 child
5544 if (num_pointee_children == 0)
5545 num_children = 1;
5546 else
5547 num_children = num_pointee_children;
5548 }
5549 break;
5550
5551 case clang::Type::Vector:
5552 case clang::Type::ExtVector:
5553 num_children = llvm::cast<clang::VectorType>(qual_type.getTypePtr())->getNumElements();
5554 break;
5555
5556 case clang::Type::ConstantArray:
5557 num_children = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
5558 break;
5559
5560 case clang::Type::Pointer:
5561 {
5562 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
5563 clang::QualType pointee_type (pointer_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00005564 uint32_t num_pointee_children = CompilerType (getASTContext(),pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005565 if (num_pointee_children == 0)
5566 {
5567 // We have a pointer to a pointee type that claims it has no children.
5568 // We will want to look at
5569 num_children = GetNumPointeeChildren (pointee_type);
5570 }
5571 else
5572 num_children = num_pointee_children;
5573 }
5574 break;
5575
5576 case clang::Type::LValueReference:
5577 case clang::Type::RValueReference:
5578 {
5579 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
5580 clang::QualType pointee_type = reference_type->getPointeeType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005581 uint32_t num_pointee_children = CompilerType (getASTContext(), pointee_type).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005582 // If this type points to a simple type, then it has 1 child
5583 if (num_pointee_children == 0)
5584 num_children = 1;
5585 else
5586 num_children = num_pointee_children;
5587 }
5588 break;
5589
5590
5591 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005592 num_children = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005593 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005594
5595 case clang::Type::Auto:
5596 num_children = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumChildren (omit_empty_base_classes);
5597 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005598
5599 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005600 num_children = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005601 break;
5602
5603 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005604 num_children = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumChildren (omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00005605 break;
5606 default:
5607 break;
5608 }
5609 return num_children;
5610}
5611
Greg Clayton56939cb2015-09-17 22:23:34 +00005612CompilerType
5613ClangASTContext::GetBuiltinTypeByName (const ConstString &name)
5614{
Zachary Turner42dff792016-04-15 00:21:26 +00005615 return GetBasicType(GetBasicTypeEnumeration(name));
Greg Clayton56939cb2015-09-17 22:23:34 +00005616}
5617
Greg Claytond8d4a572015-08-11 21:38:15 +00005618lldb::BasicType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005619ClangASTContext::GetBasicTypeEnumeration (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005620{
5621 if (type)
5622 {
5623 clang::QualType qual_type(GetQualType(type));
5624 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5625 if (type_class == clang::Type::Builtin)
5626 {
5627 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
5628 {
5629 case clang::BuiltinType::Void: return eBasicTypeVoid;
5630 case clang::BuiltinType::Bool: return eBasicTypeBool;
5631 case clang::BuiltinType::Char_S: return eBasicTypeSignedChar;
5632 case clang::BuiltinType::Char_U: return eBasicTypeUnsignedChar;
5633 case clang::BuiltinType::Char16: return eBasicTypeChar16;
5634 case clang::BuiltinType::Char32: return eBasicTypeChar32;
5635 case clang::BuiltinType::UChar: return eBasicTypeUnsignedChar;
5636 case clang::BuiltinType::SChar: return eBasicTypeSignedChar;
5637 case clang::BuiltinType::WChar_S: return eBasicTypeSignedWChar;
5638 case clang::BuiltinType::WChar_U: return eBasicTypeUnsignedWChar;
5639 case clang::BuiltinType::Short: return eBasicTypeShort;
5640 case clang::BuiltinType::UShort: return eBasicTypeUnsignedShort;
5641 case clang::BuiltinType::Int: return eBasicTypeInt;
5642 case clang::BuiltinType::UInt: return eBasicTypeUnsignedInt;
5643 case clang::BuiltinType::Long: return eBasicTypeLong;
5644 case clang::BuiltinType::ULong: return eBasicTypeUnsignedLong;
5645 case clang::BuiltinType::LongLong: return eBasicTypeLongLong;
5646 case clang::BuiltinType::ULongLong: return eBasicTypeUnsignedLongLong;
5647 case clang::BuiltinType::Int128: return eBasicTypeInt128;
5648 case clang::BuiltinType::UInt128: return eBasicTypeUnsignedInt128;
5649
5650 case clang::BuiltinType::Half: return eBasicTypeHalf;
5651 case clang::BuiltinType::Float: return eBasicTypeFloat;
5652 case clang::BuiltinType::Double: return eBasicTypeDouble;
5653 case clang::BuiltinType::LongDouble:return eBasicTypeLongDouble;
5654
5655 case clang::BuiltinType::NullPtr: return eBasicTypeNullPtr;
5656 case clang::BuiltinType::ObjCId: return eBasicTypeObjCID;
5657 case clang::BuiltinType::ObjCClass: return eBasicTypeObjCClass;
5658 case clang::BuiltinType::ObjCSel: return eBasicTypeObjCSel;
Zachary Turnerdd07e002015-09-16 18:08:45 +00005659 default:
Greg Claytond8d4a572015-08-11 21:38:15 +00005660 return eBasicTypeOther;
5661 }
5662 }
5663 }
5664 return eBasicTypeInvalid;
5665}
5666
Greg Clayton99558cc42015-08-24 23:46:31 +00005667void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005668ClangASTContext::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 +00005669{
5670 const clang::EnumType *enum_type = llvm::dyn_cast<clang::EnumType>(GetCanonicalQualType(type));
5671 if (enum_type)
5672 {
5673 const clang::EnumDecl *enum_decl = enum_type->getDecl();
5674 if (enum_decl)
5675 {
5676 CompilerType integer_type(this, enum_decl->getIntegerType().getAsOpaquePtr());
5677
5678 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
5679 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
5680 {
5681 ConstString name(enum_pos->getNameAsString().c_str());
5682 if (!callback (integer_type, name, enum_pos->getInitVal()))
5683 break;
5684 }
5685 }
5686 }
5687}
5688
Greg Claytond8d4a572015-08-11 21:38:15 +00005689
5690#pragma mark Aggregate Types
5691
5692uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005693ClangASTContext::GetNumFields (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00005694{
5695 if (!type)
5696 return 0;
5697
5698 uint32_t count = 0;
5699 clang::QualType qual_type(GetCanonicalQualType(type));
5700 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5701 switch (type_class)
5702 {
5703 case clang::Type::Record:
5704 if (GetCompleteType(type))
5705 {
5706 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(qual_type.getTypePtr());
5707 if (record_type)
5708 {
5709 clang::RecordDecl *record_decl = record_type->getDecl();
5710 if (record_decl)
5711 {
5712 uint32_t field_idx = 0;
5713 clang::RecordDecl::field_iterator field, field_end;
5714 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
5715 ++field_idx;
5716 count = field_idx;
5717 }
5718 }
5719 }
5720 break;
5721
5722 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005723 count = CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005724 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00005725
5726 case clang::Type::Auto:
5727 count = CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetNumFields();
5728 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00005729
5730 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005731 count = CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005732 break;
5733
5734 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005735 count = CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetNumFields();
Greg Claytond8d4a572015-08-11 21:38:15 +00005736 break;
5737
5738 case clang::Type::ObjCObjectPointer:
5739 if (GetCompleteType(type))
5740 {
5741 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5742 if (objc_class_type)
5743 {
5744 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
5745
5746 if (class_interface_decl)
5747 count = class_interface_decl->ivar_size();
5748 }
5749 }
5750 break;
5751
5752 case clang::Type::ObjCObject:
5753 case clang::Type::ObjCInterface:
5754 if (GetCompleteType(type))
5755 {
5756 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5757 if (objc_class_type)
5758 {
5759 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5760
5761 if (class_interface_decl)
5762 count = class_interface_decl->ivar_size();
5763 }
5764 }
5765 break;
5766
5767 default:
5768 break;
5769 }
5770 return count;
5771}
5772
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005773static lldb::opaque_compiler_type_t
Greg Claytond8d4a572015-08-11 21:38:15 +00005774GetObjCFieldAtIndex (clang::ASTContext *ast,
5775 clang::ObjCInterfaceDecl *class_interface_decl,
5776 size_t idx,
5777 std::string& name,
5778 uint64_t *bit_offset_ptr,
5779 uint32_t *bitfield_bit_size_ptr,
5780 bool *is_bitfield_ptr)
5781{
5782 if (class_interface_decl)
5783 {
5784 if (idx < (class_interface_decl->ivar_size()))
5785 {
5786 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
5787 uint32_t ivar_idx = 0;
5788
5789 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
5790 {
5791 if (ivar_idx == idx)
5792 {
5793 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
5794
5795 clang::QualType ivar_qual_type(ivar_decl->getType());
5796
5797 name.assign(ivar_decl->getNameAsString());
5798
5799 if (bit_offset_ptr)
5800 {
5801 const clang::ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
5802 *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
5803 }
5804
5805 const bool is_bitfield = ivar_pos->isBitField();
5806
5807 if (bitfield_bit_size_ptr)
5808 {
5809 *bitfield_bit_size_ptr = 0;
5810
5811 if (is_bitfield && ast)
5812 {
5813 clang::Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
5814 llvm::APSInt bitfield_apsint;
5815 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
5816 {
5817 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5818 }
5819 }
5820 }
5821 if (is_bitfield_ptr)
5822 *is_bitfield_ptr = is_bitfield;
5823
5824 return ivar_qual_type.getAsOpaquePtr();
5825 }
5826 }
5827 }
5828 }
5829 return nullptr;
5830}
5831
Greg Claytona1e5dc82015-08-11 22:53:00 +00005832CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005833ClangASTContext::GetFieldAtIndex (lldb::opaque_compiler_type_t type, size_t idx,
Greg Claytond8d4a572015-08-11 21:38:15 +00005834 std::string& name,
5835 uint64_t *bit_offset_ptr,
5836 uint32_t *bitfield_bit_size_ptr,
5837 bool *is_bitfield_ptr)
5838{
5839 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00005840 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005841
5842 clang::QualType qual_type(GetCanonicalQualType(type));
5843 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5844 switch (type_class)
5845 {
5846 case clang::Type::Record:
5847 if (GetCompleteType(type))
5848 {
5849 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
5850 const clang::RecordDecl *record_decl = record_type->getDecl();
5851 uint32_t field_idx = 0;
5852 clang::RecordDecl::field_iterator field, field_end;
5853 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
5854 {
5855 if (idx == field_idx)
5856 {
5857 // Print the member type if requested
5858 // Print the member name and equal sign
5859 name.assign(field->getNameAsString());
5860
5861 // Figure out the type byte size (field_type_info.first) and
5862 // alignment (field_type_info.second) from the AST context.
5863 if (bit_offset_ptr)
5864 {
5865 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
5866 *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
5867 }
5868
5869 const bool is_bitfield = field->isBitField();
5870
5871 if (bitfield_bit_size_ptr)
5872 {
5873 *bitfield_bit_size_ptr = 0;
5874
5875 if (is_bitfield)
5876 {
5877 clang::Expr *bitfield_bit_size_expr = field->getBitWidth();
5878 llvm::APSInt bitfield_apsint;
5879 if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *getASTContext()))
5880 {
5881 *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
5882 }
5883 }
5884 }
5885 if (is_bitfield_ptr)
5886 *is_bitfield_ptr = is_bitfield;
5887
Greg Claytona1e5dc82015-08-11 22:53:00 +00005888 return CompilerType (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00005889 }
5890 }
5891 }
5892 break;
5893
5894 case clang::Type::ObjCObjectPointer:
5895 if (GetCompleteType(type))
5896 {
5897 const clang::ObjCObjectPointerType *objc_class_type = qual_type->getAsObjCInterfacePointerType();
5898 if (objc_class_type)
5899 {
5900 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterfaceDecl();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005901 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 +00005902 }
5903 }
5904 break;
5905
5906 case clang::Type::ObjCObject:
5907 case clang::Type::ObjCInterface:
5908 if (GetCompleteType(type))
5909 {
5910 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
5911 assert (objc_class_type);
5912 if (objc_class_type)
5913 {
5914 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
Greg Claytona1e5dc82015-08-11 22:53:00 +00005915 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 +00005916 }
5917 }
5918 break;
5919
5920
5921 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005922 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005923 GetFieldAtIndex (idx,
5924 name,
5925 bit_offset_ptr,
5926 bitfield_bit_size_ptr,
5927 is_bitfield_ptr);
5928
Enrico Granata36f51e42015-12-18 22:41:25 +00005929 case clang::Type::Auto:
5930 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).
5931 GetFieldAtIndex (idx,
5932 name,
5933 bit_offset_ptr,
5934 bitfield_bit_size_ptr,
5935 is_bitfield_ptr);
5936
Greg Claytond8d4a572015-08-11 21:38:15 +00005937 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005938 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005939 GetFieldAtIndex (idx,
5940 name,
5941 bit_offset_ptr,
5942 bitfield_bit_size_ptr,
5943 is_bitfield_ptr);
5944
5945 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00005946 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).
Greg Claytond8d4a572015-08-11 21:38:15 +00005947 GetFieldAtIndex (idx,
5948 name,
5949 bit_offset_ptr,
5950 bitfield_bit_size_ptr,
5951 is_bitfield_ptr);
5952
5953 default:
5954 break;
5955 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00005956 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00005957}
5958
Greg Clayton99558cc42015-08-24 23:46:31 +00005959uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00005960ClangASTContext::GetNumDirectBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00005961{
5962 uint32_t count = 0;
5963 clang::QualType qual_type(GetCanonicalQualType(type));
5964 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
5965 switch (type_class)
5966 {
5967 case clang::Type::Record:
5968 if (GetCompleteType(type))
5969 {
5970 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
5971 if (cxx_record_decl)
5972 count = cxx_record_decl->getNumBases();
5973 }
5974 break;
5975
5976 case clang::Type::ObjCObjectPointer:
5977 count = GetPointeeType(type).GetNumDirectBaseClasses();
5978 break;
5979
5980 case clang::Type::ObjCObject:
5981 if (GetCompleteType(type))
5982 {
5983 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
5984 if (objc_class_type)
5985 {
5986 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
5987
5988 if (class_interface_decl && class_interface_decl->getSuperClass())
5989 count = 1;
5990 }
5991 }
5992 break;
5993 case clang::Type::ObjCInterface:
5994 if (GetCompleteType(type))
5995 {
5996 const clang::ObjCInterfaceType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
5997 if (objc_interface_type)
5998 {
5999 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
6000
6001 if (class_interface_decl && class_interface_decl->getSuperClass())
6002 count = 1;
6003 }
6004 }
6005 break;
6006
6007
6008 case clang::Type::Typedef:
6009 count = GetNumDirectBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
6010 break;
6011
Enrico Granata36f51e42015-12-18 22:41:25 +00006012 case clang::Type::Auto:
6013 count = GetNumDirectBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
6014 break;
6015
Greg Clayton99558cc42015-08-24 23:46:31 +00006016 case clang::Type::Elaborated:
6017 count = GetNumDirectBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
6018 break;
6019
6020 case clang::Type::Paren:
6021 return GetNumDirectBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
6022
6023 default:
6024 break;
6025 }
6026 return count;
6027
6028}
6029
6030uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006031ClangASTContext::GetNumVirtualBaseClasses (lldb::opaque_compiler_type_t type)
Greg Clayton99558cc42015-08-24 23:46:31 +00006032{
6033 uint32_t count = 0;
6034 clang::QualType qual_type(GetCanonicalQualType(type));
6035 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6036 switch (type_class)
6037 {
6038 case clang::Type::Record:
6039 if (GetCompleteType(type))
6040 {
6041 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6042 if (cxx_record_decl)
6043 count = cxx_record_decl->getNumVBases();
6044 }
6045 break;
6046
6047 case clang::Type::Typedef:
6048 count = GetNumVirtualBaseClasses(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
6049 break;
6050
Enrico Granata36f51e42015-12-18 22:41:25 +00006051 case clang::Type::Auto:
6052 count = GetNumVirtualBaseClasses(llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr());
6053 break;
6054
Greg Clayton99558cc42015-08-24 23:46:31 +00006055 case clang::Type::Elaborated:
6056 count = GetNumVirtualBaseClasses(llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
6057 break;
6058
6059 case clang::Type::Paren:
6060 count = GetNumVirtualBaseClasses(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr());
6061 break;
6062
6063 default:
6064 break;
6065 }
6066 return count;
6067
6068}
6069
6070CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006071ClangASTContext::GetDirectBaseClassAtIndex (lldb::opaque_compiler_type_t type, size_t idx, uint32_t *bit_offset_ptr)
Greg Clayton99558cc42015-08-24 23:46:31 +00006072{
6073 clang::QualType qual_type(GetCanonicalQualType(type));
6074 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6075 switch (type_class)
6076 {
6077 case clang::Type::Record:
6078 if (GetCompleteType(type))
6079 {
6080 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6081 if (cxx_record_decl)
6082 {
6083 uint32_t curr_idx = 0;
6084 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6085 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6086 base_class != base_class_end;
6087 ++base_class, ++curr_idx)
6088 {
6089 if (curr_idx == idx)
6090 {
6091 if (bit_offset_ptr)
6092 {
6093 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
6094 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6095 if (base_class->isVirtual())
6096 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6097 else
6098 *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6099 }
6100 return CompilerType (this, base_class->getType().getAsOpaquePtr());
6101 }
6102 }
6103 }
6104 }
6105 break;
6106
6107 case clang::Type::ObjCObjectPointer:
6108 return GetPointeeType(type).GetDirectBaseClassAtIndex(idx, bit_offset_ptr);
6109
6110 case clang::Type::ObjCObject:
6111 if (idx == 0 && GetCompleteType(type))
6112 {
6113 const clang::ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
6114 if (objc_class_type)
6115 {
6116 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6117
6118 if (class_interface_decl)
6119 {
6120 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6121 if (superclass_interface_decl)
6122 {
6123 if (bit_offset_ptr)
6124 *bit_offset_ptr = 0;
6125 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6126 }
6127 }
6128 }
6129 }
6130 break;
6131 case clang::Type::ObjCInterface:
6132 if (idx == 0 && GetCompleteType(type))
6133 {
6134 const clang::ObjCObjectType *objc_interface_type = qual_type->getAs<clang::ObjCInterfaceType>();
6135 if (objc_interface_type)
6136 {
6137 clang::ObjCInterfaceDecl *class_interface_decl = objc_interface_type->getInterface();
6138
6139 if (class_interface_decl)
6140 {
6141 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6142 if (superclass_interface_decl)
6143 {
6144 if (bit_offset_ptr)
6145 *bit_offset_ptr = 0;
6146 return CompilerType (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6147 }
6148 }
6149 }
6150 }
6151 break;
6152
6153
6154 case clang::Type::Typedef:
6155 return GetDirectBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
6156
Enrico Granata36f51e42015-12-18 22:41:25 +00006157 case clang::Type::Auto:
6158 return GetDirectBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
6159
Greg Clayton99558cc42015-08-24 23:46:31 +00006160 case clang::Type::Elaborated:
6161 return GetDirectBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
6162
6163 case clang::Type::Paren:
6164 return GetDirectBaseClassAtIndex (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx, bit_offset_ptr);
6165
6166 default:
6167 break;
6168 }
6169 return CompilerType();
6170}
6171
6172CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006173ClangASTContext::GetVirtualBaseClassAtIndex (lldb::opaque_compiler_type_t type,
Greg Clayton99558cc42015-08-24 23:46:31 +00006174 size_t idx,
6175 uint32_t *bit_offset_ptr)
6176{
6177 clang::QualType qual_type(GetCanonicalQualType(type));
6178 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6179 switch (type_class)
6180 {
6181 case clang::Type::Record:
6182 if (GetCompleteType(type))
6183 {
6184 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
6185 if (cxx_record_decl)
6186 {
6187 uint32_t curr_idx = 0;
6188 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6189 for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
6190 base_class != base_class_end;
6191 ++base_class, ++curr_idx)
6192 {
6193 if (curr_idx == idx)
6194 {
6195 if (bit_offset_ptr)
6196 {
6197 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(cxx_record_decl);
6198 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6199 *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6200
6201 }
6202 return CompilerType (this, base_class->getType().getAsOpaquePtr());
6203 }
6204 }
6205 }
6206 }
6207 break;
6208
6209 case clang::Type::Typedef:
6210 return GetVirtualBaseClassAtIndex (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), idx, bit_offset_ptr);
Enrico Granata36f51e42015-12-18 22:41:25 +00006211
6212 case clang::Type::Auto:
6213 return GetVirtualBaseClassAtIndex (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), idx, bit_offset_ptr);
6214
Greg Clayton99558cc42015-08-24 23:46:31 +00006215 case clang::Type::Elaborated:
6216 return GetVirtualBaseClassAtIndex (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), idx, bit_offset_ptr);
6217
6218 case clang::Type::Paren:
Zachary Turner9d8a97e2016-04-01 23:20:35 +00006219 return GetVirtualBaseClassAtIndex(llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), idx,
6220 bit_offset_ptr);
Greg Clayton99558cc42015-08-24 23:46:31 +00006221
6222 default:
6223 break;
6224 }
6225 return CompilerType();
6226
6227}
6228
Greg Claytond8d4a572015-08-11 21:38:15 +00006229// If a pointer to a pointee type (the clang_type arg) says that it has no
6230// children, then we either need to trust it, or override it and return a
6231// different result. For example, an "int *" has one child that is an integer,
6232// but a function pointer doesn't have any children. Likewise if a Record type
6233// claims it has no children, then there really is nothing to show.
6234uint32_t
6235ClangASTContext::GetNumPointeeChildren (clang::QualType type)
6236{
6237 if (type.isNull())
6238 return 0;
6239
6240 clang::QualType qual_type(type.getCanonicalType());
6241 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
6242 switch (type_class)
6243 {
6244 case clang::Type::Builtin:
6245 switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
6246 {
6247 case clang::BuiltinType::UnknownAny:
6248 case clang::BuiltinType::Void:
6249 case clang::BuiltinType::NullPtr:
6250 case clang::BuiltinType::OCLEvent:
Tamas Berghammerb905e9d2016-04-08 14:31:13 +00006251 case clang::BuiltinType::OCLImage1dRO:
6252 case clang::BuiltinType::OCLImage1dWO:
6253 case clang::BuiltinType::OCLImage1dRW:
6254 case clang::BuiltinType::OCLImage1dArrayRO:
6255 case clang::BuiltinType::OCLImage1dArrayWO:
6256 case clang::BuiltinType::OCLImage1dArrayRW:
6257 case clang::BuiltinType::OCLImage1dBufferRO:
6258 case clang::BuiltinType::OCLImage1dBufferWO:
6259 case clang::BuiltinType::OCLImage1dBufferRW:
6260 case clang::BuiltinType::OCLImage2dRO:
6261 case clang::BuiltinType::OCLImage2dWO:
6262 case clang::BuiltinType::OCLImage2dRW:
6263 case clang::BuiltinType::OCLImage2dArrayRO:
6264 case clang::BuiltinType::OCLImage2dArrayWO:
6265 case clang::BuiltinType::OCLImage2dArrayRW:
6266 case clang::BuiltinType::OCLImage3dRO:
6267 case clang::BuiltinType::OCLImage3dWO:
6268 case clang::BuiltinType::OCLImage3dRW:
Greg Claytond8d4a572015-08-11 21:38:15 +00006269 case clang::BuiltinType::OCLSampler:
6270 return 0;
6271 case clang::BuiltinType::Bool:
6272 case clang::BuiltinType::Char_U:
6273 case clang::BuiltinType::UChar:
6274 case clang::BuiltinType::WChar_U:
6275 case clang::BuiltinType::Char16:
6276 case clang::BuiltinType::Char32:
6277 case clang::BuiltinType::UShort:
6278 case clang::BuiltinType::UInt:
6279 case clang::BuiltinType::ULong:
6280 case clang::BuiltinType::ULongLong:
6281 case clang::BuiltinType::UInt128:
6282 case clang::BuiltinType::Char_S:
6283 case clang::BuiltinType::SChar:
6284 case clang::BuiltinType::WChar_S:
6285 case clang::BuiltinType::Short:
6286 case clang::BuiltinType::Int:
6287 case clang::BuiltinType::Long:
6288 case clang::BuiltinType::LongLong:
6289 case clang::BuiltinType::Int128:
6290 case clang::BuiltinType::Float:
6291 case clang::BuiltinType::Double:
6292 case clang::BuiltinType::LongDouble:
6293 case clang::BuiltinType::Dependent:
6294 case clang::BuiltinType::Overload:
6295 case clang::BuiltinType::ObjCId:
6296 case clang::BuiltinType::ObjCClass:
6297 case clang::BuiltinType::ObjCSel:
6298 case clang::BuiltinType::BoundMember:
6299 case clang::BuiltinType::Half:
6300 case clang::BuiltinType::ARCUnbridgedCast:
6301 case clang::BuiltinType::PseudoObject:
6302 case clang::BuiltinType::BuiltinFn:
Zachary Turner84f5b0d2015-09-09 17:25:43 +00006303 case clang::BuiltinType::OMPArraySection:
Greg Claytond8d4a572015-08-11 21:38:15 +00006304 return 1;
Zachary Turnerdd07e002015-09-16 18:08:45 +00006305 default:
6306 return 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00006307 }
6308 break;
6309
6310 case clang::Type::Complex: return 1;
6311 case clang::Type::Pointer: return 1;
6312 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them
6313 case clang::Type::LValueReference: return 1;
6314 case clang::Type::RValueReference: return 1;
6315 case clang::Type::MemberPointer: return 0;
6316 case clang::Type::ConstantArray: return 0;
6317 case clang::Type::IncompleteArray: return 0;
6318 case clang::Type::VariableArray: return 0;
6319 case clang::Type::DependentSizedArray: return 0;
6320 case clang::Type::DependentSizedExtVector: return 0;
6321 case clang::Type::Vector: return 0;
6322 case clang::Type::ExtVector: return 0;
6323 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children...
6324 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children...
6325 case clang::Type::UnresolvedUsing: return 0;
6326 case clang::Type::Paren: return GetNumPointeeChildren (llvm::cast<clang::ParenType>(qual_type)->desugar());
6327 case clang::Type::Typedef: return GetNumPointeeChildren (llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType());
Enrico Granata36f51e42015-12-18 22:41:25 +00006328 case clang::Type::Auto: return GetNumPointeeChildren (llvm::cast<clang::AutoType>(qual_type)->getDeducedType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006329 case clang::Type::Elaborated: return GetNumPointeeChildren (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType());
6330 case clang::Type::TypeOfExpr: return 0;
6331 case clang::Type::TypeOf: return 0;
6332 case clang::Type::Decltype: return 0;
6333 case clang::Type::Record: return 0;
6334 case clang::Type::Enum: return 1;
6335 case clang::Type::TemplateTypeParm: return 1;
6336 case clang::Type::SubstTemplateTypeParm: return 1;
6337 case clang::Type::TemplateSpecialization: return 1;
6338 case clang::Type::InjectedClassName: return 0;
6339 case clang::Type::DependentName: return 1;
6340 case clang::Type::DependentTemplateSpecialization: return 1;
6341 case clang::Type::ObjCObject: return 0;
6342 case clang::Type::ObjCInterface: return 0;
6343 case clang::Type::ObjCObjectPointer: return 1;
6344 default:
6345 break;
6346 }
6347 return 0;
6348}
6349
6350
Greg Claytona1e5dc82015-08-11 22:53:00 +00006351CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00006352ClangASTContext::GetChildCompilerTypeAtIndex (lldb::opaque_compiler_type_t type,
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006353 ExecutionContext *exe_ctx,
6354 size_t idx,
6355 bool transparent_pointers,
6356 bool omit_empty_base_classes,
6357 bool ignore_array_bounds,
6358 std::string& child_name,
6359 uint32_t &child_byte_size,
6360 int32_t &child_byte_offset,
6361 uint32_t &child_bitfield_bit_size,
6362 uint32_t &child_bitfield_bit_offset,
6363 bool &child_is_base_class,
6364 bool &child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006365 ValueObject *valobj,
6366 uint64_t &language_flags)
Greg Claytond8d4a572015-08-11 21:38:15 +00006367{
6368 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00006369 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006370
6371 clang::QualType parent_qual_type(GetCanonicalQualType(type));
6372 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
6373 child_bitfield_bit_size = 0;
6374 child_bitfield_bit_offset = 0;
6375 child_is_base_class = false;
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006376 language_flags = 0;
Greg Claytond8d4a572015-08-11 21:38:15 +00006377
6378 const bool idx_is_valid = idx < GetNumChildren (type, omit_empty_base_classes);
6379 uint32_t bit_offset;
6380 switch (parent_type_class)
6381 {
6382 case clang::Type::Builtin:
6383 if (idx_is_valid)
6384 {
6385 switch (llvm::cast<clang::BuiltinType>(parent_qual_type)->getKind())
6386 {
6387 case clang::BuiltinType::ObjCId:
6388 case clang::BuiltinType::ObjCClass:
6389 child_name = "isa";
6390 child_byte_size = getASTContext()->getTypeSize(getASTContext()->ObjCBuiltinClassTy) / CHAR_BIT;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006391 return CompilerType (getASTContext(), getASTContext()->ObjCBuiltinClassTy);
Greg Claytond8d4a572015-08-11 21:38:15 +00006392
6393 default:
6394 break;
6395 }
6396 }
6397 break;
6398
6399 case clang::Type::Record:
6400 if (idx_is_valid && GetCompleteType(type))
6401 {
6402 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(parent_qual_type.getTypePtr());
6403 const clang::RecordDecl *record_decl = record_type->getDecl();
6404 assert(record_decl);
6405 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
6406 uint32_t child_idx = 0;
6407
6408 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6409 if (cxx_record_decl)
6410 {
6411 // We might have base classes to print out first
6412 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6413 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6414 base_class != base_class_end;
6415 ++base_class)
6416 {
6417 const clang::CXXRecordDecl *base_class_decl = nullptr;
6418
6419 // Skip empty base classes
6420 if (omit_empty_base_classes)
6421 {
6422 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6423 if (ClangASTContext::RecordHasFields(base_class_decl) == false)
6424 continue;
6425 }
6426
6427 if (idx == child_idx)
6428 {
6429 if (base_class_decl == nullptr)
6430 base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
6431
6432
6433 if (base_class->isVirtual())
6434 {
6435 bool handled = false;
6436 if (valobj)
6437 {
6438 Error err;
6439 AddressType addr_type = eAddressTypeInvalid;
6440 lldb::addr_t vtable_ptr_addr = valobj->GetCPPVTableAddress(addr_type);
6441
6442 if (vtable_ptr_addr != LLDB_INVALID_ADDRESS && addr_type == eAddressTypeLoad)
6443 {
6444
6445 ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
6446 Process *process = exe_ctx.GetProcessPtr();
6447 if (process)
6448 {
6449 clang::VTableContextBase *vtable_ctx = getASTContext()->getVTableContext();
6450 if (vtable_ctx)
6451 {
6452 if (vtable_ctx->isMicrosoft())
6453 {
6454 clang::MicrosoftVTableContext *msoft_vtable_ctx = static_cast<clang::MicrosoftVTableContext *>(vtable_ctx);
6455
6456 if (vtable_ptr_addr)
6457 {
6458 const lldb::addr_t vbtable_ptr_addr = vtable_ptr_addr + record_layout.getVBPtrOffset().getQuantity();
6459
6460 const lldb::addr_t vbtable_ptr = process->ReadPointerFromMemory(vbtable_ptr_addr, err);
6461 if (vbtable_ptr != LLDB_INVALID_ADDRESS)
6462 {
6463 // Get the index into the virtual base table. The index is the index in uint32_t from vbtable_ptr
6464 const unsigned vbtable_index = msoft_vtable_ctx->getVBTableIndex(cxx_record_decl, base_class_decl);
6465 const lldb::addr_t base_offset_addr = vbtable_ptr + vbtable_index * 4;
6466 const uint32_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, 4, UINT32_MAX, err);
6467 if (base_offset != UINT32_MAX)
6468 {
6469 handled = true;
6470 bit_offset = base_offset * 8;
6471 }
6472 }
6473 }
6474 }
6475 else
6476 {
6477 clang::ItaniumVTableContext *itanium_vtable_ctx = static_cast<clang::ItaniumVTableContext *>(vtable_ctx);
6478 if (vtable_ptr_addr)
6479 {
6480 const lldb::addr_t vtable_ptr = process->ReadPointerFromMemory(vtable_ptr_addr, err);
6481 if (vtable_ptr != LLDB_INVALID_ADDRESS)
6482 {
6483 clang::CharUnits base_offset_offset = itanium_vtable_ctx->getVirtualBaseOffsetOffset(cxx_record_decl, base_class_decl);
6484 const lldb::addr_t base_offset_addr = vtable_ptr + base_offset_offset.getQuantity();
Ulrich Weigand0501eeb2016-04-14 14:33:47 +00006485 const uint32_t base_offset_size = process->GetAddressByteSize();
6486 const uint64_t base_offset = process->ReadUnsignedIntegerFromMemory(base_offset_addr, base_offset_size, UINT32_MAX, err);
6487 if (base_offset < UINT32_MAX)
Greg Claytond8d4a572015-08-11 21:38:15 +00006488 {
6489 handled = true;
6490 bit_offset = base_offset * 8;
6491 }
6492 }
6493 }
6494 }
6495 }
6496 }
6497 }
6498
6499 }
6500 if (!handled)
6501 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
6502 }
6503 else
6504 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
6505
6506 // Base classes should be a multiple of 8 bits in size
6507 child_byte_offset = bit_offset/8;
Greg Claytona1e5dc82015-08-11 22:53:00 +00006508 CompilerType base_class_clang_type(getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006509 child_name = base_class_clang_type.GetTypeName().AsCString("");
6510 uint64_t base_class_clang_type_bit_size = base_class_clang_type.GetBitSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6511
6512 // Base classes bit sizes should be a multiple of 8 bits in size
6513 assert (base_class_clang_type_bit_size % 8 == 0);
6514 child_byte_size = base_class_clang_type_bit_size / 8;
6515 child_is_base_class = true;
6516 return base_class_clang_type;
6517 }
6518 // We don't increment the child index in the for loop since we might
6519 // be skipping empty base classes
6520 ++child_idx;
6521 }
6522 }
6523 // Make sure index is in range...
6524 uint32_t field_idx = 0;
6525 clang::RecordDecl::field_iterator field, field_end;
6526 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
6527 {
6528 if (idx == child_idx)
6529 {
6530 // Print the member type if requested
6531 // Print the member name and equal sign
6532 child_name.assign(field->getNameAsString().c_str());
6533
6534 // Figure out the type byte size (field_type_info.first) and
6535 // alignment (field_type_info.second) from the AST context.
Greg Claytona1e5dc82015-08-11 22:53:00 +00006536 CompilerType field_clang_type (getASTContext(), field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006537 assert(field_idx < record_layout.getFieldCount());
6538 child_byte_size = field_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
Greg Clayton12261ec2016-07-06 23:11:13 +00006539 const uint32_t child_bit_size = child_byte_size * 8;
Greg Claytond8d4a572015-08-11 21:38:15 +00006540
6541 // Figure out the field offset within the current struct/union/class type
6542 bit_offset = record_layout.getFieldOffset (field_idx);
Greg Claytond8d4a572015-08-11 21:38:15 +00006543 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, child_bitfield_bit_size))
Greg Clayton12261ec2016-07-06 23:11:13 +00006544 {
6545 child_bitfield_bit_offset = bit_offset % child_bit_size;
6546 const uint32_t child_bit_offset = bit_offset - child_bitfield_bit_offset;
6547 child_byte_offset = child_bit_offset / 8;
6548 }
6549 else
6550 {
6551 child_byte_offset = bit_offset / 8;
6552 }
Greg Claytond8d4a572015-08-11 21:38:15 +00006553
6554 return field_clang_type;
6555 }
6556 }
6557 }
6558 break;
6559
6560 case clang::Type::ObjCObject:
6561 case clang::Type::ObjCInterface:
6562 if (idx_is_valid && GetCompleteType(type))
6563 {
6564 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(parent_qual_type.getTypePtr());
6565 assert (objc_class_type);
6566 if (objc_class_type)
6567 {
6568 uint32_t child_idx = 0;
6569 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
6570
6571 if (class_interface_decl)
6572 {
6573
6574 const clang::ASTRecordLayout &interface_layout = getASTContext()->getASTObjCInterfaceLayout(class_interface_decl);
6575 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
6576 if (superclass_interface_decl)
6577 {
6578 if (omit_empty_base_classes)
6579 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006580 CompilerType base_class_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00006581 if (base_class_clang_type.GetNumChildren(omit_empty_base_classes) > 0)
6582 {
6583 if (idx == 0)
6584 {
6585 clang::QualType ivar_qual_type(getASTContext()->getObjCInterfaceType(superclass_interface_decl));
6586
6587
6588 child_name.assign(superclass_interface_decl->getNameAsString().c_str());
6589
6590 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6591
6592 child_byte_size = ivar_type_info.Width / 8;
6593 child_byte_offset = 0;
6594 child_is_base_class = true;
6595
Greg Claytona1e5dc82015-08-11 22:53:00 +00006596 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006597 }
6598
6599 ++child_idx;
6600 }
6601 }
6602 else
6603 ++child_idx;
6604 }
6605
6606 const uint32_t superclass_idx = child_idx;
6607
6608 if (idx < (child_idx + class_interface_decl->ivar_size()))
6609 {
6610 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
6611
6612 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
6613 {
6614 if (child_idx == idx)
6615 {
6616 clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
6617
6618 clang::QualType ivar_qual_type(ivar_decl->getType());
6619
6620 child_name.assign(ivar_decl->getNameAsString().c_str());
6621
6622 clang::TypeInfo ivar_type_info = getASTContext()->getTypeInfo(ivar_qual_type.getTypePtr());
6623
6624 child_byte_size = ivar_type_info.Width / 8;
6625
6626 // Figure out the field offset within the current struct/union/class type
6627 // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
6628 // that doesn't account for the space taken up by unbacked properties, or from
6629 // the changing size of base classes that are newer than this class.
6630 // So if we have a process around that we can ask about this object, do so.
6631 child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
6632 Process *process = nullptr;
6633 if (exe_ctx)
6634 process = exe_ctx->GetProcessPtr();
6635 if (process)
6636 {
6637 ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
6638 if (objc_runtime != nullptr)
6639 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006640 CompilerType parent_ast_type (getASTContext(), parent_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006641 child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
6642 }
6643 }
6644
6645 // Setting this to UINT32_MAX to make sure we don't compute it twice...
6646 bit_offset = UINT32_MAX;
6647
6648 if (child_byte_offset == static_cast<int32_t>(LLDB_INVALID_IVAR_OFFSET))
6649 {
6650 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6651 child_byte_offset = bit_offset / 8;
6652 }
6653
6654 // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
6655 // of a bitfield within its containing object. So regardless of where we get the byte
6656 // offset from, we still need to get the bit offset for bitfields from the layout.
6657
6658 if (ClangASTContext::FieldIsBitfield (getASTContext(), ivar_decl, child_bitfield_bit_size))
6659 {
6660 if (bit_offset == UINT32_MAX)
6661 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
6662
6663 child_bitfield_bit_offset = bit_offset % 8;
6664 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006665 return CompilerType (getASTContext(), ivar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00006666 }
6667 ++child_idx;
6668 }
6669 }
6670 }
6671 }
6672 }
6673 break;
6674
6675 case clang::Type::ObjCObjectPointer:
6676 if (idx_is_valid)
6677 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006678 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006679
6680 if (transparent_pointers && pointee_clang_type.IsAggregateType())
6681 {
6682 child_is_deref_of_parent = false;
6683 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006684 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6685 idx,
6686 transparent_pointers,
6687 omit_empty_base_classes,
6688 ignore_array_bounds,
6689 child_name,
6690 child_byte_size,
6691 child_byte_offset,
6692 child_bitfield_bit_size,
6693 child_bitfield_bit_offset,
6694 child_is_base_class,
6695 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006696 valobj,
6697 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006698 }
6699 else
6700 {
6701 child_is_deref_of_parent = true;
6702 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6703 if (parent_name)
6704 {
6705 child_name.assign(1, '*');
6706 child_name += parent_name;
6707 }
6708
6709 // We have a pointer to an simple type
6710 if (idx == 0 && pointee_clang_type.GetCompleteType())
6711 {
6712 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6713 child_byte_offset = 0;
6714 return pointee_clang_type;
6715 }
6716 }
6717 }
6718 break;
6719
6720 case clang::Type::Vector:
6721 case clang::Type::ExtVector:
6722 if (idx_is_valid)
6723 {
6724 const clang::VectorType *array = llvm::cast<clang::VectorType>(parent_qual_type.getTypePtr());
6725 if (array)
6726 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006727 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006728 if (element_type.GetCompleteType())
6729 {
6730 char element_name[64];
6731 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6732 child_name.assign(element_name);
6733 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6734 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6735 return element_type;
6736 }
6737 }
6738 }
6739 break;
6740
6741 case clang::Type::ConstantArray:
6742 case clang::Type::IncompleteArray:
6743 if (ignore_array_bounds || idx_is_valid)
6744 {
6745 const clang::ArrayType *array = GetQualType(type)->getAsArrayTypeUnsafe();
6746 if (array)
6747 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006748 CompilerType element_type (getASTContext(), array->getElementType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006749 if (element_type.GetCompleteType())
6750 {
6751 char element_name[64];
6752 ::snprintf (element_name, sizeof (element_name), "[%" PRIu64 "]", static_cast<uint64_t>(idx));
6753 child_name.assign(element_name);
6754 child_byte_size = element_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6755 child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
6756 return element_type;
6757 }
6758 }
6759 }
6760 break;
6761
6762
6763 case clang::Type::Pointer:
6764 if (idx_is_valid)
6765 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006766 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00006767
6768 // Don't dereference "void *" pointers
6769 if (pointee_clang_type.IsVoidType())
Greg Claytona1e5dc82015-08-11 22:53:00 +00006770 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006771
6772 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6773 {
6774 child_is_deref_of_parent = false;
6775 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006776 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6777 idx,
6778 transparent_pointers,
6779 omit_empty_base_classes,
6780 ignore_array_bounds,
6781 child_name,
6782 child_byte_size,
6783 child_byte_offset,
6784 child_bitfield_bit_size,
6785 child_bitfield_bit_offset,
6786 child_is_base_class,
6787 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006788 valobj,
6789 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006790 }
6791 else
6792 {
6793 child_is_deref_of_parent = true;
6794
6795 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6796 if (parent_name)
6797 {
6798 child_name.assign(1, '*');
6799 child_name += parent_name;
6800 }
6801
6802 // We have a pointer to an simple type
6803 if (idx == 0)
6804 {
6805 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6806 child_byte_offset = 0;
6807 return pointee_clang_type;
6808 }
6809 }
6810 }
6811 break;
6812
6813 case clang::Type::LValueReference:
6814 case clang::Type::RValueReference:
6815 if (idx_is_valid)
6816 {
6817 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(parent_qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00006818 CompilerType pointee_clang_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00006819 if (transparent_pointers && pointee_clang_type.IsAggregateType ())
6820 {
6821 child_is_deref_of_parent = false;
6822 bool tmp_child_is_deref_of_parent = false;
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006823 return pointee_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6824 idx,
6825 transparent_pointers,
6826 omit_empty_base_classes,
6827 ignore_array_bounds,
6828 child_name,
6829 child_byte_size,
6830 child_byte_offset,
6831 child_bitfield_bit_size,
6832 child_bitfield_bit_offset,
6833 child_is_base_class,
6834 tmp_child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006835 valobj,
6836 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006837 }
6838 else
6839 {
6840 const char *parent_name = valobj ? valobj->GetName().GetCString() : NULL;
6841 if (parent_name)
6842 {
6843 child_name.assign(1, '&');
6844 child_name += parent_name;
6845 }
6846
6847 // We have a pointer to an simple type
6848 if (idx == 0)
6849 {
6850 child_byte_size = pointee_clang_type.GetByteSize(exe_ctx ? exe_ctx->GetBestExecutionContextScope() : NULL);
6851 child_byte_offset = 0;
6852 return pointee_clang_type;
6853 }
6854 }
6855 }
6856 break;
6857
6858 case clang::Type::Typedef:
6859 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006860 CompilerType typedefed_clang_type (getASTContext(), llvm::cast<clang::TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006861 return typedefed_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6862 idx,
6863 transparent_pointers,
6864 omit_empty_base_classes,
6865 ignore_array_bounds,
6866 child_name,
6867 child_byte_size,
6868 child_byte_offset,
6869 child_bitfield_bit_size,
6870 child_bitfield_bit_offset,
6871 child_is_base_class,
6872 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006873 valobj,
6874 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006875 }
6876 break;
6877
Enrico Granata36f51e42015-12-18 22:41:25 +00006878 case clang::Type::Auto:
6879 {
6880 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::AutoType>(parent_qual_type)->getDeducedType());
6881 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6882 idx,
6883 transparent_pointers,
6884 omit_empty_base_classes,
6885 ignore_array_bounds,
6886 child_name,
6887 child_byte_size,
6888 child_byte_offset,
6889 child_bitfield_bit_size,
6890 child_bitfield_bit_offset,
6891 child_is_base_class,
6892 child_is_deref_of_parent,
6893 valobj,
6894 language_flags);
6895 }
6896
Greg Claytond8d4a572015-08-11 21:38:15 +00006897 case clang::Type::Elaborated:
6898 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006899 CompilerType elaborated_clang_type (getASTContext(), llvm::cast<clang::ElaboratedType>(parent_qual_type)->getNamedType());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006900 return elaborated_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6901 idx,
6902 transparent_pointers,
6903 omit_empty_base_classes,
6904 ignore_array_bounds,
6905 child_name,
6906 child_byte_size,
6907 child_byte_offset,
6908 child_bitfield_bit_size,
6909 child_bitfield_bit_offset,
6910 child_is_base_class,
6911 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006912 valobj,
6913 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006914 }
6915
6916 case clang::Type::Paren:
6917 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00006918 CompilerType paren_clang_type (getASTContext(), llvm::cast<clang::ParenType>(parent_qual_type)->desugar());
Bruce Mitchener4ad83342015-09-21 16:48:48 +00006919 return paren_clang_type.GetChildCompilerTypeAtIndex (exe_ctx,
6920 idx,
6921 transparent_pointers,
6922 omit_empty_base_classes,
6923 ignore_array_bounds,
6924 child_name,
6925 child_byte_size,
6926 child_byte_offset,
6927 child_bitfield_bit_size,
6928 child_bitfield_bit_offset,
6929 child_is_base_class,
6930 child_is_deref_of_parent,
Enrico Granatadc62ffd2015-11-09 19:27:34 +00006931 valobj,
6932 language_flags);
Greg Claytond8d4a572015-08-11 21:38:15 +00006933 }
6934
6935
6936 default:
6937 break;
6938 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00006939 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00006940}
6941
6942static uint32_t
6943GetIndexForRecordBase
6944(
6945 const clang::RecordDecl *record_decl,
6946 const clang::CXXBaseSpecifier *base_spec,
6947 bool omit_empty_base_classes
6948 )
6949{
6950 uint32_t child_idx = 0;
6951
6952 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
6953
6954 // const char *super_name = record_decl->getNameAsCString();
6955 // const char *base_name = base_spec->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString();
6956 // printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
6957 //
6958 if (cxx_record_decl)
6959 {
6960 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
6961 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
6962 base_class != base_class_end;
6963 ++base_class)
6964 {
6965 if (omit_empty_base_classes)
6966 {
6967 if (BaseSpecifierIsEmpty (base_class))
6968 continue;
6969 }
6970
6971 // printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
6972 // child_idx,
6973 // base_class->getType()->getAs<clang::RecordType>()->getDecl()->getNameAsCString());
6974 //
6975 //
6976 if (base_class == base_spec)
6977 return child_idx;
6978 ++child_idx;
6979 }
6980 }
6981
6982 return UINT32_MAX;
6983}
6984
6985
6986static uint32_t
6987GetIndexForRecordChild (const clang::RecordDecl *record_decl,
6988 clang::NamedDecl *canonical_decl,
6989 bool omit_empty_base_classes)
6990{
6991 uint32_t child_idx = ClangASTContext::GetNumBaseClasses (llvm::dyn_cast<clang::CXXRecordDecl>(record_decl),
6992 omit_empty_base_classes);
6993
6994 clang::RecordDecl::field_iterator field, field_end;
6995 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
6996 field != field_end;
6997 ++field, ++child_idx)
6998 {
6999 if (field->getCanonicalDecl() == canonical_decl)
7000 return child_idx;
7001 }
7002
7003 return UINT32_MAX;
7004}
7005
7006// Look for a child member (doesn't include base classes, but it does include
7007// their members) in the type hierarchy. Returns an index path into "clang_type"
7008// on how to reach the appropriate member.
7009//
7010// class A
7011// {
7012// public:
7013// int m_a;
7014// int m_b;
7015// };
7016//
7017// class B
7018// {
7019// };
7020//
7021// class C :
7022// public B,
7023// public A
7024// {
7025// };
7026//
7027// If we have a clang type that describes "class C", and we wanted to looked
7028// "m_b" in it:
7029//
7030// With omit_empty_base_classes == false we would get an integer array back with:
7031// { 1, 1 }
7032// The first index 1 is the child index for "class A" within class C
7033// The second index 1 is the child index for "m_b" within class A
7034//
7035// With omit_empty_base_classes == true we would get an integer array back with:
7036// { 0, 1 }
7037// 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)
7038// The second index 1 is the child index for "m_b" within class A
7039
7040size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007041ClangASTContext::GetIndexOfChildMemberWithName (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytond8d4a572015-08-11 21:38:15 +00007042 bool omit_empty_base_classes,
7043 std::vector<uint32_t>& child_indexes)
7044{
7045 if (type && name && name[0])
7046 {
7047 clang::QualType qual_type(GetCanonicalQualType(type));
7048 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7049 switch (type_class)
7050 {
7051 case clang::Type::Record:
7052 if (GetCompleteType(type))
7053 {
7054 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
7055 const clang::RecordDecl *record_decl = record_type->getDecl();
7056
7057 assert(record_decl);
7058 uint32_t child_idx = 0;
7059
7060 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
7061
7062 // Try and find a field that matches NAME
7063 clang::RecordDecl::field_iterator field, field_end;
7064 llvm::StringRef name_sref(name);
7065 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
7066 field != field_end;
7067 ++field, ++child_idx)
7068 {
7069 llvm::StringRef field_name = field->getName();
7070 if (field_name.empty())
7071 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007072 CompilerType field_type(getASTContext(),field->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007073 child_indexes.push_back(child_idx);
7074 if (field_type.GetIndexOfChildMemberWithName(name, omit_empty_base_classes, child_indexes))
7075 return child_indexes.size();
7076 child_indexes.pop_back();
7077
7078 }
7079 else if (field_name.equals (name_sref))
7080 {
7081 // We have to add on the number of base classes to this index!
7082 child_indexes.push_back (child_idx + ClangASTContext::GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
7083 return child_indexes.size();
7084 }
7085 }
7086
7087 if (cxx_record_decl)
7088 {
7089 const clang::RecordDecl *parent_record_decl = cxx_record_decl;
7090
7091 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
7092
7093 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
7094 // Didn't find things easily, lets let clang do its thang...
7095 clang::IdentifierInfo & ident_ref = getASTContext()->Idents.get(name_sref);
7096 clang::DeclarationName decl_name(&ident_ref);
7097
7098 clang::CXXBasePaths paths;
7099 if (cxx_record_decl->lookupInBases([decl_name](const clang::CXXBaseSpecifier *specifier, clang::CXXBasePath &path) {
7100 return clang::CXXRecordDecl::FindOrdinaryMember(specifier, path, decl_name);
7101 },
7102 paths))
7103 {
7104 clang::CXXBasePaths::const_paths_iterator path, path_end = paths.end();
7105 for (path = paths.begin(); path != path_end; ++path)
7106 {
7107 const size_t num_path_elements = path->size();
7108 for (size_t e=0; e<num_path_elements; ++e)
7109 {
7110 clang::CXXBasePathElement elem = (*path)[e];
7111
7112 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
7113 if (child_idx == UINT32_MAX)
7114 {
7115 child_indexes.clear();
7116 return 0;
7117 }
7118 else
7119 {
7120 child_indexes.push_back (child_idx);
7121 parent_record_decl = llvm::cast<clang::RecordDecl>(elem.Base->getType()->getAs<clang::RecordType>()->getDecl());
7122 }
7123 }
7124 for (clang::NamedDecl *path_decl : path->Decls)
7125 {
7126 child_idx = GetIndexForRecordChild (parent_record_decl, path_decl, omit_empty_base_classes);
7127 if (child_idx == UINT32_MAX)
7128 {
7129 child_indexes.clear();
7130 return 0;
7131 }
7132 else
7133 {
7134 child_indexes.push_back (child_idx);
7135 }
7136 }
7137 }
7138 return child_indexes.size();
7139 }
7140 }
7141
7142 }
7143 break;
7144
7145 case clang::Type::ObjCObject:
7146 case clang::Type::ObjCInterface:
7147 if (GetCompleteType(type))
7148 {
7149 llvm::StringRef name_sref(name);
7150 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7151 assert (objc_class_type);
7152 if (objc_class_type)
7153 {
7154 uint32_t child_idx = 0;
7155 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7156
7157 if (class_interface_decl)
7158 {
7159 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
7160 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
7161
7162 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
7163 {
7164 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
7165
7166 if (ivar_decl->getName().equals (name_sref))
7167 {
7168 if ((!omit_empty_base_classes && superclass_interface_decl) ||
7169 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
7170 ++child_idx;
7171
7172 child_indexes.push_back (child_idx);
7173 return child_indexes.size();
7174 }
7175 }
7176
7177 if (superclass_interface_decl)
7178 {
7179 // The super class index is always zero for ObjC classes,
7180 // so we push it onto the child indexes in case we find
7181 // an ivar in our superclass...
7182 child_indexes.push_back (0);
7183
Greg Claytona1e5dc82015-08-11 22:53:00 +00007184 CompilerType superclass_clang_type (getASTContext(), getASTContext()->getObjCInterfaceType(superclass_interface_decl));
Greg Claytond8d4a572015-08-11 21:38:15 +00007185 if (superclass_clang_type.GetIndexOfChildMemberWithName (name,
7186 omit_empty_base_classes,
7187 child_indexes))
7188 {
7189 // We did find an ivar in a superclass so just
7190 // return the results!
7191 return child_indexes.size();
7192 }
7193
7194 // We didn't find an ivar matching "name" in our
7195 // superclass, pop the superclass zero index that
7196 // we pushed on above.
7197 child_indexes.pop_back();
7198 }
7199 }
7200 }
7201 }
7202 break;
7203
7204 case clang::Type::ObjCObjectPointer:
7205 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007206 CompilerType objc_object_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007207 return objc_object_clang_type.GetIndexOfChildMemberWithName (name,
7208 omit_empty_base_classes,
7209 child_indexes);
7210 }
7211 break;
7212
7213
7214 case clang::Type::ConstantArray:
7215 {
7216 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
7217 // const uint64_t element_count = array->getSize().getLimitedValue();
7218 //
7219 // if (idx < element_count)
7220 // {
7221 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
7222 //
7223 // char element_name[32];
7224 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
7225 //
7226 // child_name.assign(element_name);
7227 // assert(field_type_info.first % 8 == 0);
7228 // child_byte_size = field_type_info.first / 8;
7229 // child_byte_offset = idx * child_byte_size;
7230 // return array->getElementType().getAsOpaquePtr();
7231 // }
7232 }
7233 break;
7234
7235 // case clang::Type::MemberPointerType:
7236 // {
7237 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
7238 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
7239 //
7240 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
7241 // {
7242 // return GetIndexOfChildWithName (ast,
7243 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
7244 // name);
7245 // }
7246 // }
7247 // break;
7248 //
7249 case clang::Type::LValueReference:
7250 case clang::Type::RValueReference:
7251 {
7252 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
7253 clang::QualType pointee_type(reference_type->getPointeeType());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007254 CompilerType pointee_clang_type (getASTContext(), pointee_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007255
7256 if (pointee_clang_type.IsAggregateType ())
7257 {
7258 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
7259 omit_empty_base_classes,
7260 child_indexes);
7261 }
7262 }
7263 break;
7264
7265 case clang::Type::Pointer:
7266 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007267 CompilerType pointee_clang_type (GetPointeeType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00007268
7269 if (pointee_clang_type.IsAggregateType ())
7270 {
7271 return pointee_clang_type.GetIndexOfChildMemberWithName (name,
7272 omit_empty_base_classes,
7273 child_indexes);
7274 }
7275 }
7276 break;
7277
7278 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007279 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00007280 omit_empty_base_classes,
7281 child_indexes);
7282
7283 case clang::Type::Auto:
7284 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildMemberWithName (name,
7285 omit_empty_base_classes,
7286 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007287
7288 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007289 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00007290 omit_empty_base_classes,
7291 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007292
7293 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007294 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildMemberWithName (name,
Enrico Granata36f51e42015-12-18 22:41:25 +00007295 omit_empty_base_classes,
7296 child_indexes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007297
7298 default:
7299 break;
7300 }
7301 }
7302 return 0;
7303}
7304
7305
7306// Get the index of the child of "clang_type" whose name matches. This function
7307// doesn't descend into the children, but only looks one level deep and name
7308// matches can include base class names.
7309
7310uint32_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007311ClangASTContext::GetIndexOfChildWithName (lldb::opaque_compiler_type_t type, const char *name, bool omit_empty_base_classes)
Greg Claytond8d4a572015-08-11 21:38:15 +00007312{
7313 if (type && name && name[0])
7314 {
7315 clang::QualType qual_type(GetCanonicalQualType(type));
7316
7317 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7318
7319 switch (type_class)
7320 {
7321 case clang::Type::Record:
7322 if (GetCompleteType(type))
7323 {
7324 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
7325 const clang::RecordDecl *record_decl = record_type->getDecl();
7326
7327 assert(record_decl);
7328 uint32_t child_idx = 0;
7329
7330 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
7331
7332 if (cxx_record_decl)
7333 {
7334 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
7335 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
7336 base_class != base_class_end;
7337 ++base_class)
7338 {
7339 // Skip empty base classes
7340 clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
7341 if (omit_empty_base_classes && ClangASTContext::RecordHasFields(base_class_decl) == false)
7342 continue;
7343
Greg Claytona1e5dc82015-08-11 22:53:00 +00007344 CompilerType base_class_clang_type (getASTContext(), base_class->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007345 std::string base_class_type_name (base_class_clang_type.GetTypeName().AsCString(""));
7346 if (base_class_type_name.compare (name) == 0)
7347 return child_idx;
7348 ++child_idx;
7349 }
7350 }
7351
7352 // Try and find a field that matches NAME
7353 clang::RecordDecl::field_iterator field, field_end;
7354 llvm::StringRef name_sref(name);
7355 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
7356 field != field_end;
7357 ++field, ++child_idx)
7358 {
7359 if (field->getName().equals (name_sref))
7360 return child_idx;
7361 }
7362
7363 }
7364 break;
7365
7366 case clang::Type::ObjCObject:
7367 case clang::Type::ObjCInterface:
7368 if (GetCompleteType(type))
7369 {
7370 llvm::StringRef name_sref(name);
7371 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
7372 assert (objc_class_type);
7373 if (objc_class_type)
7374 {
7375 uint32_t child_idx = 0;
7376 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
7377
7378 if (class_interface_decl)
7379 {
7380 clang::ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
7381 clang::ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
7382
7383 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
7384 {
7385 const clang::ObjCIvarDecl* ivar_decl = *ivar_pos;
7386
7387 if (ivar_decl->getName().equals (name_sref))
7388 {
7389 if ((!omit_empty_base_classes && superclass_interface_decl) ||
7390 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
7391 ++child_idx;
7392
7393 return child_idx;
7394 }
7395 }
7396
7397 if (superclass_interface_decl)
7398 {
7399 if (superclass_interface_decl->getName().equals (name_sref))
7400 return 0;
7401 }
7402 }
7403 }
7404 }
7405 break;
7406
7407 case clang::Type::ObjCObjectPointer:
7408 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00007409 CompilerType pointee_clang_type (getASTContext(), llvm::cast<clang::ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007410 return pointee_clang_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7411 }
7412 break;
7413
7414 case clang::Type::ConstantArray:
7415 {
7416 // const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(parent_qual_type.getTypePtr());
7417 // const uint64_t element_count = array->getSize().getLimitedValue();
7418 //
7419 // if (idx < element_count)
7420 // {
7421 // std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
7422 //
7423 // char element_name[32];
7424 // ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
7425 //
7426 // child_name.assign(element_name);
7427 // assert(field_type_info.first % 8 == 0);
7428 // child_byte_size = field_type_info.first / 8;
7429 // child_byte_offset = idx * child_byte_size;
7430 // return array->getElementType().getAsOpaquePtr();
7431 // }
7432 }
7433 break;
7434
7435 // case clang::Type::MemberPointerType:
7436 // {
7437 // MemberPointerType *mem_ptr_type = llvm::cast<MemberPointerType>(qual_type.getTypePtr());
7438 // clang::QualType pointee_type = mem_ptr_type->getPointeeType();
7439 //
7440 // if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
7441 // {
7442 // return GetIndexOfChildWithName (ast,
7443 // mem_ptr_type->getPointeeType().getAsOpaquePtr(),
7444 // name);
7445 // }
7446 // }
7447 // break;
7448 //
7449 case clang::Type::LValueReference:
7450 case clang::Type::RValueReference:
7451 {
7452 const clang::ReferenceType *reference_type = llvm::cast<clang::ReferenceType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007453 CompilerType pointee_type (getASTContext(), reference_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007454
7455 if (pointee_type.IsAggregateType ())
7456 {
7457 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7458 }
7459 }
7460 break;
7461
7462 case clang::Type::Pointer:
7463 {
7464 const clang::PointerType *pointer_type = llvm::cast<clang::PointerType>(qual_type.getTypePtr());
Greg Claytona1e5dc82015-08-11 22:53:00 +00007465 CompilerType pointee_type (getASTContext(), pointer_type->getPointeeType());
Greg Claytond8d4a572015-08-11 21:38:15 +00007466
7467 if (pointee_type.IsAggregateType ())
7468 {
7469 return pointee_type.GetIndexOfChildWithName (name, omit_empty_base_classes);
7470 }
7471 else
7472 {
7473 // if (parent_name)
7474 // {
7475 // child_name.assign(1, '*');
7476 // child_name += parent_name;
7477 // }
7478 //
7479 // // We have a pointer to an simple type
7480 // if (idx == 0)
7481 // {
7482 // std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
7483 // assert(clang_type_info.first % 8 == 0);
7484 // child_byte_size = clang_type_info.first / 8;
7485 // child_byte_offset = 0;
7486 // return pointee_type.getAsOpaquePtr();
7487 // }
7488 }
7489 }
7490 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00007491
7492 case clang::Type::Auto:
7493 return CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007494
7495 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007496 return CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007497
7498 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007499 return CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007500
7501 case clang::Type::Typedef:
Greg Claytona1e5dc82015-08-11 22:53:00 +00007502 return CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType()).GetIndexOfChildWithName (name, omit_empty_base_classes);
Greg Claytond8d4a572015-08-11 21:38:15 +00007503
7504 default:
7505 break;
7506 }
7507 }
7508 return UINT32_MAX;
7509}
7510
7511
7512size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007513ClangASTContext::GetNumTemplateArguments (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007514{
7515 if (!type)
7516 return 0;
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007517
7518 clang::QualType qual_type (GetCanonicalQualType(type));
7519 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7520 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007521 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007522 case clang::Type::Record:
7523 if (GetCompleteType(type))
7524 {
7525 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7526 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007527 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007528 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7529 if (template_decl)
7530 return template_decl->getTemplateArgs().size();
Greg Claytond8d4a572015-08-11 21:38:15 +00007531 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007532 }
7533 break;
7534
7535 case clang::Type::Typedef:
7536 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetNumTemplateArguments();
Enrico Granata36f51e42015-12-18 22:41:25 +00007537
7538 case clang::Type::Auto:
7539 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetNumTemplateArguments();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007540
7541 case clang::Type::Elaborated:
7542 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetNumTemplateArguments();
7543
7544 case clang::Type::Paren:
7545 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetNumTemplateArguments();
7546
7547 default:
7548 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007549 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007550
Greg Claytond8d4a572015-08-11 21:38:15 +00007551 return 0;
7552}
7553
Greg Claytona1e5dc82015-08-11 22:53:00 +00007554CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007555ClangASTContext::GetTemplateArgument (lldb::opaque_compiler_type_t type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
Greg Claytond8d4a572015-08-11 21:38:15 +00007556{
7557 if (!type)
Greg Claytona1e5dc82015-08-11 22:53:00 +00007558 return CompilerType();
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007559
7560 clang::QualType qual_type (GetCanonicalQualType(type));
7561 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
7562 switch (type_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00007563 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007564 case clang::Type::Record:
7565 if (GetCompleteType(type))
7566 {
7567 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
7568 if (cxx_record_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00007569 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007570 const clang::ClassTemplateSpecializationDecl *template_decl = llvm::dyn_cast<clang::ClassTemplateSpecializationDecl>(cxx_record_decl);
7571 if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
Greg Claytond8d4a572015-08-11 21:38:15 +00007572 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007573 const clang::TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
7574 switch (template_arg.getKind())
Greg Claytond8d4a572015-08-11 21:38:15 +00007575 {
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007576 case clang::TemplateArgument::Null:
7577 kind = eTemplateArgumentKindNull;
7578 return CompilerType();
7579
7580 case clang::TemplateArgument::Type:
7581 kind = eTemplateArgumentKindType;
7582 return CompilerType(getASTContext(), template_arg.getAsType());
7583
7584 case clang::TemplateArgument::Declaration:
7585 kind = eTemplateArgumentKindDeclaration;
7586 return CompilerType();
7587
7588 case clang::TemplateArgument::Integral:
7589 kind = eTemplateArgumentKindIntegral;
7590 return CompilerType(getASTContext(), template_arg.getIntegralType());
7591
7592 case clang::TemplateArgument::Template:
7593 kind = eTemplateArgumentKindTemplate;
7594 return CompilerType();
7595
7596 case clang::TemplateArgument::TemplateExpansion:
7597 kind = eTemplateArgumentKindTemplateExpansion;
7598 return CompilerType();
7599
7600 case clang::TemplateArgument::Expression:
7601 kind = eTemplateArgumentKindExpression;
7602 return CompilerType();
7603
7604 case clang::TemplateArgument::Pack:
7605 kind = eTemplateArgumentKindPack;
7606 return CompilerType();
7607
7608 default:
7609 assert (!"Unhandled clang::TemplateArgument::ArgKind");
7610 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007611 }
7612 }
7613 }
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007614 }
7615 break;
7616
7617 case clang::Type::Typedef:
7618 return (CompilerType (getASTContext(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata36f51e42015-12-18 22:41:25 +00007619
7620 case clang::Type::Auto:
7621 return (CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType())).GetTemplateArgument(arg_idx, kind);
Enrico Granata53f2a4a2015-08-13 00:24:24 +00007622
7623 case clang::Type::Elaborated:
7624 return (CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType())).GetTemplateArgument(arg_idx, kind);
7625
7626 case clang::Type::Paren:
7627 return (CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar())).GetTemplateArgument(arg_idx, kind);
7628
7629 default:
7630 break;
Greg Claytond8d4a572015-08-11 21:38:15 +00007631 }
7632 kind = eTemplateArgumentKindNull;
Greg Claytona1e5dc82015-08-11 22:53:00 +00007633 return CompilerType ();
Greg Claytond8d4a572015-08-11 21:38:15 +00007634}
7635
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007636CompilerType
7637ClangASTContext::GetTypeForFormatters (void* type)
7638{
7639 if (type)
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007640 return ClangUtil::RemoveFastQualifiers(CompilerType(this, type));
Enrico Granatac6bf2e22015-09-23 01:39:46 +00007641 return CompilerType();
7642}
7643
Greg Claytond8d4a572015-08-11 21:38:15 +00007644clang::EnumDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007645ClangASTContext::GetAsEnumDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007646{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007647 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(ClangUtil::GetCanonicalQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00007648 if (enutype)
7649 return enutype->getDecl();
7650 return NULL;
7651}
7652
7653clang::RecordDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007654ClangASTContext::GetAsRecordDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007655{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007656 const clang::RecordType *record_type = llvm::dyn_cast<clang::RecordType>(ClangUtil::GetCanonicalQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00007657 if (record_type)
7658 return record_type->getDecl();
7659 return nullptr;
7660}
7661
Greg Claytone6b36cd2015-12-08 01:02:08 +00007662clang::TagDecl *
7663ClangASTContext::GetAsTagDecl (const CompilerType& type)
7664{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007665 clang::QualType qual_type = ClangUtil::GetCanonicalQualType(type);
Greg Claytone6b36cd2015-12-08 01:02:08 +00007666 if (qual_type.isNull())
7667 return nullptr;
7668 else
7669 return qual_type->getAsTagDecl();
7670}
7671
Greg Claytond8d4a572015-08-11 21:38:15 +00007672clang::CXXRecordDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007673ClangASTContext::GetAsCXXRecordDecl (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007674{
7675 return GetCanonicalQualType(type)->getAsCXXRecordDecl();
7676}
7677
7678clang::ObjCInterfaceDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007679ClangASTContext::GetAsObjCInterfaceDecl (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007680{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007681 const clang::ObjCObjectType *objc_class_type =
7682 llvm::dyn_cast<clang::ObjCObjectType>(ClangUtil::GetCanonicalQualType(type));
Greg Claytond8d4a572015-08-11 21:38:15 +00007683 if (objc_class_type)
7684 return objc_class_type->getInterface();
7685 return nullptr;
7686}
7687
7688clang::FieldDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007689ClangASTContext::AddFieldToRecordType (const CompilerType& type, const char *name,
7690 const CompilerType &field_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007691 AccessType access,
7692 uint32_t bitfield_bit_size)
7693{
7694 if (!type.IsValid() || !field_clang_type.IsValid())
7695 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007696 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007697 if (!ast)
7698 return nullptr;
7699 clang::ASTContext* clang_ast = ast->getASTContext();
7700
7701 clang::FieldDecl *field = nullptr;
7702
7703 clang::Expr *bit_width = nullptr;
7704 if (bitfield_bit_size != 0)
7705 {
7706 llvm::APInt bitfield_bit_size_apint(clang_ast->getTypeSize(clang_ast->IntTy), bitfield_bit_size);
7707 bit_width = new (*clang_ast)clang::IntegerLiteral (*clang_ast, bitfield_bit_size_apint, clang_ast->IntTy, clang::SourceLocation());
7708 }
7709
7710 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7711 if (record_decl)
7712 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007713 field = clang::FieldDecl::Create(*clang_ast, record_decl, clang::SourceLocation(), clang::SourceLocation(),
7714 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7715 ClangUtil::GetQualType(field_clang_type), // Field type
7716 nullptr, // TInfo *
7717 bit_width, // BitWidth
7718 false, // Mutable
7719 clang::ICIS_NoInit); // HasInit
7720
Greg Claytond8d4a572015-08-11 21:38:15 +00007721 if (!name)
7722 {
7723 // Determine whether this field corresponds to an anonymous
7724 // struct or union.
7725 if (const clang::TagType *TagT = field->getType()->getAs<clang::TagType>()) {
7726 if (clang::RecordDecl *Rec = llvm::dyn_cast<clang::RecordDecl>(TagT->getDecl()))
7727 if (!Rec->getDeclName()) {
7728 Rec->setAnonymousStructOrUnion(true);
7729 field->setImplicit();
7730
7731 }
7732 }
7733 }
7734
7735 if (field)
7736 {
7737 field->setAccess (ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7738
7739 record_decl->addDecl(field);
7740
7741#ifdef LLDB_CONFIGURATION_DEBUG
7742 VerifyDecl(field);
7743#endif
7744 }
7745 }
7746 else
7747 {
7748 clang::ObjCInterfaceDecl *class_interface_decl = ast->GetAsObjCInterfaceDecl (type);
7749
7750 if (class_interface_decl)
7751 {
7752 const bool is_synthesized = false;
7753
7754 field_clang_type.GetCompleteType();
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007755
7756 field = clang::ObjCIvarDecl::Create(
7757 *clang_ast, class_interface_decl, clang::SourceLocation(), clang::SourceLocation(),
7758 name ? &clang_ast->Idents.get(name) : nullptr, // Identifier
7759 ClangUtil::GetQualType(field_clang_type), // Field type
7760 nullptr, // TypeSourceInfo *
7761 ConvertAccessTypeToObjCIvarAccessControl(access), bit_width, is_synthesized);
7762
Greg Claytond8d4a572015-08-11 21:38:15 +00007763 if (field)
7764 {
7765 class_interface_decl->addDecl(field);
7766
7767#ifdef LLDB_CONFIGURATION_DEBUG
7768 VerifyDecl(field);
7769#endif
7770 }
7771 }
7772 }
7773 return field;
7774}
7775
7776void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007777ClangASTContext::BuildIndirectFields (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007778{
Greg Claytonf73034f2015-09-08 18:15:05 +00007779 if (!type)
7780 return;
7781
7782 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007783 if (!ast)
7784 return;
7785
7786 clang::RecordDecl *record_decl = ast->GetAsRecordDecl(type);
7787
7788 if (!record_decl)
7789 return;
7790
7791 typedef llvm::SmallVector <clang::IndirectFieldDecl *, 1> IndirectFieldVector;
7792
7793 IndirectFieldVector indirect_fields;
7794 clang::RecordDecl::field_iterator field_pos;
7795 clang::RecordDecl::field_iterator field_end_pos = record_decl->field_end();
7796 clang::RecordDecl::field_iterator last_field_pos = field_end_pos;
7797 for (field_pos = record_decl->field_begin(); field_pos != field_end_pos; last_field_pos = field_pos++)
7798 {
7799 if (field_pos->isAnonymousStructOrUnion())
7800 {
7801 clang::QualType field_qual_type = field_pos->getType();
7802
7803 const clang::RecordType *field_record_type = field_qual_type->getAs<clang::RecordType>();
7804
7805 if (!field_record_type)
7806 continue;
7807
7808 clang::RecordDecl *field_record_decl = field_record_type->getDecl();
7809
7810 if (!field_record_decl)
7811 continue;
7812
7813 for (clang::RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
7814 di != de;
7815 ++di)
7816 {
7817 if (clang::FieldDecl *nested_field_decl = llvm::dyn_cast<clang::FieldDecl>(*di))
7818 {
7819 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[2];
7820 chain[0] = *field_pos;
7821 chain[1] = nested_field_decl;
7822 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7823 record_decl,
7824 clang::SourceLocation(),
7825 nested_field_decl->getIdentifier(),
7826 nested_field_decl->getType(),
David Majnemer68303762016-06-24 04:39:22 +00007827 {chain, 2});
Greg Claytond8d4a572015-08-11 21:38:15 +00007828
7829 indirect_field->setImplicit();
7830
7831 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7832 nested_field_decl->getAccess()));
7833
7834 indirect_fields.push_back(indirect_field);
7835 }
7836 else if (clang::IndirectFieldDecl *nested_indirect_field_decl = llvm::dyn_cast<clang::IndirectFieldDecl>(*di))
7837 {
David Majnemere2129a32016-06-24 05:31:23 +00007838 size_t nested_chain_size = nested_indirect_field_decl->getChainingSize();
Greg Claytond8d4a572015-08-11 21:38:15 +00007839 clang::NamedDecl **chain = new (*ast->getASTContext()) clang::NamedDecl*[nested_chain_size + 1];
7840 chain[0] = *field_pos;
7841
7842 int chain_index = 1;
7843 for (clang::IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
7844 nce = nested_indirect_field_decl->chain_end();
7845 nci < nce;
7846 ++nci)
7847 {
7848 chain[chain_index] = *nci;
7849 chain_index++;
7850 }
7851
7852 clang::IndirectFieldDecl *indirect_field = clang::IndirectFieldDecl::Create(*ast->getASTContext(),
7853 record_decl,
7854 clang::SourceLocation(),
7855 nested_indirect_field_decl->getIdentifier(),
7856 nested_indirect_field_decl->getType(),
David Majnemer68303762016-06-24 04:39:22 +00007857 {chain, nested_chain_size + 1});
Greg Claytond8d4a572015-08-11 21:38:15 +00007858
7859 indirect_field->setImplicit();
7860
7861 indirect_field->setAccess(ClangASTContext::UnifyAccessSpecifiers(field_pos->getAccess(),
7862 nested_indirect_field_decl->getAccess()));
7863
7864 indirect_fields.push_back(indirect_field);
7865 }
7866 }
7867 }
7868 }
7869
7870 // Check the last field to see if it has an incomplete array type as its
7871 // last member and if it does, the tell the record decl about it
7872 if (last_field_pos != field_end_pos)
7873 {
7874 if (last_field_pos->getType()->isIncompleteArrayType())
7875 record_decl->hasFlexibleArrayMember();
7876 }
7877
7878 for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
7879 ifi < ife;
7880 ++ifi)
7881 {
7882 record_decl->addDecl(*ifi);
7883 }
7884}
7885
7886void
Greg Claytona1e5dc82015-08-11 22:53:00 +00007887ClangASTContext::SetIsPacked (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00007888{
Greg Claytonf73034f2015-09-08 18:15:05 +00007889 if (type)
7890 {
7891 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
7892 if (ast)
7893 {
7894 clang::RecordDecl *record_decl = GetAsRecordDecl(type);
Greg Claytond8d4a572015-08-11 21:38:15 +00007895
Greg Claytonf73034f2015-09-08 18:15:05 +00007896 if (!record_decl)
7897 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00007898
Greg Claytonf73034f2015-09-08 18:15:05 +00007899 record_decl->addAttr(clang::PackedAttr::CreateImplicit(*ast->getASTContext()));
7900 }
7901 }
Greg Claytond8d4a572015-08-11 21:38:15 +00007902}
7903
7904clang::VarDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00007905ClangASTContext::AddVariableToRecordType (const CompilerType& type, const char *name,
7906 const CompilerType &var_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007907 AccessType access)
7908{
7909 clang::VarDecl *var_decl = nullptr;
7910
7911 if (!type.IsValid() || !var_type.IsValid())
7912 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00007913 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00007914 if (!ast)
7915 return nullptr;
7916
7917 clang::RecordDecl *record_decl = ast->GetAsRecordDecl (type);
7918 if (record_decl)
7919 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007920 var_decl =
7921 clang::VarDecl::Create(*ast->getASTContext(), // ASTContext &
7922 record_decl, // DeclContext *
7923 clang::SourceLocation(), // clang::SourceLocation StartLoc
7924 clang::SourceLocation(), // clang::SourceLocation IdLoc
7925 name ? &ast->getASTContext()->Idents.get(name) : nullptr, // clang::IdentifierInfo *
7926 ClangUtil::GetQualType(var_type), // Variable clang::QualType
7927 nullptr, // TypeSourceInfo *
7928 clang::SC_Static); // StorageClass
Greg Claytond8d4a572015-08-11 21:38:15 +00007929 if (var_decl)
7930 {
7931 var_decl->setAccess(ClangASTContext::ConvertAccessTypeToAccessSpecifier (access));
7932 record_decl->addDecl(var_decl);
7933
7934#ifdef LLDB_CONFIGURATION_DEBUG
7935 VerifyDecl(var_decl);
7936#endif
7937 }
7938 }
7939 return var_decl;
7940}
7941
7942
7943clang::CXXMethodDecl *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00007944ClangASTContext::AddMethodToCXXRecordType (lldb::opaque_compiler_type_t type, const char *name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00007945 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00007946 lldb::AccessType access,
7947 bool is_virtual,
7948 bool is_static,
7949 bool is_inline,
7950 bool is_explicit,
7951 bool is_attr_used,
7952 bool is_artificial)
7953{
7954 if (!type || !method_clang_type.IsValid() || name == nullptr || name[0] == '\0')
7955 return nullptr;
7956
7957 clang::QualType record_qual_type(GetCanonicalQualType(type));
7958
7959 clang::CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
7960
7961 if (cxx_record_decl == nullptr)
7962 return nullptr;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00007963
7964 clang::QualType method_qual_type(ClangUtil::GetQualType(method_clang_type));
7965
Greg Claytond8d4a572015-08-11 21:38:15 +00007966 clang::CXXMethodDecl *cxx_method_decl = nullptr;
7967
7968 clang::DeclarationName decl_name (&getASTContext()->Idents.get(name));
7969
7970 const clang::FunctionType *function_type = llvm::dyn_cast<clang::FunctionType>(method_qual_type.getTypePtr());
7971
7972 if (function_type == nullptr)
7973 return nullptr;
7974
7975 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(function_type));
7976
7977 if (!method_function_prototype)
7978 return nullptr;
7979
7980 unsigned int num_params = method_function_prototype->getNumParams();
7981
7982 clang::CXXDestructorDecl *cxx_dtor_decl(nullptr);
7983 clang::CXXConstructorDecl *cxx_ctor_decl(nullptr);
7984
7985 if (is_artificial)
7986 return nullptr; // skip everything artificial
7987
7988 if (name[0] == '~')
7989 {
7990 cxx_dtor_decl = clang::CXXDestructorDecl::Create (*getASTContext(),
7991 cxx_record_decl,
7992 clang::SourceLocation(),
7993 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXDestructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
7994 method_qual_type,
7995 nullptr,
7996 is_inline,
7997 is_artificial);
7998 cxx_method_decl = cxx_dtor_decl;
7999 }
8000 else if (decl_name == cxx_record_decl->getDeclName())
8001 {
8002 cxx_ctor_decl = clang::CXXConstructorDecl::Create (*getASTContext(),
8003 cxx_record_decl,
8004 clang::SourceLocation(),
8005 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConstructorName (getASTContext()->getCanonicalType (record_qual_type)), clang::SourceLocation()),
8006 method_qual_type,
8007 nullptr, // TypeSourceInfo *
8008 is_explicit,
8009 is_inline,
8010 is_artificial,
8011 false /*is_constexpr*/);
8012 cxx_method_decl = cxx_ctor_decl;
8013 }
8014 else
8015 {
8016 clang::StorageClass SC = is_static ? clang::SC_Static : clang::SC_None;
8017 clang::OverloadedOperatorKind op_kind = clang::NUM_OVERLOADED_OPERATORS;
8018
8019 if (IsOperator (name, op_kind))
8020 {
8021 if (op_kind != clang::NUM_OVERLOADED_OPERATORS)
8022 {
8023 // Check the number of operator parameters. Sometimes we have
8024 // seen bad DWARF that doesn't correctly describe operators and
8025 // if we try to create a method and add it to the class, clang
8026 // will assert and crash, so we need to make sure things are
8027 // acceptable.
Pavel Labath1ac2b202016-08-15 14:32:32 +00008028 const bool is_method = true;
8029 if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount(is_method, op_kind, num_params))
Greg Claytond8d4a572015-08-11 21:38:15 +00008030 return nullptr;
8031 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
8032 cxx_record_decl,
8033 clang::SourceLocation(),
8034 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXOperatorName (op_kind), clang::SourceLocation()),
8035 method_qual_type,
8036 nullptr, // TypeSourceInfo *
8037 SC,
8038 is_inline,
8039 false /*is_constexpr*/,
8040 clang::SourceLocation());
8041 }
8042 else if (num_params == 0)
8043 {
8044 // Conversion operators don't take params...
8045 cxx_method_decl = clang::CXXConversionDecl::Create (*getASTContext(),
8046 cxx_record_decl,
8047 clang::SourceLocation(),
8048 clang::DeclarationNameInfo (getASTContext()->DeclarationNames.getCXXConversionFunctionName (getASTContext()->getCanonicalType (function_type->getReturnType())), clang::SourceLocation()),
8049 method_qual_type,
8050 nullptr, // TypeSourceInfo *
8051 is_inline,
8052 is_explicit,
8053 false /*is_constexpr*/,
8054 clang::SourceLocation());
8055 }
8056 }
8057
8058 if (cxx_method_decl == nullptr)
8059 {
8060 cxx_method_decl = clang::CXXMethodDecl::Create (*getASTContext(),
8061 cxx_record_decl,
8062 clang::SourceLocation(),
8063 clang::DeclarationNameInfo (decl_name, clang::SourceLocation()),
8064 method_qual_type,
8065 nullptr, // TypeSourceInfo *
8066 SC,
8067 is_inline,
8068 false /*is_constexpr*/,
8069 clang::SourceLocation());
8070 }
8071 }
8072
8073 clang::AccessSpecifier access_specifier = ClangASTContext::ConvertAccessTypeToAccessSpecifier (access);
8074
8075 cxx_method_decl->setAccess (access_specifier);
8076 cxx_method_decl->setVirtualAsWritten (is_virtual);
8077
8078 if (is_attr_used)
8079 cxx_method_decl->addAttr(clang::UsedAttr::CreateImplicit(*getASTContext()));
8080
8081 // Populate the method decl with parameter decls
8082
8083 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8084
8085 for (unsigned param_index = 0;
8086 param_index < num_params;
8087 ++param_index)
8088 {
8089 params.push_back (clang::ParmVarDecl::Create (*getASTContext(),
8090 cxx_method_decl,
8091 clang::SourceLocation(),
8092 clang::SourceLocation(),
8093 nullptr, // anonymous
8094 method_function_prototype->getParamType(param_index),
8095 nullptr,
8096 clang::SC_None,
8097 nullptr));
8098 }
8099
8100 cxx_method_decl->setParams (llvm::ArrayRef<clang::ParmVarDecl*>(params));
8101
8102 cxx_record_decl->addDecl (cxx_method_decl);
8103
8104 // Sometimes the debug info will mention a constructor (default/copy/move),
8105 // destructor, or assignment operator (copy/move) but there won't be any
8106 // version of this in the code. So we check if the function was artificially
8107 // generated and if it is trivial and this lets the compiler/backend know
8108 // that it can inline the IR for these when it needs to and we can avoid a
8109 // "missing function" error when running expressions.
8110
8111 if (is_artificial)
8112 {
8113 if (cxx_ctor_decl &&
8114 ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
8115 (cxx_ctor_decl->isCopyConstructor() && cxx_record_decl->hasTrivialCopyConstructor ()) ||
8116 (cxx_ctor_decl->isMoveConstructor() && cxx_record_decl->hasTrivialMoveConstructor ()) ))
8117 {
8118 cxx_ctor_decl->setDefaulted();
8119 cxx_ctor_decl->setTrivial(true);
8120 }
8121 else if (cxx_dtor_decl)
8122 {
8123 if (cxx_record_decl->hasTrivialDestructor())
8124 {
8125 cxx_dtor_decl->setDefaulted();
8126 cxx_dtor_decl->setTrivial(true);
8127 }
8128 }
8129 else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
8130 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
8131 {
8132 cxx_method_decl->setDefaulted();
8133 cxx_method_decl->setTrivial(true);
8134 }
8135 }
8136
8137#ifdef LLDB_CONFIGURATION_DEBUG
8138 VerifyDecl(cxx_method_decl);
8139#endif
8140
8141 // printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic());
8142 // printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate());
8143 // printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD());
8144 // printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty());
8145 // printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract());
8146 // printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor());
8147 // printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
8148 // printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
8149 // printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor());
8150 return cxx_method_decl;
8151}
8152
8153
8154#pragma mark C++ Base Classes
8155
8156clang::CXXBaseSpecifier *
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008157ClangASTContext::CreateBaseClassSpecifier (lldb::opaque_compiler_type_t type, AccessType access, bool is_virtual, bool base_of_class)
Greg Claytond8d4a572015-08-11 21:38:15 +00008158{
8159 if (type)
8160 return new clang::CXXBaseSpecifier (clang::SourceRange(),
8161 is_virtual,
8162 base_of_class,
8163 ClangASTContext::ConvertAccessTypeToAccessSpecifier (access),
8164 getASTContext()->getTrivialTypeSourceInfo (GetQualType(type)),
8165 clang::SourceLocation());
8166 return nullptr;
8167}
8168
8169void
8170ClangASTContext::DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes, unsigned num_base_classes)
8171{
8172 for (unsigned i=0; i<num_base_classes; ++i)
8173 {
8174 delete base_classes[i];
8175 base_classes[i] = nullptr;
8176 }
8177}
8178
8179bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008180ClangASTContext::SetBaseClassesForClassType (lldb::opaque_compiler_type_t type, clang::CXXBaseSpecifier const * const *base_classes,
Greg Claytond8d4a572015-08-11 21:38:15 +00008181 unsigned num_base_classes)
8182{
8183 if (type)
8184 {
8185 clang::CXXRecordDecl *cxx_record_decl = GetAsCXXRecordDecl(type);
8186 if (cxx_record_decl)
8187 {
8188 cxx_record_decl->setBases(base_classes, num_base_classes);
8189 return true;
8190 }
8191 }
8192 return false;
8193}
8194
8195bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008196ClangASTContext::SetObjCSuperClass (const CompilerType& type, const CompilerType &superclass_clang_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008197{
Greg Claytonf73034f2015-09-08 18:15:05 +00008198 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008199 if (!ast)
8200 return false;
8201 clang::ASTContext* clang_ast = ast->getASTContext();
8202
8203 if (type && superclass_clang_type.IsValid() && superclass_clang_type.GetTypeSystem() == type.GetTypeSystem())
8204 {
8205 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8206 clang::ObjCInterfaceDecl *super_interface_decl = GetAsObjCInterfaceDecl (superclass_clang_type);
8207 if (class_interface_decl && super_interface_decl)
8208 {
8209 class_interface_decl->setSuperClass(clang_ast->getTrivialTypeSourceInfo(clang_ast->getObjCInterfaceType(super_interface_decl)));
8210 return true;
8211 }
8212 }
8213 return false;
8214}
8215
8216bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008217ClangASTContext::AddObjCClassProperty (const CompilerType& type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008218 const char *property_name,
Greg Claytona1e5dc82015-08-11 22:53:00 +00008219 const CompilerType &property_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008220 clang::ObjCIvarDecl *ivar_decl,
8221 const char *property_setter_name,
8222 const char *property_getter_name,
8223 uint32_t property_attributes,
8224 ClangASTMetadata *metadata)
8225{
8226 if (!type || !property_clang_type.IsValid() || property_name == nullptr || property_name[0] == '\0')
8227 return false;
Greg Claytonf73034f2015-09-08 18:15:05 +00008228 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008229 if (!ast)
8230 return false;
8231 clang::ASTContext* clang_ast = ast->getASTContext();
8232
8233 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8234
8235 if (class_interface_decl)
8236 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00008237 CompilerType property_clang_type_to_access;
Greg Claytond8d4a572015-08-11 21:38:15 +00008238
8239 if (property_clang_type.IsValid())
8240 property_clang_type_to_access = property_clang_type;
8241 else if (ivar_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008242 property_clang_type_to_access = CompilerType (clang_ast, ivar_decl->getType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008243
8244 if (class_interface_decl && property_clang_type_to_access.IsValid())
8245 {
8246 clang::TypeSourceInfo *prop_type_source;
8247 if (ivar_decl)
8248 prop_type_source = clang_ast->getTrivialTypeSourceInfo (ivar_decl->getType());
8249 else
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008250 prop_type_source = clang_ast->getTrivialTypeSourceInfo(ClangUtil::GetQualType(property_clang_type));
8251
8252 clang::ObjCPropertyDecl *property_decl = clang::ObjCPropertyDecl::Create(
8253 *clang_ast, class_interface_decl,
8254 clang::SourceLocation(), // Source Location
8255 &clang_ast->Idents.get(property_name),
8256 clang::SourceLocation(), // Source Location for AT
8257 clang::SourceLocation(), // Source location for (
8258 ivar_decl ? ivar_decl->getType() : ClangUtil::GetQualType(property_clang_type), prop_type_source);
8259
Greg Claytond8d4a572015-08-11 21:38:15 +00008260 if (property_decl)
8261 {
8262 if (metadata)
8263 ClangASTContext::SetMetadata(clang_ast, property_decl, *metadata);
8264
8265 class_interface_decl->addDecl (property_decl);
8266
8267 clang::Selector setter_sel, getter_sel;
8268
8269 if (property_setter_name != nullptr)
8270 {
8271 std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
8272 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(property_setter_no_colon.c_str());
8273 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8274 }
8275 else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
8276 {
8277 std::string setter_sel_string("set");
8278 setter_sel_string.push_back(::toupper(property_name[0]));
8279 setter_sel_string.append(&property_name[1]);
8280 clang::IdentifierInfo *setter_ident = &clang_ast->Idents.get(setter_sel_string.c_str());
8281 setter_sel = clang_ast->Selectors.getSelector(1, &setter_ident);
8282 }
8283 property_decl->setSetterName(setter_sel);
8284 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
8285
8286 if (property_getter_name != nullptr)
8287 {
8288 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_getter_name);
8289 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8290 }
8291 else
8292 {
8293 clang::IdentifierInfo *getter_ident = &clang_ast->Idents.get(property_name);
8294 getter_sel = clang_ast->Selectors.getSelector(0, &getter_ident);
8295 }
8296 property_decl->setGetterName(getter_sel);
8297 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
8298
8299 if (ivar_decl)
8300 property_decl->setPropertyIvarDecl (ivar_decl);
8301
8302 if (property_attributes & DW_APPLE_PROPERTY_readonly)
8303 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
8304 if (property_attributes & DW_APPLE_PROPERTY_readwrite)
8305 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
8306 if (property_attributes & DW_APPLE_PROPERTY_assign)
8307 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
8308 if (property_attributes & DW_APPLE_PROPERTY_retain)
8309 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
8310 if (property_attributes & DW_APPLE_PROPERTY_copy)
8311 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
8312 if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
8313 property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
Greg Clayton7853dd52016-07-14 19:31:18 +00008314 if (property_attributes & clang::ObjCPropertyDecl::OBJC_PR_nullability)
8315 property_decl->setPropertyAttributes(clang::ObjCPropertyDecl::OBJC_PR_nullability);
8316 if (property_attributes & clang::ObjCPropertyDecl::OBJC_PR_null_resettable)
8317 property_decl->setPropertyAttributes(clang::ObjCPropertyDecl::OBJC_PR_null_resettable);
8318 if (property_attributes & clang::ObjCPropertyDecl::OBJC_PR_class)
8319 property_decl->setPropertyAttributes(clang::ObjCPropertyDecl::OBJC_PR_class);
8320
8321 const bool isInstance = (property_attributes & clang::ObjCPropertyDecl::OBJC_PR_class) == 0;
8322
8323 if (!getter_sel.isNull() &&
8324 !(isInstance ? class_interface_decl->lookupInstanceMethod(getter_sel)
8325 : class_interface_decl->lookupClassMethod(getter_sel)))
Greg Claytond8d4a572015-08-11 21:38:15 +00008326 {
Greg Claytond8d4a572015-08-11 21:38:15 +00008327 const bool isVariadic = false;
8328 const bool isSynthesized = false;
8329 const bool isImplicitlyDeclared = true;
8330 const bool isDefined = false;
8331 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8332 const bool HasRelatedResultType = false;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008333
8334 clang::ObjCMethodDecl *getter = clang::ObjCMethodDecl::Create(
8335 *clang_ast, clang::SourceLocation(), clang::SourceLocation(), getter_sel,
8336 ClangUtil::GetQualType(property_clang_type_to_access), nullptr, class_interface_decl,
8337 isInstance, isVariadic, isSynthesized, isImplicitlyDeclared, isDefined, impControl,
8338 HasRelatedResultType);
8339
Greg Claytond8d4a572015-08-11 21:38:15 +00008340 if (getter && metadata)
8341 ClangASTContext::SetMetadata(clang_ast, getter, *metadata);
8342
8343 if (getter)
8344 {
8345 getter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(), llvm::ArrayRef<clang::SourceLocation>());
8346
8347 class_interface_decl->addDecl(getter);
8348 }
8349 }
Greg Clayton7853dd52016-07-14 19:31:18 +00008350
8351 if (!setter_sel.isNull() &&
8352 !(isInstance ? class_interface_decl->lookupInstanceMethod(setter_sel)
8353 : class_interface_decl->lookupClassMethod(setter_sel)))
Greg Claytond8d4a572015-08-11 21:38:15 +00008354 {
8355 clang::QualType result_type = clang_ast->VoidTy;
Greg Claytond8d4a572015-08-11 21:38:15 +00008356 const bool isVariadic = false;
8357 const bool isSynthesized = false;
8358 const bool isImplicitlyDeclared = true;
8359 const bool isDefined = false;
8360 const clang::ObjCMethodDecl::ImplementationControl impControl = clang::ObjCMethodDecl::None;
8361 const bool HasRelatedResultType = false;
8362
8363 clang::ObjCMethodDecl *setter = clang::ObjCMethodDecl::Create (*clang_ast,
8364 clang::SourceLocation(),
8365 clang::SourceLocation(),
8366 setter_sel,
8367 result_type,
8368 nullptr,
8369 class_interface_decl,
8370 isInstance,
8371 isVariadic,
8372 isSynthesized,
8373 isImplicitlyDeclared,
8374 isDefined,
8375 impControl,
8376 HasRelatedResultType);
8377
8378 if (setter && metadata)
8379 ClangASTContext::SetMetadata(clang_ast, setter, *metadata);
8380
8381 llvm::SmallVector<clang::ParmVarDecl *, 1> params;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008382
8383 params.push_back(clang::ParmVarDecl::Create(
8384 *clang_ast, setter, clang::SourceLocation(), clang::SourceLocation(),
8385 nullptr, // anonymous
8386 ClangUtil::GetQualType(property_clang_type_to_access), nullptr, clang::SC_Auto, nullptr));
8387
Greg Claytond8d4a572015-08-11 21:38:15 +00008388 if (setter)
8389 {
8390 setter->setMethodParams(*clang_ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8391
8392 class_interface_decl->addDecl(setter);
8393 }
8394 }
8395
8396 return true;
8397 }
8398 }
8399 }
8400 return false;
8401}
8402
8403bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008404ClangASTContext::IsObjCClassTypeAndHasIVars (const CompilerType& type, bool check_superclass)
Greg Claytond8d4a572015-08-11 21:38:15 +00008405{
8406 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl (type);
8407 if (class_interface_decl)
8408 return ObjCDeclHasIVars (class_interface_decl, check_superclass);
8409 return false;
8410}
8411
8412
8413clang::ObjCMethodDecl *
Greg Claytona1e5dc82015-08-11 22:53:00 +00008414ClangASTContext::AddMethodToObjCObjectType (const CompilerType& type,
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008415 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 +00008416 const CompilerType &method_clang_type,
Greg Claytond8d4a572015-08-11 21:38:15 +00008417 lldb::AccessType access,
Sean Callanan5b42f4b2016-06-24 00:24:40 +00008418 bool is_artificial,
8419 bool is_variadic)
Greg Claytond8d4a572015-08-11 21:38:15 +00008420{
8421 if (!type || !method_clang_type.IsValid())
8422 return nullptr;
8423
8424 clang::ObjCInterfaceDecl *class_interface_decl = GetAsObjCInterfaceDecl(type);
8425
8426 if (class_interface_decl == nullptr)
8427 return nullptr;
Greg Claytonf73034f2015-09-08 18:15:05 +00008428 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8429 if (lldb_ast == nullptr)
8430 return nullptr;
8431 clang::ASTContext *ast = lldb_ast->getASTContext();
8432
Greg Claytond8d4a572015-08-11 21:38:15 +00008433 const char *selector_start = ::strchr (name, ' ');
8434 if (selector_start == nullptr)
8435 return nullptr;
8436
8437 selector_start++;
8438 llvm::SmallVector<clang::IdentifierInfo *, 12> selector_idents;
8439
8440 size_t len = 0;
8441 const char *start;
8442 //printf ("name = '%s'\n", name);
8443
8444 unsigned num_selectors_with_args = 0;
8445 for (start = selector_start;
8446 start && *start != '\0' && *start != ']';
8447 start += len)
8448 {
8449 len = ::strcspn(start, ":]");
8450 bool has_arg = (start[len] == ':');
8451 if (has_arg)
8452 ++num_selectors_with_args;
8453 selector_idents.push_back (&ast->Idents.get (llvm::StringRef (start, len)));
8454 if (has_arg)
8455 len += 1;
8456 }
8457
8458
8459 if (selector_idents.size() == 0)
8460 return nullptr;
8461
8462 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
8463 selector_idents.data());
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008464
8465 clang::QualType method_qual_type(ClangUtil::GetQualType(method_clang_type));
8466
Greg Claytond8d4a572015-08-11 21:38:15 +00008467 // Populate the method decl with parameter decls
8468 const clang::Type *method_type(method_qual_type.getTypePtr());
8469
8470 if (method_type == nullptr)
8471 return nullptr;
8472
8473 const clang::FunctionProtoType *method_function_prototype (llvm::dyn_cast<clang::FunctionProtoType>(method_type));
8474
8475 if (!method_function_prototype)
8476 return nullptr;
8477
8478
Greg Claytond8d4a572015-08-11 21:38:15 +00008479 bool is_synthesized = false;
8480 bool is_defined = false;
8481 clang::ObjCMethodDecl::ImplementationControl imp_control = clang::ObjCMethodDecl::None;
8482
8483 const unsigned num_args = method_function_prototype->getNumParams();
8484
8485 if (num_args != num_selectors_with_args)
8486 return nullptr; // some debug information is corrupt. We are not going to deal with it.
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008487
8488 clang::ObjCMethodDecl *objc_method_decl = clang::ObjCMethodDecl::Create(
8489 *ast,
8490 clang::SourceLocation(), // beginLoc,
8491 clang::SourceLocation(), // endLoc,
8492 method_selector, method_function_prototype->getReturnType(),
8493 nullptr, // TypeSourceInfo *ResultTInfo,
8494 ClangASTContext::GetASTContext(ast)->GetDeclContextForType(ClangUtil::GetQualType(type)), name[0] == '-',
8495 is_variadic, is_synthesized,
8496 true, // is_implicitly_declared; we force this to true because we don't have source locations
8497 is_defined, imp_control, false /*has_related_result_type*/);
8498
Greg Claytond8d4a572015-08-11 21:38:15 +00008499 if (objc_method_decl == nullptr)
8500 return nullptr;
8501
8502 if (num_args > 0)
8503 {
8504 llvm::SmallVector<clang::ParmVarDecl *, 12> params;
8505
8506 for (unsigned param_index = 0; param_index < num_args; ++param_index)
8507 {
8508 params.push_back (clang::ParmVarDecl::Create (*ast,
8509 objc_method_decl,
8510 clang::SourceLocation(),
8511 clang::SourceLocation(),
8512 nullptr, // anonymous
8513 method_function_prototype->getParamType(param_index),
8514 nullptr,
8515 clang::SC_Auto,
8516 nullptr));
8517 }
8518
8519 objc_method_decl->setMethodParams(*ast, llvm::ArrayRef<clang::ParmVarDecl*>(params), llvm::ArrayRef<clang::SourceLocation>());
8520 }
8521
8522 class_interface_decl->addDecl (objc_method_decl);
8523
8524#ifdef LLDB_CONFIGURATION_DEBUG
8525 VerifyDecl(objc_method_decl);
8526#endif
8527
8528 return objc_method_decl;
8529}
8530
8531bool
Greg Claytone6b36cd2015-12-08 01:02:08 +00008532ClangASTContext::GetHasExternalStorage (const CompilerType &type)
8533{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008534 if (ClangUtil::IsClangType(type))
Greg Claytone6b36cd2015-12-08 01:02:08 +00008535 return false;
8536
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008537 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(type));
Greg Claytone6b36cd2015-12-08 01:02:08 +00008538
8539 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8540 switch (type_class)
8541 {
8542 case clang::Type::Record:
8543 {
8544 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8545 if (cxx_record_decl)
8546 return cxx_record_decl->hasExternalLexicalStorage () || cxx_record_decl->hasExternalVisibleStorage();
8547 }
8548 break;
8549
8550 case clang::Type::Enum:
8551 {
8552 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8553 if (enum_decl)
8554 return enum_decl->hasExternalLexicalStorage () || enum_decl->hasExternalVisibleStorage();
8555 }
8556 break;
8557
8558 case clang::Type::ObjCObject:
8559 case clang::Type::ObjCInterface:
8560 {
8561 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8562 assert (objc_class_type);
8563 if (objc_class_type)
8564 {
8565 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8566
8567 if (class_interface_decl)
8568 return class_interface_decl->hasExternalLexicalStorage () || class_interface_decl->hasExternalVisibleStorage ();
8569 }
8570 }
8571 break;
8572
8573 case clang::Type::Typedef:
8574 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()));
8575
Enrico Granata36f51e42015-12-18 22:41:25 +00008576 case clang::Type::Auto:
8577 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
8578
Greg Claytone6b36cd2015-12-08 01:02:08 +00008579 case clang::Type::Elaborated:
8580 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
8581
8582 case clang::Type::Paren:
8583 return GetHasExternalStorage (CompilerType(type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
8584
8585 default:
8586 break;
8587 }
8588 return false;
8589}
8590
8591
8592bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008593ClangASTContext::SetHasExternalStorage (lldb::opaque_compiler_type_t type, bool has_extern)
Greg Claytond8d4a572015-08-11 21:38:15 +00008594{
8595 if (!type)
8596 return false;
8597
8598 clang::QualType qual_type (GetCanonicalQualType(type));
8599
8600 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
8601 switch (type_class)
8602 {
8603 case clang::Type::Record:
8604 {
8605 clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
8606 if (cxx_record_decl)
8607 {
8608 cxx_record_decl->setHasExternalLexicalStorage (has_extern);
8609 cxx_record_decl->setHasExternalVisibleStorage (has_extern);
8610 return true;
8611 }
8612 }
8613 break;
8614
8615 case clang::Type::Enum:
8616 {
8617 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
8618 if (enum_decl)
8619 {
8620 enum_decl->setHasExternalLexicalStorage (has_extern);
8621 enum_decl->setHasExternalVisibleStorage (has_extern);
8622 return true;
8623 }
8624 }
8625 break;
8626
8627 case clang::Type::ObjCObject:
8628 case clang::Type::ObjCInterface:
8629 {
8630 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
8631 assert (objc_class_type);
8632 if (objc_class_type)
8633 {
8634 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
8635
8636 if (class_interface_decl)
8637 {
8638 class_interface_decl->setHasExternalLexicalStorage (has_extern);
8639 class_interface_decl->setHasExternalVisibleStorage (has_extern);
8640 return true;
8641 }
8642 }
8643 }
8644 break;
8645
8646 case clang::Type::Typedef:
8647 return SetHasExternalStorage(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
Enrico Granata36f51e42015-12-18 22:41:25 +00008648
8649 case clang::Type::Auto:
8650 return SetHasExternalStorage (llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr(), has_extern);
Greg Claytond8d4a572015-08-11 21:38:15 +00008651
8652 case clang::Type::Elaborated:
8653 return SetHasExternalStorage (llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
8654
8655 case clang::Type::Paren:
8656 return SetHasExternalStorage (llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr(), has_extern);
8657
8658 default:
8659 break;
8660 }
8661 return false;
8662}
8663
8664
8665#pragma mark TagDecl
8666
8667bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008668ClangASTContext::StartTagDeclarationDefinition (const CompilerType &type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008669{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008670 clang::QualType qual_type(ClangUtil::GetQualType(type));
Greg Claytone6b36cd2015-12-08 01:02:08 +00008671 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008672 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008673 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8674 if (tag_type)
Greg Clayton5dfc4a42015-12-02 00:43:32 +00008675 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008676 clang::TagDecl *tag_decl = tag_type->getDecl();
8677 if (tag_decl)
Greg Claytond8d4a572015-08-11 21:38:15 +00008678 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008679 tag_decl->startDefinition();
8680 return true;
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008681 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008682 }
8683
8684 const clang::ObjCObjectType *object_type = qual_type->getAs<clang::ObjCObjectType>();
8685 if (object_type)
8686 {
8687 clang::ObjCInterfaceDecl *interface_decl = object_type->getInterface();
8688 if (interface_decl)
Tamas Berghammerfcf334b2015-12-02 11:35:54 +00008689 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008690 interface_decl->startDefinition();
8691 return true;
Greg Claytond8d4a572015-08-11 21:38:15 +00008692 }
8693 }
8694 }
8695 return false;
8696}
8697
8698bool
Greg Claytona1e5dc82015-08-11 22:53:00 +00008699ClangASTContext::CompleteTagDeclarationDefinition (const CompilerType& type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008700{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008701 clang::QualType qual_type(ClangUtil::GetQualType(type));
Greg Claytone6b36cd2015-12-08 01:02:08 +00008702 if (!qual_type.isNull())
Greg Claytond8d4a572015-08-11 21:38:15 +00008703 {
Greg Clayton23c12ca2016-05-26 19:24:02 +00008704 // Make sure we use the same methodology as ClangASTContext::StartTagDeclarationDefinition()
8705 // as to how we start/end the definition. Previously we were calling
8706 const clang::TagType *tag_type = qual_type->getAs<clang::TagType>();
8707 if (tag_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008708 {
Greg Clayton23c12ca2016-05-26 19:24:02 +00008709 clang::TagDecl *tag_decl = tag_type->getDecl();
8710 if (tag_decl)
8711 {
8712 clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast_or_null<clang::CXXRecordDecl>(tag_decl);
8713
8714 if (cxx_record_decl)
8715 {
8716 if (!cxx_record_decl->isCompleteDefinition())
8717 cxx_record_decl->completeDefinition();
8718 cxx_record_decl->setHasLoadedFieldsFromExternalStorage(true);
8719 cxx_record_decl->setHasExternalLexicalStorage (false);
8720 cxx_record_decl->setHasExternalVisibleStorage (false);
8721 return true;
8722 }
8723 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008724 }
Greg Clayton23c12ca2016-05-26 19:24:02 +00008725
Greg Claytone6b36cd2015-12-08 01:02:08 +00008726 const clang::EnumType *enutype = qual_type->getAs<clang::EnumType>();
Greg Claytond8d4a572015-08-11 21:38:15 +00008727
8728 if (enutype)
8729 {
8730 clang::EnumDecl *enum_decl = enutype->getDecl();
8731
8732 if (enum_decl)
8733 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008734 if (!enum_decl->isCompleteDefinition())
Greg Claytond8d4a572015-08-11 21:38:15 +00008735 {
Greg Claytone6b36cd2015-12-08 01:02:08 +00008736 ClangASTContext *lldb_ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
8737 if (lldb_ast == nullptr)
8738 return false;
8739 clang::ASTContext *ast = lldb_ast->getASTContext();
8740
8741 /// TODO This really needs to be fixed.
Greg Clayton909b277842016-04-29 20:48:39 +00008742
8743 QualType integer_type(enum_decl->getIntegerType());
8744 if (!integer_type.isNull())
Greg Claytone6b36cd2015-12-08 01:02:08 +00008745 {
Greg Clayton909b277842016-04-29 20:48:39 +00008746 unsigned NumPositiveBits = 1;
8747 unsigned NumNegativeBits = 0;
8748
8749 clang::QualType promotion_qual_type;
8750 // If the enum integer type is less than an integer in bit width,
8751 // then we must promote it to an integer size.
8752 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
8753 {
8754 if (enum_decl->getIntegerType()->isSignedIntegerType())
8755 promotion_qual_type = ast->IntTy;
8756 else
8757 promotion_qual_type = ast->UnsignedIntTy;
8758 }
Greg Claytone6b36cd2015-12-08 01:02:08 +00008759 else
Greg Clayton909b277842016-04-29 20:48:39 +00008760 promotion_qual_type = enum_decl->getIntegerType();
8761
8762 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
Greg Claytone6b36cd2015-12-08 01:02:08 +00008763 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008764 }
Greg Claytond8d4a572015-08-11 21:38:15 +00008765 return true;
8766 }
8767 }
8768 }
8769 return false;
8770}
8771
Greg Claytond8d4a572015-08-11 21:38:15 +00008772bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008773ClangASTContext::AddEnumerationValueToEnumerationType (lldb::opaque_compiler_type_t type,
Greg Clayton8b4edba2015-08-14 20:02:05 +00008774 const CompilerType &enumerator_clang_type,
8775 const Declaration &decl,
8776 const char *name,
8777 int64_t enum_value,
8778 uint32_t enum_value_bit_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008779{
8780 if (type && enumerator_clang_type.IsValid() && name && name[0])
8781 {
8782 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8783
8784 bool is_signed = false;
8785 enumerator_clang_type.IsIntegerType (is_signed);
8786 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8787 if (clang_type)
8788 {
8789 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8790
8791 if (enutype)
8792 {
8793 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, is_signed);
8794 enum_llvm_apsint = enum_value;
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008795 clang::EnumConstantDecl *enumerator_decl = clang::EnumConstantDecl::Create(
8796 *getASTContext(), enutype->getDecl(), clang::SourceLocation(),
8797 name ? &getASTContext()->Idents.get(name) : nullptr, // Identifier
8798 ClangUtil::GetQualType(enumerator_clang_type), nullptr, enum_llvm_apsint);
8799
Greg Claytond8d4a572015-08-11 21:38:15 +00008800 if (enumerator_decl)
8801 {
8802 enutype->getDecl()->addDecl(enumerator_decl);
8803
8804#ifdef LLDB_CONFIGURATION_DEBUG
8805 VerifyDecl(enumerator_decl);
8806#endif
8807
8808 return true;
8809 }
8810 }
8811 }
8812 }
8813 return false;
8814}
8815
Greg Claytona1e5dc82015-08-11 22:53:00 +00008816CompilerType
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008817ClangASTContext::GetEnumerationIntegerType (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008818{
8819 clang::QualType enum_qual_type (GetCanonicalQualType(type));
8820 const clang::Type *clang_type = enum_qual_type.getTypePtr();
8821 if (clang_type)
8822 {
8823 const clang::EnumType *enutype = llvm::dyn_cast<clang::EnumType>(clang_type);
8824 if (enutype)
8825 {
8826 clang::EnumDecl *enum_decl = enutype->getDecl();
8827 if (enum_decl)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008828 return CompilerType (getASTContext(), enum_decl->getIntegerType());
Greg Claytond8d4a572015-08-11 21:38:15 +00008829 }
8830 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008831 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008832}
8833
Greg Claytona1e5dc82015-08-11 22:53:00 +00008834CompilerType
8835ClangASTContext::CreateMemberPointerType (const CompilerType& type, const CompilerType &pointee_type)
Greg Claytond8d4a572015-08-11 21:38:15 +00008836{
8837 if (type && pointee_type.IsValid() && type.GetTypeSystem() == pointee_type.GetTypeSystem())
8838 {
Greg Claytonf73034f2015-09-08 18:15:05 +00008839 ClangASTContext *ast = llvm::dyn_cast<ClangASTContext>(type.GetTypeSystem());
Greg Claytond8d4a572015-08-11 21:38:15 +00008840 if (!ast)
Greg Claytona1e5dc82015-08-11 22:53:00 +00008841 return CompilerType();
Zachary Turnerd133f6a2016-03-28 22:53:41 +00008842 return CompilerType(ast->getASTContext(),
8843 ast->getASTContext()->getMemberPointerType(ClangUtil::GetQualType(pointee_type),
8844 ClangUtil::GetQualType(type).getTypePtr()));
Greg Claytond8d4a572015-08-11 21:38:15 +00008845 }
Greg Claytona1e5dc82015-08-11 22:53:00 +00008846 return CompilerType();
Greg Claytond8d4a572015-08-11 21:38:15 +00008847}
8848
8849
8850size_t
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008851ClangASTContext::ConvertStringToFloatValue (lldb::opaque_compiler_type_t type, const char *s, uint8_t *dst, size_t dst_size)
Greg Claytond8d4a572015-08-11 21:38:15 +00008852{
8853 if (type)
8854 {
8855 clang::QualType qual_type (GetCanonicalQualType(type));
8856 uint32_t count = 0;
8857 bool is_complex = false;
8858 if (IsFloatingPointType (type, count, is_complex))
8859 {
8860 // TODO: handle complex and vector types
8861 if (count != 1)
8862 return false;
8863
8864 llvm::StringRef s_sref(s);
8865 llvm::APFloat ap_float(getASTContext()->getFloatTypeSemantics(qual_type), s_sref);
8866
8867 const uint64_t bit_size = getASTContext()->getTypeSize (qual_type);
8868 const uint64_t byte_size = bit_size / 8;
8869 if (dst_size >= byte_size)
8870 {
Ulrich Weigand9521ad22016-04-15 09:55:52 +00008871 Scalar scalar = ap_float.bitcastToAPInt().zextOrTrunc(llvm::NextPowerOf2(byte_size) * 8);
8872 lldb_private::Error get_data_error;
8873 if (scalar.GetAsMemoryData(dst, byte_size, lldb_private::endian::InlHostByteOrder(), get_data_error))
Greg Claytond8d4a572015-08-11 21:38:15 +00008874 return byte_size;
Greg Claytond8d4a572015-08-11 21:38:15 +00008875 }
8876 }
8877 }
8878 return 0;
8879}
8880
8881
8882
8883//----------------------------------------------------------------------
8884// Dumping types
8885//----------------------------------------------------------------------
8886#define DEPTH_INCREMENT 2
8887
8888void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00008889ClangASTContext::DumpValue (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00008890 Stream *s,
8891 lldb::Format format,
8892 const lldb_private::DataExtractor &data,
8893 lldb::offset_t data_byte_offset,
8894 size_t data_byte_size,
8895 uint32_t bitfield_bit_size,
8896 uint32_t bitfield_bit_offset,
8897 bool show_types,
8898 bool show_summary,
8899 bool verbose,
8900 uint32_t depth)
8901{
8902 if (!type)
8903 return;
8904
8905 clang::QualType qual_type(GetQualType(type));
8906 switch (qual_type->getTypeClass())
8907 {
8908 case clang::Type::Record:
8909 if (GetCompleteType(type))
8910 {
8911 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
8912 const clang::RecordDecl *record_decl = record_type->getDecl();
8913 assert(record_decl);
8914 uint32_t field_bit_offset = 0;
8915 uint32_t field_byte_offset = 0;
8916 const clang::ASTRecordLayout &record_layout = getASTContext()->getASTRecordLayout(record_decl);
8917 uint32_t child_idx = 0;
8918
8919 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
8920 if (cxx_record_decl)
8921 {
8922 // We might have base classes to print out first
8923 clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
8924 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
8925 base_class != base_class_end;
8926 ++base_class)
8927 {
8928 const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
8929
8930 // Skip empty base classes
8931 if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
8932 continue;
8933
8934 if (base_class->isVirtual())
8935 field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
8936 else
8937 field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
8938 field_byte_offset = field_bit_offset / 8;
8939 assert (field_bit_offset % 8 == 0);
8940 if (child_idx == 0)
8941 s->PutChar('{');
8942 else
8943 s->PutChar(',');
8944
8945 clang::QualType base_class_qual_type = base_class->getType();
8946 std::string base_class_type_name(base_class_qual_type.getAsString());
8947
8948 // Indent and print the base class type name
8949 s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
8950
8951 clang::TypeInfo base_class_type_info = getASTContext()->getTypeInfo(base_class_qual_type);
8952
8953 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00008954 CompilerType base_clang_type(getASTContext(), base_class_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00008955 base_clang_type.DumpValue (exe_ctx,
8956 s, // Stream to dump to
8957 base_clang_type.GetFormat(), // The format with which to display the member
8958 data, // Data buffer containing all bytes for this type
8959 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
8960 base_class_type_info.Width / 8, // Size of this type in bytes
8961 0, // Bitfield bit size
8962 0, // Bitfield bit offset
8963 show_types, // Boolean indicating if we should show the variable types
8964 show_summary, // Boolean indicating if we should show a summary for the current type
8965 verbose, // Verbose output?
8966 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
8967
8968 ++child_idx;
8969 }
8970 }
8971 uint32_t field_idx = 0;
8972 clang::RecordDecl::field_iterator field, field_end;
8973 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
8974 {
8975 // Print the starting squiggly bracket (if this is the
8976 // first member) or comma (for member 2 and beyond) for
8977 // the struct/union/class member.
8978 if (child_idx == 0)
8979 s->PutChar('{');
8980 else
8981 s->PutChar(',');
8982
8983 // Indent
8984 s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
8985
8986 clang::QualType field_type = field->getType();
8987 // Print the member type if requested
8988 // Figure out the type byte size (field_type_info.first) and
8989 // alignment (field_type_info.second) from the AST context.
8990 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(field_type);
8991 assert(field_idx < record_layout.getFieldCount());
8992 // Figure out the field offset within the current struct/union/class type
8993 field_bit_offset = record_layout.getFieldOffset (field_idx);
8994 field_byte_offset = field_bit_offset / 8;
8995 uint32_t field_bitfield_bit_size = 0;
8996 uint32_t field_bitfield_bit_offset = 0;
8997 if (ClangASTContext::FieldIsBitfield (getASTContext(), *field, field_bitfield_bit_size))
8998 field_bitfield_bit_offset = field_bit_offset % 8;
8999
9000 if (show_types)
9001 {
9002 std::string field_type_name(field_type.getAsString());
9003 if (field_bitfield_bit_size > 0)
9004 s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
9005 else
9006 s->Printf("(%s) ", field_type_name.c_str());
9007 }
9008 // Print the member name and equal sign
9009 s->Printf("%s = ", field->getNameAsString().c_str());
9010
9011
9012 // Dump the value of the member
Greg Claytona1e5dc82015-08-11 22:53:00 +00009013 CompilerType field_clang_type (getASTContext(), field_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009014 field_clang_type.DumpValue (exe_ctx,
9015 s, // Stream to dump to
9016 field_clang_type.GetFormat(), // The format with which to display the member
9017 data, // Data buffer containing all bytes for this type
9018 data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
9019 field_type_info.Width / 8, // Size of this type in bytes
9020 field_bitfield_bit_size, // Bitfield bit size
9021 field_bitfield_bit_offset, // Bitfield bit offset
9022 show_types, // Boolean indicating if we should show the variable types
9023 show_summary, // Boolean indicating if we should show a summary for the current type
9024 verbose, // Verbose output?
9025 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9026 }
9027
9028 // Indent the trailing squiggly bracket
9029 if (child_idx > 0)
9030 s->Printf("\n%*s}", depth, "");
9031 }
9032 return;
9033
9034 case clang::Type::Enum:
9035 if (GetCompleteType(type))
9036 {
9037 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9038 const clang::EnumDecl *enum_decl = enutype->getDecl();
9039 assert(enum_decl);
9040 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9041 lldb::offset_t offset = data_byte_offset;
9042 const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
9043 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9044 {
9045 if (enum_pos->getInitVal() == enum_value)
9046 {
9047 s->Printf("%s", enum_pos->getNameAsString().c_str());
9048 return;
9049 }
9050 }
9051 // If we have gotten here we didn't get find the enumerator in the
9052 // enum decl, so just print the integer.
9053 s->Printf("%" PRIi64, enum_value);
9054 }
9055 return;
9056
9057 case clang::Type::ConstantArray:
9058 {
9059 const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
9060 bool is_array_of_characters = false;
9061 clang::QualType element_qual_type = array->getElementType();
9062
9063 const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
9064 if (canonical_type)
9065 is_array_of_characters = canonical_type->isCharType();
9066
9067 const uint64_t element_count = array->getSize().getLimitedValue();
9068
9069 clang::TypeInfo field_type_info = getASTContext()->getTypeInfo(element_qual_type);
9070
9071 uint32_t element_idx = 0;
9072 uint32_t element_offset = 0;
9073 uint64_t element_byte_size = field_type_info.Width / 8;
9074 uint32_t element_stride = element_byte_size;
9075
9076 if (is_array_of_characters)
9077 {
9078 s->PutChar('"');
9079 data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9080 s->PutChar('"');
9081 return;
9082 }
9083 else
9084 {
Greg Claytona1e5dc82015-08-11 22:53:00 +00009085 CompilerType element_clang_type(getASTContext(), element_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009086 lldb::Format element_format = element_clang_type.GetFormat();
9087
9088 for (element_idx = 0; element_idx < element_count; ++element_idx)
9089 {
9090 // Print the starting squiggly bracket (if this is the
9091 // first member) or comman (for member 2 and beyong) for
9092 // the struct/union/class member.
9093 if (element_idx == 0)
9094 s->PutChar('{');
9095 else
9096 s->PutChar(',');
9097
9098 // Indent and print the index
9099 s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
9100
9101 // Figure out the field offset within the current struct/union/class type
9102 element_offset = element_idx * element_stride;
9103
9104 // Dump the value of the member
9105 element_clang_type.DumpValue (exe_ctx,
9106 s, // Stream to dump to
9107 element_format, // The format with which to display the element
9108 data, // Data buffer containing all bytes for this type
9109 data_byte_offset + element_offset,// Offset into "data" where to grab value from
9110 element_byte_size, // Size of this type in bytes
9111 0, // Bitfield bit size
9112 0, // Bitfield bit offset
9113 show_types, // Boolean indicating if we should show the variable types
9114 show_summary, // Boolean indicating if we should show a summary for the current type
9115 verbose, // Verbose output?
9116 depth + DEPTH_INCREMENT); // Scope depth for any types that have children
9117 }
9118
9119 // Indent the trailing squiggly bracket
9120 if (element_idx > 0)
9121 s->Printf("\n%*s}", depth, "");
9122 }
9123 }
9124 return;
9125
9126 case clang::Type::Typedef:
9127 {
9128 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
9129
Greg Claytona1e5dc82015-08-11 22:53:00 +00009130 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009131 lldb::Format typedef_format = typedef_clang_type.GetFormat();
9132 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9133 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9134
9135 return typedef_clang_type.DumpValue (exe_ctx,
9136 s, // Stream to dump to
9137 typedef_format, // The format with which to display the element
9138 data, // Data buffer containing all bytes for this type
9139 data_byte_offset, // Offset into "data" where to grab value from
9140 typedef_byte_size, // Size of this type in bytes
9141 bitfield_bit_size, // Bitfield bit size
9142 bitfield_bit_offset,// Bitfield bit offset
9143 show_types, // Boolean indicating if we should show the variable types
9144 show_summary, // Boolean indicating if we should show a summary for the current type
9145 verbose, // Verbose output?
9146 depth); // Scope depth for any types that have children
9147 }
9148 break;
9149
Enrico Granata36f51e42015-12-18 22:41:25 +00009150 case clang::Type::Auto:
9151 {
9152 clang::QualType elaborated_qual_type = llvm::cast<clang::AutoType>(qual_type)->getDeducedType();
9153 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
9154 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9155 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9156 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9157
9158 return elaborated_clang_type.DumpValue (exe_ctx,
9159 s, // Stream to dump to
9160 elaborated_format, // The format with which to display the element
9161 data, // Data buffer containing all bytes for this type
9162 data_byte_offset, // Offset into "data" where to grab value from
9163 elaborated_byte_size, // Size of this type in bytes
9164 bitfield_bit_size, // Bitfield bit size
9165 bitfield_bit_offset,// Bitfield bit offset
9166 show_types, // Boolean indicating if we should show the variable types
9167 show_summary, // Boolean indicating if we should show a summary for the current type
9168 verbose, // Verbose output?
9169 depth); // Scope depth for any types that have children
9170 }
9171 break;
9172
Greg Claytond8d4a572015-08-11 21:38:15 +00009173 case clang::Type::Elaborated:
9174 {
9175 clang::QualType elaborated_qual_type = llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009176 CompilerType elaborated_clang_type (getASTContext(), elaborated_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009177 lldb::Format elaborated_format = elaborated_clang_type.GetFormat();
9178 clang::TypeInfo elaborated_type_info = getASTContext()->getTypeInfo(elaborated_qual_type);
9179 uint64_t elaborated_byte_size = elaborated_type_info.Width / 8;
9180
9181 return elaborated_clang_type.DumpValue (exe_ctx,
9182 s, // Stream to dump to
9183 elaborated_format, // The format with which to display the element
9184 data, // Data buffer containing all bytes for this type
9185 data_byte_offset, // Offset into "data" where to grab value from
9186 elaborated_byte_size, // Size of this type in bytes
9187 bitfield_bit_size, // Bitfield bit size
9188 bitfield_bit_offset,// Bitfield bit offset
9189 show_types, // Boolean indicating if we should show the variable types
9190 show_summary, // Boolean indicating if we should show a summary for the current type
9191 verbose, // Verbose output?
9192 depth); // Scope depth for any types that have children
9193 }
9194 break;
9195
9196 case clang::Type::Paren:
9197 {
9198 clang::QualType desugar_qual_type = llvm::cast<clang::ParenType>(qual_type)->desugar();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009199 CompilerType desugar_clang_type (getASTContext(), desugar_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009200
9201 lldb::Format desugar_format = desugar_clang_type.GetFormat();
9202 clang::TypeInfo desugar_type_info = getASTContext()->getTypeInfo(desugar_qual_type);
9203 uint64_t desugar_byte_size = desugar_type_info.Width / 8;
9204
9205 return desugar_clang_type.DumpValue (exe_ctx,
9206 s, // Stream to dump to
9207 desugar_format, // The format with which to display the element
9208 data, // Data buffer containing all bytes for this type
9209 data_byte_offset, // Offset into "data" where to grab value from
9210 desugar_byte_size, // Size of this type in bytes
9211 bitfield_bit_size, // Bitfield bit size
9212 bitfield_bit_offset,// Bitfield bit offset
9213 show_types, // Boolean indicating if we should show the variable types
9214 show_summary, // Boolean indicating if we should show a summary for the current type
9215 verbose, // Verbose output?
9216 depth); // Scope depth for any types that have children
9217 }
9218 break;
9219
9220 default:
9221 // We are down to a scalar type that we just need to display.
9222 data.Dump(s,
9223 data_byte_offset,
9224 format,
9225 data_byte_size,
9226 1,
9227 UINT32_MAX,
9228 LLDB_INVALID_ADDRESS,
9229 bitfield_bit_size,
9230 bitfield_bit_offset);
9231
9232 if (show_summary)
9233 DumpSummary (type, exe_ctx, s, data, data_byte_offset, data_byte_size);
9234 break;
9235 }
9236}
9237
9238
9239
9240
9241bool
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009242ClangASTContext::DumpTypeValue (lldb::opaque_compiler_type_t type, Stream *s,
Greg Claytond8d4a572015-08-11 21:38:15 +00009243 lldb::Format format,
9244 const lldb_private::DataExtractor &data,
9245 lldb::offset_t byte_offset,
9246 size_t byte_size,
9247 uint32_t bitfield_bit_size,
9248 uint32_t bitfield_bit_offset,
9249 ExecutionContextScope *exe_scope)
9250{
9251 if (!type)
9252 return false;
9253 if (IsAggregateType(type))
9254 {
9255 return false;
9256 }
9257 else
9258 {
9259 clang::QualType qual_type(GetQualType(type));
9260
9261 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9262 switch (type_class)
9263 {
9264 case clang::Type::Typedef:
9265 {
9266 clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
Greg Claytona1e5dc82015-08-11 22:53:00 +00009267 CompilerType typedef_clang_type (getASTContext(), typedef_qual_type);
Greg Claytond8d4a572015-08-11 21:38:15 +00009268 if (format == eFormatDefault)
9269 format = typedef_clang_type.GetFormat();
9270 clang::TypeInfo typedef_type_info = getASTContext()->getTypeInfo(typedef_qual_type);
9271 uint64_t typedef_byte_size = typedef_type_info.Width / 8;
9272
9273 return typedef_clang_type.DumpTypeValue (s,
9274 format, // The format with which to display the element
9275 data, // Data buffer containing all bytes for this type
9276 byte_offset, // Offset into "data" where to grab value from
9277 typedef_byte_size, // Size of this type in bytes
9278 bitfield_bit_size, // Size in bits of a bitfield value, if zero don't treat as a bitfield
9279 bitfield_bit_offset, // Offset in bits of a bitfield value if bitfield_bit_size != 0
9280 exe_scope);
9281 }
9282 break;
9283
9284 case clang::Type::Enum:
9285 // If our format is enum or default, show the enumeration value as
9286 // its enumeration string value, else just display it as requested.
9287 if ((format == eFormatEnum || format == eFormatDefault) && GetCompleteType(type))
9288 {
9289 const clang::EnumType *enutype = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
9290 const clang::EnumDecl *enum_decl = enutype->getDecl();
9291 assert(enum_decl);
9292 clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
9293 const bool is_signed = qual_type->isSignedIntegerOrEnumerationType();
9294 lldb::offset_t offset = byte_offset;
9295 if (is_signed)
9296 {
9297 const int64_t enum_svalue = data.GetMaxS64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9298 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9299 {
9300 if (enum_pos->getInitVal().getSExtValue() == enum_svalue)
9301 {
9302 s->PutCString (enum_pos->getNameAsString().c_str());
9303 return true;
9304 }
9305 }
9306 // If we have gotten here we didn't get find the enumerator in the
9307 // enum decl, so just print the integer.
9308 s->Printf("%" PRIi64, enum_svalue);
9309 }
9310 else
9311 {
9312 const uint64_t enum_uvalue = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
9313 for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
9314 {
9315 if (enum_pos->getInitVal().getZExtValue() == enum_uvalue)
9316 {
9317 s->PutCString (enum_pos->getNameAsString().c_str());
9318 return true;
9319 }
9320 }
9321 // If we have gotten here we didn't get find the enumerator in the
9322 // enum decl, so just print the integer.
9323 s->Printf("%" PRIu64, enum_uvalue);
9324 }
9325 return true;
9326 }
9327 // format was not enum, just fall through and dump the value as requested....
Jason Molenda62e06812016-02-16 04:14:33 +00009328 LLVM_FALLTHROUGH;
Greg Claytond8d4a572015-08-11 21:38:15 +00009329
9330 default:
9331 // We are down to a scalar type that we just need to display.
9332 {
9333 uint32_t item_count = 1;
9334 // A few formats, we might need to modify our size and count for depending
9335 // on how we are trying to display the value...
9336 switch (format)
9337 {
9338 default:
9339 case eFormatBoolean:
9340 case eFormatBinary:
9341 case eFormatComplex:
9342 case eFormatCString: // NULL terminated C strings
9343 case eFormatDecimal:
9344 case eFormatEnum:
9345 case eFormatHex:
9346 case eFormatHexUppercase:
9347 case eFormatFloat:
9348 case eFormatOctal:
9349 case eFormatOSType:
9350 case eFormatUnsigned:
9351 case eFormatPointer:
9352 case eFormatVectorOfChar:
9353 case eFormatVectorOfSInt8:
9354 case eFormatVectorOfUInt8:
9355 case eFormatVectorOfSInt16:
9356 case eFormatVectorOfUInt16:
9357 case eFormatVectorOfSInt32:
9358 case eFormatVectorOfUInt32:
9359 case eFormatVectorOfSInt64:
9360 case eFormatVectorOfUInt64:
9361 case eFormatVectorOfFloat32:
9362 case eFormatVectorOfFloat64:
9363 case eFormatVectorOfUInt128:
9364 break;
9365
9366 case eFormatChar:
9367 case eFormatCharPrintable:
9368 case eFormatCharArray:
9369 case eFormatBytes:
9370 case eFormatBytesWithASCII:
9371 item_count = byte_size;
9372 byte_size = 1;
9373 break;
9374
9375 case eFormatUnicode16:
9376 item_count = byte_size / 2;
9377 byte_size = 2;
9378 break;
9379
9380 case eFormatUnicode32:
9381 item_count = byte_size / 4;
9382 byte_size = 4;
9383 break;
9384 }
9385 return data.Dump (s,
9386 byte_offset,
9387 format,
9388 byte_size,
9389 item_count,
9390 UINT32_MAX,
9391 LLDB_INVALID_ADDRESS,
9392 bitfield_bit_size,
9393 bitfield_bit_offset,
9394 exe_scope);
9395 }
9396 break;
9397 }
9398 }
9399 return 0;
9400}
9401
9402
9403
9404void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009405ClangASTContext::DumpSummary (lldb::opaque_compiler_type_t type, ExecutionContext *exe_ctx,
Greg Claytond8d4a572015-08-11 21:38:15 +00009406 Stream *s,
9407 const lldb_private::DataExtractor &data,
9408 lldb::offset_t data_byte_offset,
9409 size_t data_byte_size)
9410{
9411 uint32_t length = 0;
9412 if (IsCStringType (type, length))
9413 {
9414 if (exe_ctx)
9415 {
9416 Process *process = exe_ctx->GetProcessPtr();
9417 if (process)
9418 {
9419 lldb::offset_t offset = data_byte_offset;
9420 lldb::addr_t pointer_address = data.GetMaxU64(&offset, data_byte_size);
9421 std::vector<uint8_t> buf;
9422 if (length > 0)
9423 buf.resize (length);
9424 else
9425 buf.resize (256);
9426
9427 lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
9428 buf.back() = '\0';
9429 size_t bytes_read;
9430 size_t total_cstr_len = 0;
9431 Error error;
9432 while ((bytes_read = process->ReadMemory (pointer_address, &buf.front(), buf.size(), error)) > 0)
9433 {
9434 const size_t len = strlen((const char *)&buf.front());
9435 if (len == 0)
9436 break;
9437 if (total_cstr_len == 0)
9438 s->PutCString (" \"");
9439 cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
9440 total_cstr_len += len;
9441 if (len < buf.size())
9442 break;
9443 pointer_address += total_cstr_len;
9444 }
9445 if (total_cstr_len > 0)
9446 s->PutChar ('"');
9447 }
9448 }
9449 }
9450}
9451
9452void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009453ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type)
Greg Claytond8d4a572015-08-11 21:38:15 +00009454{
9455 StreamFile s (stdout, false);
Enrico Granatac3ef0ed2015-10-14 22:44:50 +00009456 DumpTypeDescription (type, &s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009457 ClangASTMetadata *metadata = ClangASTContext::GetMetadata (getASTContext(), type);
9458 if (metadata)
9459 {
9460 metadata->Dump (&s);
9461 }
9462}
9463
9464void
Bruce Mitchener48ea9002015-09-23 00:18:24 +00009465ClangASTContext::DumpTypeDescription (lldb::opaque_compiler_type_t type, Stream *s)
Greg Claytond8d4a572015-08-11 21:38:15 +00009466{
9467 if (type)
9468 {
9469 clang::QualType qual_type(GetQualType(type));
9470
9471 llvm::SmallVector<char, 1024> buf;
9472 llvm::raw_svector_ostream llvm_ostrm (buf);
9473
9474 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9475 switch (type_class)
9476 {
9477 case clang::Type::ObjCObject:
9478 case clang::Type::ObjCInterface:
9479 {
9480 GetCompleteType(type);
9481
9482 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
9483 assert (objc_class_type);
9484 if (objc_class_type)
9485 {
9486 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9487 if (class_interface_decl)
9488 {
9489 clang::PrintingPolicy policy = getASTContext()->getPrintingPolicy();
9490 class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
9491 }
9492 }
9493 }
9494 break;
9495
9496 case clang::Type::Typedef:
9497 {
9498 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
9499 if (typedef_type)
9500 {
9501 const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
9502 std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
9503 if (!clang_typedef_name.empty())
9504 {
9505 s->PutCString ("typedef ");
9506 s->PutCString (clang_typedef_name.c_str());
9507 }
9508 }
9509 }
9510 break;
Enrico Granata36f51e42015-12-18 22:41:25 +00009511
9512 case clang::Type::Auto:
9513 CompilerType (getASTContext(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType()).DumpTypeDescription(s);
9514 return;
Greg Claytond8d4a572015-08-11 21:38:15 +00009515
9516 case clang::Type::Elaborated:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009517 CompilerType (getASTContext(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009518 return;
9519
9520 case clang::Type::Paren:
Greg Claytona1e5dc82015-08-11 22:53:00 +00009521 CompilerType (getASTContext(), llvm::cast<clang::ParenType>(qual_type)->desugar()).DumpTypeDescription(s);
Greg Claytond8d4a572015-08-11 21:38:15 +00009522 return;
9523
9524 case clang::Type::Record:
9525 {
9526 GetCompleteType(type);
9527
9528 const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
9529 const clang::RecordDecl *record_decl = record_type->getDecl();
9530 const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
9531
9532 if (cxx_record_decl)
9533 cxx_record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9534 else
9535 record_decl->print(llvm_ostrm, getASTContext()->getPrintingPolicy(), s->GetIndentLevel());
9536 }
9537 break;
9538
9539 default:
9540 {
9541 const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
9542 if (tag_type)
9543 {
9544 clang::TagDecl *tag_decl = tag_type->getDecl();
9545 if (tag_decl)
9546 tag_decl->print(llvm_ostrm, 0);
9547 }
9548 else
9549 {
9550 std::string clang_type_name(qual_type.getAsString());
9551 if (!clang_type_name.empty())
9552 s->PutCString (clang_type_name.c_str());
9553 }
9554 }
9555 }
9556
Greg Claytond8d4a572015-08-11 21:38:15 +00009557 if (buf.size() > 0)
9558 {
9559 s->Write (buf.data(), buf.size());
9560 }
9561 }
9562}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009563
Greg Claytone6b36cd2015-12-08 01:02:08 +00009564void
9565ClangASTContext::DumpTypeName (const CompilerType &type)
9566{
Zachary Turnerd133f6a2016-03-28 22:53:41 +00009567 if (ClangUtil::IsClangType(type))
Greg Claytone6b36cd2015-12-08 01:02:08 +00009568 {
Zachary Turnerd133f6a2016-03-28 22:53:41 +00009569 clang::QualType qual_type(ClangUtil::GetCanonicalQualType(ClangUtil::RemoveFastQualifiers(type)));
Greg Claytone6b36cd2015-12-08 01:02:08 +00009570
9571 const clang::Type::TypeClass type_class = qual_type->getTypeClass();
9572 switch (type_class)
9573 {
9574 case clang::Type::Record:
9575 {
9576 const clang::CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
9577 if (cxx_record_decl)
9578 printf("class %s", cxx_record_decl->getName().str().c_str());
9579 }
9580 break;
9581
9582 case clang::Type::Enum:
9583 {
9584 clang::EnumDecl *enum_decl = llvm::cast<clang::EnumType>(qual_type)->getDecl();
9585 if (enum_decl)
9586 {
9587 printf("enum %s", enum_decl->getName().str().c_str());
9588 }
9589 }
9590 break;
9591
9592 case clang::Type::ObjCObject:
9593 case clang::Type::ObjCInterface:
9594 {
9595 const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
9596 if (objc_class_type)
9597 {
9598 clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
9599 // We currently can't complete objective C types through the newly added ASTContext
9600 // because it only supports TagDecl objects right now...
9601 if (class_interface_decl)
9602 printf("@class %s", class_interface_decl->getName().str().c_str());
9603 }
9604 }
9605 break;
9606
9607
9608 case clang::Type::Typedef:
9609 printf("typedef %s", llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getName().str().c_str());
9610 break;
9611
Enrico Granata36f51e42015-12-18 22:41:25 +00009612 case clang::Type::Auto:
9613 printf("auto ");
9614 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::AutoType>(qual_type)->getDeducedType().getAsOpaquePtr()));
9615
Greg Claytone6b36cd2015-12-08 01:02:08 +00009616 case clang::Type::Elaborated:
9617 printf("elaborated ");
9618 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr()));
9619
9620 case clang::Type::Paren:
9621 printf("paren ");
9622 return DumpTypeName (CompilerType (type.GetTypeSystem(), llvm::cast<clang::ParenType>(qual_type)->desugar().getAsOpaquePtr()));
9623
9624 default:
9625 printf("ClangASTContext::DumpTypeName() type_class = %u", type_class);
9626 break;
9627 }
9628 }
9629
9630}
9631
9632
9633
Greg Clayton8b4edba2015-08-14 20:02:05 +00009634clang::ClassTemplateDecl *
Greg Clayton6071e6f2015-08-26 22:57:51 +00009635ClangASTContext::ParseClassTemplateDecl (clang::DeclContext *decl_ctx,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009636 lldb::AccessType access_type,
9637 const char *parent_name,
9638 int tag_decl_kind,
9639 const ClangASTContext::TemplateParameterInfos &template_param_infos)
9640{
9641 if (template_param_infos.IsValid())
9642 {
9643 std::string template_basename(parent_name);
9644 template_basename.erase (template_basename.find('<'));
9645
9646 return CreateClassTemplateDecl (decl_ctx,
9647 access_type,
9648 template_basename.c_str(),
9649 tag_decl_kind,
9650 template_param_infos);
9651 }
9652 return NULL;
9653}
9654
Greg Clayton6dc8d582015-08-18 22:32:36 +00009655void
9656ClangASTContext::CompleteTagDecl (void *baton, clang::TagDecl *decl)
9657{
9658 ClangASTContext *ast = (ClangASTContext *)baton;
9659 SymbolFile *sym_file = ast->GetSymbolFile();
9660 if (sym_file)
9661 {
9662 CompilerType clang_type = GetTypeForDecl (decl);
9663 if (clang_type)
9664 sym_file->CompleteType (clang_type);
9665 }
9666}
9667
9668void
9669ClangASTContext::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl)
9670{
9671 ClangASTContext *ast = (ClangASTContext *)baton;
9672 SymbolFile *sym_file = ast->GetSymbolFile();
9673 if (sym_file)
9674 {
9675 CompilerType clang_type = GetTypeForDecl (decl);
9676 if (clang_type)
9677 sym_file->CompleteType (clang_type);
9678 }
9679}
Greg Clayton8b4edba2015-08-14 20:02:05 +00009680
Greg Clayton261ac3f2015-08-28 01:01:03 +00009681DWARFASTParser *
Zachary Turnerd133f6a2016-03-28 22:53:41 +00009682ClangASTContext::GetDWARFParser()
Greg Clayton261ac3f2015-08-28 01:01:03 +00009683{
9684 if (!m_dwarf_ast_parser_ap)
9685 m_dwarf_ast_parser_ap.reset(new DWARFASTParserClang(*this));
9686 return m_dwarf_ast_parser_ap.get();
9687}
9688
Zachary Turner42dff792016-04-15 00:21:26 +00009689PDBASTParser *
9690ClangASTContext::GetPDBParser()
9691{
9692 if (!m_pdb_ast_parser_ap)
9693 m_pdb_ast_parser_ap.reset(new PDBASTParser(*this));
9694 return m_pdb_ast_parser_ap.get();
9695}
Greg Clayton261ac3f2015-08-28 01:01:03 +00009696
Greg Clayton8b4edba2015-08-14 20:02:05 +00009697bool
Greg Clayton6dc8d582015-08-18 22:32:36 +00009698ClangASTContext::LayoutRecordType(void *baton,
Greg Clayton8b4edba2015-08-14 20:02:05 +00009699 const clang::RecordDecl *record_decl,
9700 uint64_t &bit_size,
9701 uint64_t &alignment,
9702 llvm::DenseMap<const clang::FieldDecl *, uint64_t> &field_offsets,
9703 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets,
9704 llvm::DenseMap<const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets)
9705{
Greg Clayton6dc8d582015-08-18 22:32:36 +00009706 ClangASTContext *ast = (ClangASTContext *)baton;
Greg Clayton261ac3f2015-08-28 01:01:03 +00009707 DWARFASTParserClang *dwarf_ast_parser = (DWARFASTParserClang *)ast->GetDWARFParser();
Zachary Turnerd133f6a2016-03-28 22:53:41 +00009708 return dwarf_ast_parser->GetClangASTImporter().LayoutRecordType(record_decl, bit_size, alignment, field_offsets,
9709 base_offsets, vbase_offsets);
Greg Clayton8b4edba2015-08-14 20:02:05 +00009710}
9711
Greg Clayton99558cc42015-08-24 23:46:31 +00009712//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009713// CompilerDecl override functions
9714//----------------------------------------------------------------------
Paul Hermand628cbb2015-09-15 23:44:17 +00009715
9716ConstString
9717ClangASTContext::DeclGetName (void *opaque_decl)
9718{
9719 if (opaque_decl)
9720 {
9721 clang::NamedDecl *nd = llvm::dyn_cast<NamedDecl>((clang::Decl*)opaque_decl);
9722 if (nd != nullptr)
Greg Claytonfe689042015-11-10 17:47:04 +00009723 return ConstString(nd->getDeclName().getAsString());
Paul Hermand628cbb2015-09-15 23:44:17 +00009724 }
9725 return ConstString();
9726}
9727
Greg Claytonfe689042015-11-10 17:47:04 +00009728ConstString
9729ClangASTContext::DeclGetMangledName (void *opaque_decl)
9730{
9731 if (opaque_decl)
9732 {
9733 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>((clang::Decl*)opaque_decl);
9734 if (nd != nullptr && !llvm::isa<clang::ObjCMethodDecl>(nd))
9735 {
9736 clang::MangleContext *mc = getMangleContext();
9737 if (mc && mc->shouldMangleCXXName(nd))
9738 {
9739 llvm::SmallVector<char, 1024> buf;
9740 llvm::raw_svector_ostream llvm_ostrm (buf);
9741 if (llvm::isa<clang::CXXConstructorDecl>(nd))
9742 {
9743 mc->mangleCXXCtor(llvm::dyn_cast<clang::CXXConstructorDecl>(nd), Ctor_Complete, llvm_ostrm);
9744 }
9745 else if (llvm::isa<clang::CXXDestructorDecl>(nd))
9746 {
9747 mc->mangleCXXDtor(llvm::dyn_cast<clang::CXXDestructorDecl>(nd), Dtor_Complete, llvm_ostrm);
9748 }
9749 else
9750 {
9751 mc->mangleName(nd, llvm_ostrm);
9752 }
9753 if (buf.size() > 0)
9754 return ConstString(buf.data(), buf.size());
9755 }
9756 }
9757 }
9758 return ConstString();
9759}
9760
9761CompilerDeclContext
9762ClangASTContext::DeclGetDeclContext (void *opaque_decl)
9763{
9764 if (opaque_decl)
9765 return CompilerDeclContext(this, ((clang::Decl*)opaque_decl)->getDeclContext());
9766 else
9767 return CompilerDeclContext();
9768}
9769
9770CompilerType
9771ClangASTContext::DeclGetFunctionReturnType(void *opaque_decl)
9772{
9773 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9774 return CompilerType(this, func_decl->getReturnType().getAsOpaquePtr());
9775 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9776 return CompilerType(this, objc_method->getReturnType().getAsOpaquePtr());
9777 else
9778 return CompilerType();
9779}
9780
9781size_t
9782ClangASTContext::DeclGetFunctionNumArguments(void *opaque_decl)
9783{
9784 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9785 return func_decl->param_size();
9786 if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
Zachary Turner9d8a97e2016-04-01 23:20:35 +00009787 return objc_method->param_size();
Greg Claytonfe689042015-11-10 17:47:04 +00009788 else
9789 return 0;
9790}
9791
9792CompilerType
9793ClangASTContext::DeclGetFunctionArgumentType (void *opaque_decl, size_t idx)
9794{
9795 if (clang::FunctionDecl *func_decl = llvm::dyn_cast<clang::FunctionDecl>((clang::Decl*)opaque_decl))
9796 {
9797 if (idx < func_decl->param_size())
9798 {
9799 ParmVarDecl *var_decl = func_decl->getParamDecl(idx);
9800 if (var_decl)
Zachary Turner9d8a97e2016-04-01 23:20:35 +00009801 return CompilerType(this, var_decl->getOriginalType().getAsOpaquePtr());
Greg Claytonfe689042015-11-10 17:47:04 +00009802 }
9803 }
9804 else if (clang::ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>((clang::Decl*)opaque_decl))
9805 {
9806 if (idx < objc_method->param_size())
9807 return CompilerType(this, objc_method->parameters()[idx]->getOriginalType().getAsOpaquePtr());
9808 }
9809 return CompilerType();
9810}
9811
Paul Hermand628cbb2015-09-15 23:44:17 +00009812//----------------------------------------------------------------------
Greg Clayton99558cc42015-08-24 23:46:31 +00009813// CompilerDeclContext functions
9814//----------------------------------------------------------------------
9815
Greg Claytondfc09622015-12-08 18:39:50 +00009816std::vector<CompilerDecl>
Siva Chandra03ff5c82016-02-05 19:10:04 +00009817ClangASTContext::DeclContextFindDeclByName(void *opaque_decl_ctx,
9818 ConstString name,
9819 const bool ignore_using_decls)
Paul Hermand628cbb2015-09-15 23:44:17 +00009820{
Greg Claytondfc09622015-12-08 18:39:50 +00009821 std::vector<CompilerDecl> found_decls;
Paul Hermand628cbb2015-09-15 23:44:17 +00009822 if (opaque_decl_ctx)
9823 {
9824 DeclContext *root_decl_ctx = (DeclContext *)opaque_decl_ctx;
9825 std::set<DeclContext *> searched;
9826 std::multimap<DeclContext *, DeclContext *> search_queue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009827 SymbolFile *symbol_file = GetSymbolFile();
Paul Hermand628cbb2015-09-15 23:44:17 +00009828
9829 for (clang::DeclContext *decl_context = root_decl_ctx; decl_context != nullptr && found_decls.empty(); decl_context = decl_context->getParent())
9830 {
9831 search_queue.insert(std::make_pair(decl_context, decl_context));
9832
9833 for (auto it = search_queue.find(decl_context); it != search_queue.end(); it++)
9834 {
Eugene Leviantc1ba9fc2015-11-13 11:00:10 +00009835 if (!searched.insert(it->second).second)
9836 continue;
Paul Hermanea188fc2015-09-16 18:48:30 +00009837 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9838
Paul Hermand628cbb2015-09-15 23:44:17 +00009839 for (clang::Decl *child : it->second->decls())
9840 {
Paul Hermanea188fc2015-09-16 18:48:30 +00009841 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
Paul Hermand628cbb2015-09-15 23:44:17 +00009842 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009843 if (ignore_using_decls)
9844 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009845 clang::DeclContext *from = ud->getCommonAncestor();
9846 if (searched.find(ud->getNominatedNamespace()) == searched.end())
9847 search_queue.insert(std::make_pair(from, ud->getNominatedNamespace()));
9848 }
9849 else if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9850 {
Siva Chandra03ff5c82016-02-05 19:10:04 +00009851 if (ignore_using_decls)
9852 continue;
Paul Hermand628cbb2015-09-15 23:44:17 +00009853 for (clang::UsingShadowDecl *usd : ud->shadows())
9854 {
9855 clang::Decl *target = usd->getTargetDecl();
9856 if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target))
9857 {
9858 IdentifierInfo *ii = nd->getIdentifier();
9859 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009860 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermand628cbb2015-09-15 23:44:17 +00009861 }
9862 }
9863 }
Paul Hermanea188fc2015-09-16 18:48:30 +00009864 else if (clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(child))
9865 {
9866 IdentifierInfo *ii = nd->getIdentifier();
9867 if (ii != nullptr && ii->getName().equals(name.AsCString(nullptr)))
Greg Claytondfc09622015-12-08 18:39:50 +00009868 found_decls.push_back(CompilerDecl(this, nd));
Paul Hermanea188fc2015-09-16 18:48:30 +00009869 }
Paul Hermand628cbb2015-09-15 23:44:17 +00009870 }
9871 }
9872 }
9873 }
9874 return found_decls;
9875}
9876
Dawn Perchikb5925782015-12-12 19:31:41 +00009877// Look for child_decl_ctx's lookup scope in frame_decl_ctx and its parents,
9878// and return the number of levels it took to find it, or LLDB_INVALID_DECL_LEVEL
9879// if not found. If the decl was imported via a using declaration, its name and/or
9880// type, if set, will be used to check that the decl found in the scope is a match.
9881//
9882// The optional name is required by languages (like C++) to handle using declarations
9883// like:
9884//
9885// void poo();
9886// namespace ns {
9887// void foo();
9888// void goo();
9889// }
9890// void bar() {
9891// using ns::foo;
9892// // CountDeclLevels returns 0 for 'foo', 1 for 'poo', and
9893// // LLDB_INVALID_DECL_LEVEL for 'goo'.
9894// }
9895//
9896// The optional type is useful in the case that there's a specific overload
9897// that we're looking for that might otherwise be shadowed, like:
9898//
9899// void foo(int);
9900// namespace ns {
9901// void foo();
9902// }
9903// void bar() {
9904// using ns::foo;
9905// // CountDeclLevels returns 0 for { 'foo', void() },
9906// // 1 for { 'foo', void(int) }, and
9907// // LLDB_INVALID_DECL_LEVEL for { 'foo', void(int, int) }.
9908// }
9909//
9910// NOTE: Because file statics are at the TranslationUnit along with globals, a
9911// function at file scope will return the same level as a function at global scope.
9912// Ideally we'd like to treat the file scope as an additional scope just below the
9913// global scope. More work needs to be done to recognise that, if the decl we're
9914// trying to look up is static, we should compare its source file with that of the
9915// current scope and return a lower number for it.
9916uint32_t
9917ClangASTContext::CountDeclLevels (clang::DeclContext *frame_decl_ctx,
9918 clang::DeclContext *child_decl_ctx,
9919 ConstString *child_name,
9920 CompilerType *child_type)
9921{
9922 if (frame_decl_ctx)
9923 {
9924 std::set<DeclContext *> searched;
9925 std::multimap<DeclContext *, DeclContext *> search_queue;
9926 SymbolFile *symbol_file = GetSymbolFile();
9927
9928 // Get the lookup scope for the decl we're trying to find.
9929 clang::DeclContext *parent_decl_ctx = child_decl_ctx->getParent();
9930
9931 // Look for it in our scope's decl context and its parents.
9932 uint32_t level = 0;
9933 for (clang::DeclContext *decl_ctx = frame_decl_ctx; decl_ctx != nullptr; decl_ctx = decl_ctx->getParent())
9934 {
9935 if (!decl_ctx->isLookupContext())
9936 continue;
9937 if (decl_ctx == parent_decl_ctx)
9938 // Found it!
9939 return level;
9940 search_queue.insert(std::make_pair(decl_ctx, decl_ctx));
9941 for (auto it = search_queue.find(decl_ctx); it != search_queue.end(); it++)
9942 {
9943 if (searched.find(it->second) != searched.end())
9944 continue;
Sean Callanan8c05fb92016-02-12 21:55:05 +00009945
9946 // Currently DWARF has one shared translation unit for all Decls at top level, so this
9947 // would erroneously find using statements anywhere. So don't look at the top-level
9948 // translation unit.
9949 // TODO fix this and add a testcase that depends on it.
9950
9951 if (llvm::isa<clang::TranslationUnitDecl>(it->second))
9952 continue;
9953
Dawn Perchikb5925782015-12-12 19:31:41 +00009954 searched.insert(it->second);
9955 symbol_file->ParseDeclsForContext(CompilerDeclContext(this, it->second));
9956
9957 for (clang::Decl *child : it->second->decls())
9958 {
9959 if (clang::UsingDirectiveDecl *ud = llvm::dyn_cast<clang::UsingDirectiveDecl>(child))
9960 {
9961 clang::DeclContext *ns = ud->getNominatedNamespace();
9962 if (ns == parent_decl_ctx)
9963 // Found it!
9964 return level;
9965 clang::DeclContext *from = ud->getCommonAncestor();
9966 if (searched.find(ns) == searched.end())
9967 search_queue.insert(std::make_pair(from, ns));
9968 }
9969 else if (child_name)
9970 {
9971 if (clang::UsingDecl *ud = llvm::dyn_cast<clang::UsingDecl>(child))
9972 {
9973 for (clang::UsingShadowDecl *usd : ud->shadows())
9974 {
9975 clang::Decl *target = usd->getTargetDecl();
9976 clang::NamedDecl *nd = llvm::dyn_cast<clang::NamedDecl>(target);
9977 if (!nd)
9978 continue;
9979 // Check names.
9980 IdentifierInfo *ii = nd->getIdentifier();
9981 if (ii == nullptr || !ii->getName().equals(child_name->AsCString(nullptr)))
9982 continue;
9983 // Check types, if one was provided.
9984 if (child_type)
9985 {
9986 CompilerType clang_type = ClangASTContext::GetTypeForDecl(nd);
9987 if (!AreTypesSame(clang_type, *child_type, /*ignore_qualifiers=*/true))
9988 continue;
9989 }
9990 // Found it!
9991 return level;
9992 }
9993 }
9994 }
9995 }
9996 }
9997 ++level;
9998 }
9999 }
10000 return LLDB_INVALID_DECL_LEVEL;
10001}
10002
Greg Clayton99558cc42015-08-24 23:46:31 +000010003bool
10004ClangASTContext::DeclContextIsStructUnionOrClass (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +000010005{
Greg Clayton99558cc42015-08-24 23:46:31 +000010006 if (opaque_decl_ctx)
10007 return ((clang::DeclContext *)opaque_decl_ctx)->isRecord();
10008 else
10009 return false;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010010}
10011
Greg Clayton99558cc42015-08-24 23:46:31 +000010012ConstString
10013ClangASTContext::DeclContextGetName (void *opaque_decl_ctx)
Greg Clayton8b4edba2015-08-14 20:02:05 +000010014{
Greg Clayton99558cc42015-08-24 23:46:31 +000010015 if (opaque_decl_ctx)
10016 {
10017 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10018 if (named_decl)
10019 return ConstString(named_decl->getName());
10020 }
10021 return ConstString();
10022}
10023
Siva Chandra9293fc42016-01-07 23:32:34 +000010024ConstString
10025ClangASTContext::DeclContextGetScopeQualifiedName (void *opaque_decl_ctx)
10026{
10027 if (opaque_decl_ctx)
10028 {
10029 clang::NamedDecl *named_decl = llvm::dyn_cast<clang::NamedDecl>((clang::DeclContext *)opaque_decl_ctx);
10030 if (named_decl)
10031 return ConstString(llvm::StringRef(named_decl->getQualifiedNameAsString()));
10032 }
10033 return ConstString();
10034}
10035
Greg Clayton99558cc42015-08-24 23:46:31 +000010036bool
10037ClangASTContext::DeclContextIsClassMethod (void *opaque_decl_ctx,
10038 lldb::LanguageType *language_ptr,
10039 bool *is_instance_method_ptr,
10040 ConstString *language_object_name_ptr)
10041{
10042 if (opaque_decl_ctx)
10043 {
10044 clang::DeclContext *decl_ctx = (clang::DeclContext *)opaque_decl_ctx;
10045 if (ObjCMethodDecl *objc_method = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
10046 {
10047 if (is_instance_method_ptr)
10048 *is_instance_method_ptr = objc_method->isInstanceMethod();
10049 if (language_ptr)
10050 *language_ptr = eLanguageTypeObjC;
10051 if (language_object_name_ptr)
10052 language_object_name_ptr->SetCString("self");
10053 return true;
10054 }
10055 else if (CXXMethodDecl *cxx_method = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
10056 {
10057 if (is_instance_method_ptr)
10058 *is_instance_method_ptr = cxx_method->isInstance();
10059 if (language_ptr)
10060 *language_ptr = eLanguageTypeC_plus_plus;
10061 if (language_object_name_ptr)
10062 language_object_name_ptr->SetCString("this");
10063 return true;
10064 }
10065 else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
10066 {
10067 ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
10068 if (metadata && metadata->HasObjectPtr())
10069 {
10070 if (is_instance_method_ptr)
10071 *is_instance_method_ptr = true;
10072 if (language_ptr)
10073 *language_ptr = eLanguageTypeObjC;
10074 if (language_object_name_ptr)
10075 language_object_name_ptr->SetCString (metadata->GetObjectPtrName());
10076 return true;
10077 }
10078 }
10079 }
10080 return false;
10081}
10082
10083clang::DeclContext *
10084ClangASTContext::DeclContextGetAsDeclContext (const CompilerDeclContext &dc)
10085{
10086 if (dc.IsClang())
10087 return (clang::DeclContext *)dc.GetOpaqueDeclContext();
10088 return nullptr;
10089}
10090
10091
10092ObjCMethodDecl *
10093ClangASTContext::DeclContextGetAsObjCMethodDecl (const CompilerDeclContext &dc)
10094{
10095 if (dc.IsClang())
10096 return llvm::dyn_cast<clang::ObjCMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10097 return nullptr;
10098}
10099
10100CXXMethodDecl *
10101ClangASTContext::DeclContextGetAsCXXMethodDecl (const CompilerDeclContext &dc)
10102{
10103 if (dc.IsClang())
10104 return llvm::dyn_cast<clang::CXXMethodDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10105 return nullptr;
10106}
10107
10108clang::FunctionDecl *
10109ClangASTContext::DeclContextGetAsFunctionDecl (const CompilerDeclContext &dc)
10110{
10111 if (dc.IsClang())
10112 return llvm::dyn_cast<clang::FunctionDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10113 return nullptr;
10114}
10115
10116clang::NamespaceDecl *
10117ClangASTContext::DeclContextGetAsNamespaceDecl (const CompilerDeclContext &dc)
10118{
10119 if (dc.IsClang())
10120 return llvm::dyn_cast<clang::NamespaceDecl>((clang::DeclContext *)dc.GetOpaqueDeclContext());
10121 return nullptr;
10122}
10123
10124ClangASTMetadata *
10125ClangASTContext::DeclContextGetMetaData (const CompilerDeclContext &dc, const void *object)
10126{
10127 clang::ASTContext *ast = DeclContextGetClangASTContext (dc);
10128 if (ast)
10129 return ClangASTContext::GetMetadata (ast, object);
10130 return nullptr;
10131}
10132
10133clang::ASTContext *
10134ClangASTContext::DeclContextGetClangASTContext (const CompilerDeclContext &dc)
10135{
Greg Claytonf73034f2015-09-08 18:15:05 +000010136 ClangASTContext *ast = llvm::dyn_cast_or_null<ClangASTContext>(dc.GetTypeSystem());
10137 if (ast)
10138 return ast->getASTContext();
Greg Clayton99558cc42015-08-24 23:46:31 +000010139 return nullptr;
Greg Clayton8b4edba2015-08-14 20:02:05 +000010140}
10141
Jim Ingham151c0322015-09-15 21:13:50 +000010142ClangASTContextForExpressions::ClangASTContextForExpressions (Target &target) :
10143 ClangASTContext (target.GetArchitecture().GetTriple().getTriple().c_str()),
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010144 m_target_wp(target.shared_from_this()),
10145 m_persistent_variables (new ClangPersistentVariables)
Jim Ingham151c0322015-09-15 21:13:50 +000010146{
10147}
10148
10149UserExpression *
10150ClangASTContextForExpressions::GetUserExpression (const char *expr,
10151 const char *expr_prefix,
10152 lldb::LanguageType language,
Jim Ingham19a63fc2015-11-03 02:11:24 +000010153 Expression::ResultType desired_type,
10154 const EvaluateExpressionOptions &options)
Jim Ingham151c0322015-09-15 21:13:50 +000010155{
10156 TargetSP target_sp = m_target_wp.lock();
10157 if (!target_sp)
10158 return nullptr;
10159
Jim Ingham19a63fc2015-11-03 02:11:24 +000010160 return new ClangUserExpression(*target_sp.get(), expr, expr_prefix, language, desired_type, options);
Jim Ingham151c0322015-09-15 21:13:50 +000010161}
10162
10163FunctionCaller *
10164ClangASTContextForExpressions::GetFunctionCaller (const CompilerType &return_type,
10165 const Address& function_address,
10166 const ValueList &arg_value_list,
10167 const char *name)
10168{
10169 TargetSP target_sp = m_target_wp.lock();
10170 if (!target_sp)
10171 return nullptr;
10172
10173 Process *process = target_sp->GetProcessSP().get();
10174 if (!process)
10175 return nullptr;
10176
10177 return new ClangFunctionCaller (*process, return_type, function_address, arg_value_list, name);
10178}
10179
10180UtilityFunction *
10181ClangASTContextForExpressions::GetUtilityFunction (const char *text,
10182 const char *name)
10183{
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010184 TargetSP target_sp = m_target_wp.lock();
Jim Ingham151c0322015-09-15 21:13:50 +000010185 if (!target_sp)
10186 return nullptr;
10187
10188 return new ClangUtilityFunction(*target_sp.get(), text, name);
10189}
Sean Callanan8f1f9a12015-09-30 19:57:57 +000010190
10191PersistentExpressionState *
10192ClangASTContextForExpressions::GetPersistentExpressionState ()
10193{
10194 return m_persistent_variables.get();
10195}