blob: d2ebd4143e0bb649b67e6791adf2ea7080d6ccfb [file] [log] [blame]
Chris Lattner24943d22010-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
10#include "ClangASTContext.h"
11
12// C Includes
13// C++ Includes
14#include <string>
15
16// Other libraries and framework includes
17#include "clang/AST/ASTContext.h"
18#include "clang/AST/ASTImporter.h"
19#include "clang/AST/CXXInheritance.h"
20#include "clang/AST/RecordLayout.h"
21#include "clang/AST/Type.h"
22#include "clang/Basic/Builtins.h"
23#include "clang/Basic/FileManager.h"
24#include "clang/Basic/SourceManager.h"
25#include "clang/Basic/TargetInfo.h"
26#include "clang/Basic/TargetOptions.h"
27#include "clang/Frontend/FrontendOptions.h"
28#include "clang/Frontend/LangStandard.h"
29
30// Project includes
31#include "lldb/Core/dwarf.h"
32
33using namespace lldb_private;
34using namespace llvm;
35using namespace clang;
36
37
38static void
39ParseLangArgs
40(
41 LangOptions &Opts,
42 FrontendOptions::InputKind IK
43)
44{
45 // FIXME: Cleanup per-file based stuff.
46
47 // Set some properties which depend soley on the input kind; it would be nice
48 // to move these to the language standard, and have the driver resolve the
49 // input kind + language standard.
50 if (IK == FrontendOptions::IK_Asm) {
51 Opts.AsmPreprocessor = 1;
52 } else if (IK == FrontendOptions::IK_ObjC ||
53 IK == FrontendOptions::IK_ObjCXX ||
54 IK == FrontendOptions::IK_PreprocessedObjC ||
55 IK == FrontendOptions::IK_PreprocessedObjCXX) {
56 Opts.ObjC1 = Opts.ObjC2 = 1;
57 }
58
59 LangStandard::Kind LangStd = LangStandard::lang_unspecified;
60
61 if (LangStd == LangStandard::lang_unspecified) {
62 // Based on the base language, pick one.
63 switch (IK) {
64 case FrontendOptions::IK_None:
65 case FrontendOptions::IK_AST:
66 assert(0 && "Invalid input kind!");
67 case FrontendOptions::IK_OpenCL:
68 LangStd = LangStandard::lang_opencl;
69 break;
70 case FrontendOptions::IK_Asm:
71 case FrontendOptions::IK_C:
72 case FrontendOptions::IK_PreprocessedC:
73 case FrontendOptions::IK_ObjC:
74 case FrontendOptions::IK_PreprocessedObjC:
75 LangStd = LangStandard::lang_gnu99;
76 break;
77 case FrontendOptions::IK_CXX:
78 case FrontendOptions::IK_PreprocessedCXX:
79 case FrontendOptions::IK_ObjCXX:
80 case FrontendOptions::IK_PreprocessedObjCXX:
81 LangStd = LangStandard::lang_gnucxx98;
82 break;
83 }
84 }
85
86 const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
87 Opts.BCPLComment = Std.hasBCPLComments();
88 Opts.C99 = Std.isC99();
89 Opts.CPlusPlus = Std.isCPlusPlus();
90 Opts.CPlusPlus0x = Std.isCPlusPlus0x();
91 Opts.Digraphs = Std.hasDigraphs();
92 Opts.GNUMode = Std.isGNUMode();
93 Opts.GNUInline = !Std.isC99();
94 Opts.HexFloats = Std.hasHexFloats();
95 Opts.ImplicitInt = Std.hasImplicitInt();
96
97 // OpenCL has some additional defaults.
98 if (LangStd == LangStandard::lang_opencl) {
99 Opts.OpenCL = 1;
100 Opts.AltiVec = 1;
101 Opts.CXXOperatorNames = 1;
102 Opts.LaxVectorConversions = 1;
103 }
104
105 // OpenCL and C++ both have bool, true, false keywords.
106 Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
107
108// if (Opts.CPlusPlus)
109// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
110//
111// if (Args.hasArg(OPT_fobjc_gc_only))
112// Opts.setGCMode(LangOptions::GCOnly);
113// else if (Args.hasArg(OPT_fobjc_gc))
114// Opts.setGCMode(LangOptions::HybridGC);
115//
116// if (Args.hasArg(OPT_print_ivar_layout))
117// Opts.ObjCGCBitmapPrint = 1;
118//
119// if (Args.hasArg(OPT_faltivec))
120// Opts.AltiVec = 1;
121//
122// if (Args.hasArg(OPT_pthread))
123// Opts.POSIXThreads = 1;
124//
125// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
126// "default");
127// if (Vis == "default")
128 Opts.setVisibilityMode(LangOptions::Default);
129// else if (Vis == "hidden")
130// Opts.setVisibilityMode(LangOptions::Hidden);
131// else if (Vis == "protected")
132// Opts.setVisibilityMode(LangOptions::Protected);
133// else
134// Diags.Report(diag::err_drv_invalid_value)
135// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
136
137// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
138
139 // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
140 // is specified, or -std is set to a conforming mode.
141 Opts.Trigraphs = !Opts.GNUMode;
142// if (Args.hasArg(OPT_trigraphs))
143// Opts.Trigraphs = 1;
144//
145// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
146// OPT_fno_dollars_in_identifiers,
147// !Opts.AsmPreprocessor);
148// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
149// Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
150// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
151// if (Args.hasArg(OPT_fno_lax_vector_conversions))
152// Opts.LaxVectorConversions = 0;
153// Opts.Exceptions = Args.hasArg(OPT_fexceptions);
154// Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
155// Opts.Blocks = Args.hasArg(OPT_fblocks);
156// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
157// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
158// Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
159// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
160// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
161// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
162// Opts.AccessControl = Args.hasArg(OPT_faccess_control);
163// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
164// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
165// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
166// Diags);
167// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
168// Opts.ObjCConstantStringClass = getLastArgValue(Args,
169// OPT_fconstant_string_class);
170// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
171// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
172// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
173// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
174// Opts.Static = Args.hasArg(OPT_static_define);
175 Opts.OptimizeSize = 0;
176
177 // FIXME: Eliminate this dependency.
178// unsigned Opt =
179// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
180// Opts.Optimize = Opt != 0;
181 unsigned Opt = 0;
182
183 // This is the __NO_INLINE__ define, which just depends on things like the
184 // optimization level and -fno-inline, not actually whether the backend has
185 // inlining enabled.
186 //
187 // FIXME: This is affected by other options (-fno-inline).
188 Opts.NoInline = !Opt;
189
190// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
191// switch (SSP) {
192// default:
193// Diags.Report(diag::err_drv_invalid_value)
194// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
195// break;
196// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
197// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break;
198// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
199// }
200}
201
202//----------------------------------------------------------------------
203// ClangASTContext constructor
204//----------------------------------------------------------------------
205//ClangASTContext::ClangASTContext(Module *module) :
206// m_target_triple(),
207// m_ast_context_ap(),
208// m_language_options_ap(),
209// m_source_manager_ap(),
210// m_target_info_ap(),
211// m_identifier_table_ap(),
212// m_selector_table_ap(),
213// m_builtins_ap()
214//{
215// if (module)
216// {
217// ObjectFile * objfile = module->GetObjectFile();
218// if (objfile)
219// objfile->GetTargetTriple(m_target_triple);
220// }
221//}
222
223//ClangASTContext::ClangASTContext(const ConstString& target_triple) :
224// m_target_triple(target_triple),
225// m_ast_context_ap(),
226// m_language_options_ap(),
227// m_source_manager_ap(),
228// m_target_info_ap(),
229// m_identifier_table_ap(),
230// m_selector_table_ap(),
231// m_builtins_ap()
232//{
233//}
234ClangASTContext::ClangASTContext(const char *target_triple) :
235 m_target_triple(),
236 m_ast_context_ap(),
237 m_language_options_ap(),
238 m_source_manager_ap(),
239 m_diagnostic_ap(),
240 m_target_options_ap(),
241 m_target_info_ap(),
242 m_identifier_table_ap(),
243 m_selector_table_ap(),
244 m_builtins_ap()
245{
246 if (target_triple && target_triple[0])
247 m_target_triple.assign (target_triple);
248}
249
250//----------------------------------------------------------------------
251// Destructor
252//----------------------------------------------------------------------
253ClangASTContext::~ClangASTContext()
254{
255 m_builtins_ap.reset();
256 m_selector_table_ap.reset();
257 m_identifier_table_ap.reset();
258 m_target_info_ap.reset();
259 m_target_options_ap.reset();
260 m_diagnostic_ap.reset();
261 m_source_manager_ap.reset();
262 m_language_options_ap.reset();
263 m_ast_context_ap.reset();
264}
265
266
267void
268ClangASTContext::Clear()
269{
270 m_ast_context_ap.reset();
271 m_language_options_ap.reset();
272 m_source_manager_ap.reset();
273 m_diagnostic_ap.reset();
274 m_target_options_ap.reset();
275 m_target_info_ap.reset();
276 m_identifier_table_ap.reset();
277 m_selector_table_ap.reset();
278 m_builtins_ap.reset();
279}
280
281const char *
282ClangASTContext::GetTargetTriple ()
283{
284 return m_target_triple.c_str();
285}
286
287void
288ClangASTContext::SetTargetTriple (const char *target_triple)
289{
290 Clear();
291 m_target_triple.assign(target_triple);
292}
293
294
295ASTContext *
296ClangASTContext::getASTContext()
297{
298 if (m_ast_context_ap.get() == NULL)
299 {
300 m_ast_context_ap.reset(
301 new ASTContext(
302 *getLanguageOptions(),
303 *getSourceManager(),
304 *getTargetInfo(),
305 *getIdentifierTable(),
306 *getSelectorTable(),
307 *getBuiltinContext()));
308 }
309 return m_ast_context_ap.get();
310}
311
312Builtin::Context *
313ClangASTContext::getBuiltinContext()
314{
315 if (m_builtins_ap.get() == NULL)
316 m_builtins_ap.reset (new Builtin::Context(*getTargetInfo()));
317 return m_builtins_ap.get();
318}
319
320IdentifierTable *
321ClangASTContext::getIdentifierTable()
322{
323 if (m_identifier_table_ap.get() == NULL)
324 m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
325 return m_identifier_table_ap.get();
326}
327
328LangOptions *
329ClangASTContext::getLanguageOptions()
330{
331 if (m_language_options_ap.get() == NULL)
332 {
333 m_language_options_ap.reset(new LangOptions());
334 ParseLangArgs(*m_language_options_ap, FrontendOptions::IK_ObjCXX);
335// InitializeLangOptions(*m_language_options_ap, FrontendOptions::IK_ObjCXX);
336 }
337 return m_language_options_ap.get();
338}
339
340SelectorTable *
341ClangASTContext::getSelectorTable()
342{
343 if (m_selector_table_ap.get() == NULL)
344 m_selector_table_ap.reset (new SelectorTable());
345 return m_selector_table_ap.get();
346}
347
348SourceManager *
349ClangASTContext::getSourceManager()
350{
351 if (m_source_manager_ap.get() == NULL)
352 m_source_manager_ap.reset(new SourceManager(*getDiagnostic()));
353 return m_source_manager_ap.get();
354}
355
356Diagnostic *
357ClangASTContext::getDiagnostic()
358{
359 if (m_diagnostic_ap.get() == NULL)
360 m_diagnostic_ap.reset(new Diagnostic());
361 return m_diagnostic_ap.get();
362}
363
364TargetOptions *
365ClangASTContext::getTargetOptions()
366{
367 if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
368 {
369 m_target_options_ap.reset (new TargetOptions());
370 if (m_target_options_ap.get())
371 m_target_options_ap->Triple = m_target_triple;
372 }
373 return m_target_options_ap.get();
374}
375
376
377TargetInfo *
378ClangASTContext::getTargetInfo()
379{
380 // target_triple should be something like "x86_64-apple-darwin10"
381 if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
382 m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions()));
383 return m_target_info_ap.get();
384}
385
386#pragma mark Basic Types
387
388static inline bool
389QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
390{
391 uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
392 if (qual_type_bit_size == bit_size)
393 return true;
394 return false;
395}
396
397void *
398ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding, uint32_t bit_size)
399{
400 ASTContext *ast_context = getASTContext();
401
402 assert (ast_context != NULL);
403
404 return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
405}
406
407void *
408ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast_context, lldb::Encoding encoding, uint32_t bit_size)
409{
410 if (!ast_context)
411 return NULL;
412
413 switch (encoding)
414 {
415 case lldb::eEncodingInvalid:
416 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
417 return ast_context->VoidPtrTy.getAsOpaquePtr();
418 break;
419
420 case lldb::eEncodingUint:
421 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
422 return ast_context->UnsignedCharTy.getAsOpaquePtr();
423 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
424 return ast_context->UnsignedShortTy.getAsOpaquePtr();
425 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
426 return ast_context->UnsignedIntTy.getAsOpaquePtr();
427 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
428 return ast_context->UnsignedLongTy.getAsOpaquePtr();
429 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
430 return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
431 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
432 return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
433 break;
434
435 case lldb::eEncodingSint:
436 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
437 return ast_context->CharTy.getAsOpaquePtr();
438 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
439 return ast_context->ShortTy.getAsOpaquePtr();
440 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
441 return ast_context->IntTy.getAsOpaquePtr();
442 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
443 return ast_context->LongTy.getAsOpaquePtr();
444 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
445 return ast_context->LongLongTy.getAsOpaquePtr();
446 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
447 return ast_context->Int128Ty.getAsOpaquePtr();
448 break;
449
450 case lldb::eEncodingIEEE754:
451 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
452 return ast_context->FloatTy.getAsOpaquePtr();
453 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
454 return ast_context->DoubleTy.getAsOpaquePtr();
455 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
456 return ast_context->LongDoubleTy.getAsOpaquePtr();
457 break;
458
459 case lldb::eEncodingVector:
460 default:
461 break;
462 }
463
464 return NULL;
465}
466
467void *
468ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
469{
470 ASTContext *ast_context = getASTContext();
471
472 #define streq(a,b) strcmp(a,b) == 0
473 assert (ast_context != NULL);
474 if (ast_context)
475 {
476 switch (dw_ate)
477 {
478 default:
479 break;
480
481 case DW_ATE_address:
482 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
483 return ast_context->VoidPtrTy.getAsOpaquePtr();
484 break;
485
486 case DW_ATE_boolean:
487 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
488 return ast_context->BoolTy.getAsOpaquePtr();
489 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
490 return ast_context->UnsignedCharTy.getAsOpaquePtr();
491 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
492 return ast_context->UnsignedShortTy.getAsOpaquePtr();
493 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
494 return ast_context->UnsignedIntTy.getAsOpaquePtr();
495 break;
496
497 case DW_ATE_complex_float:
498 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
499 return ast_context->FloatComplexTy.getAsOpaquePtr();
500 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
501 return ast_context->DoubleComplexTy.getAsOpaquePtr();
502 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
503 return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
504 break;
505
506 case DW_ATE_float:
507 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
508 return ast_context->FloatTy.getAsOpaquePtr();
509 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
510 return ast_context->DoubleTy.getAsOpaquePtr();
511 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
512 return ast_context->LongDoubleTy.getAsOpaquePtr();
513 break;
514
515 case DW_ATE_signed:
516 if (type_name)
517 {
518 if (streq(type_name, "int") ||
519 streq(type_name, "signed int"))
520 {
521 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
522 return ast_context->IntTy.getAsOpaquePtr();
523 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
524 return ast_context->Int128Ty.getAsOpaquePtr();
525 }
526
527 if (streq(type_name, "long int") ||
528 streq(type_name, "long long int") ||
529 streq(type_name, "signed long long"))
530 {
531 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
532 return ast_context->LongTy.getAsOpaquePtr();
533 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
534 return ast_context->LongLongTy.getAsOpaquePtr();
535 }
536
537 if (streq(type_name, "short") ||
538 streq(type_name, "short int") ||
539 streq(type_name, "signed short") ||
540 streq(type_name, "short signed int"))
541 {
542 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
543 return ast_context->ShortTy.getAsOpaquePtr();
544 }
545
546 if (streq(type_name, "char") ||
547 streq(type_name, "signed char"))
548 {
549 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
550 return ast_context->CharTy.getAsOpaquePtr();
551 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
552 return ast_context->SignedCharTy.getAsOpaquePtr();
553 }
554
555 if (streq(type_name, "wchar_t"))
556 {
557 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
558 return ast_context->WCharTy.getAsOpaquePtr();
559 }
560
561 }
562 // We weren't able to match up a type name, just search by size
563 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
564 return ast_context->CharTy.getAsOpaquePtr();
565 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
566 return ast_context->ShortTy.getAsOpaquePtr();
567 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
568 return ast_context->IntTy.getAsOpaquePtr();
569 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
570 return ast_context->LongTy.getAsOpaquePtr();
571 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
572 return ast_context->LongLongTy.getAsOpaquePtr();
573 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
574 return ast_context->Int128Ty.getAsOpaquePtr();
575 break;
576
577 case DW_ATE_signed_char:
578 if (type_name)
579 {
580 if (streq(type_name, "signed char"))
581 {
582 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
583 return ast_context->SignedCharTy.getAsOpaquePtr();
584 }
585 }
586 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
587 return ast_context->CharTy.getAsOpaquePtr();
588 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
589 return ast_context->SignedCharTy.getAsOpaquePtr();
590 break;
591
592 case DW_ATE_unsigned:
593 if (type_name)
594 {
595 if (streq(type_name, "unsigned int"))
596 {
597 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
598 return ast_context->UnsignedIntTy.getAsOpaquePtr();
599 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
600 return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
601 }
602
603 if (streq(type_name, "unsigned int") ||
604 streq(type_name, "long unsigned int") ||
605 streq(type_name, "unsigned long long"))
606 {
607 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
608 return ast_context->UnsignedLongTy.getAsOpaquePtr();
609 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
610 return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
611 }
612
613 if (streq(type_name, "unsigned short") ||
614 streq(type_name, "short unsigned int"))
615 {
616 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
617 return ast_context->UnsignedShortTy.getAsOpaquePtr();
618 }
619 if (streq(type_name, "unsigned char"))
620 {
621 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
622 return ast_context->UnsignedCharTy.getAsOpaquePtr();
623 }
624
625 }
626 // We weren't able to match up a type name, just search by size
627 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
628 return ast_context->UnsignedCharTy.getAsOpaquePtr();
629 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
630 return ast_context->UnsignedShortTy.getAsOpaquePtr();
631 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
632 return ast_context->UnsignedIntTy.getAsOpaquePtr();
633 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
634 return ast_context->UnsignedLongTy.getAsOpaquePtr();
635 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
636 return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
637 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
638 return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
639 break;
640
641 case DW_ATE_unsigned_char:
642 if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
643 return ast_context->UnsignedCharTy.getAsOpaquePtr();
644 break;
645
646 case DW_ATE_imaginary_float:
647 break;
648 }
649 }
650 // This assert should fire for anything that we don't catch above so we know
651 // to fix any issues we run into.
652 assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!");
653 return NULL;
654}
655
656void *
657ClangASTContext::GetVoidBuiltInType()
658{
659 return getASTContext()->VoidTy.getAsOpaquePtr();
660}
661
662void *
663ClangASTContext::GetCStringType (bool is_const)
664{
665 QualType char_type(getASTContext()->CharTy);
666
667 if (is_const)
668 char_type.addConst();
669
670 return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
671}
672
673void *
674ClangASTContext::GetVoidPtrType (bool is_const)
675{
676 return GetVoidPtrType(getASTContext(), is_const);
677}
678
679void *
680ClangASTContext::GetVoidPtrType (clang::ASTContext *ast_context, bool is_const)
681{
682 QualType void_ptr_type(ast_context->VoidPtrTy);
683
684 if (is_const)
685 void_ptr_type.addConst();
686
687 return void_ptr_type.getAsOpaquePtr();
688}
689
690void *
691ClangASTContext::CopyType(clang::ASTContext *dest_context,
692 clang::ASTContext *source_context,
693 void * clang_type)
694{
695 Diagnostic diagnostics;
696 FileManager file_manager;
697 ASTImporter importer(diagnostics,
698 *dest_context, file_manager,
699 *source_context, file_manager);
700 QualType ret = importer.Import(QualType::getFromOpaquePtr(clang_type));
701 return ret.getAsOpaquePtr();
702}
703
704#pragma mark CVR modifiers
705
706void *
707ClangASTContext::AddConstModifier (void *clang_type)
708{
709 if (clang_type)
710 {
711 QualType result(QualType::getFromOpaquePtr(clang_type));
712 result.addConst();
713 return result.getAsOpaquePtr();
714 }
715 return NULL;
716}
717
718void *
719ClangASTContext::AddRestrictModifier (void *clang_type)
720{
721 if (clang_type)
722 {
723 QualType result(QualType::getFromOpaquePtr(clang_type));
724 result.getQualifiers().setRestrict (true);
725 return result.getAsOpaquePtr();
726 }
727 return NULL;
728}
729
730void *
731ClangASTContext::AddVolatileModifier (void *clang_type)
732{
733 if (clang_type)
734 {
735 QualType result(QualType::getFromOpaquePtr(clang_type));
736 result.getQualifiers().setVolatile (true);
737 return result.getAsOpaquePtr();
738 }
739 return NULL;
740}
741
742#pragma mark Structure, Unions, Classes
743
744void *
745ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx)
746{
747 ASTContext *ast_context = getASTContext();
748 assert (ast_context != NULL);
749
750 if (decl_ctx == NULL)
751 decl_ctx = ast_context->getTranslationUnitDecl();
752
753 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
754 // we will need to update this code. I was told to currently always use
755 // the CXXRecordDecl class since we often don't know from debug information
756 // if something is struct or a class, so we default to always use the more
757 // complete definition just in case.
758 CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
759 (TagDecl::TagKind)kind,
760 decl_ctx,
761 SourceLocation(),
762 name && name[0] ? &ast_context->Idents.get(name) : NULL);
763
764 return ast_context->getTagDeclType(decl).getAsOpaquePtr();
765}
766
767bool
768ClangASTContext::AddFieldToRecordType (void * record_clang_type, const char *name, void * field_type, int access, uint32_t bitfield_bit_size)
769{
770 if (record_clang_type == NULL || field_type == NULL)
771 return false;
772
773 ASTContext *ast_context = getASTContext();
774 IdentifierTable *identifier_table = getIdentifierTable();
775
776 assert (ast_context != NULL);
777 assert (identifier_table != NULL);
778
779 QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
780
781 Type *clang_type = record_qual_type.getTypePtr();
782 if (clang_type)
783 {
784 const RecordType *record_type = dyn_cast<RecordType>(clang_type);
785
786 if (record_type)
787 {
788 RecordDecl *record_decl = record_type->getDecl();
789
790 CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
791 if (cxx_record_decl)
792 cxx_record_decl->setEmpty (false);
793
794 clang::Expr *bit_width = NULL;
795 if (bitfield_bit_size != 0)
796 {
797 APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
798 bit_width = new (*ast_context)IntegerLiteral (bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
799 }
800 FieldDecl *field = FieldDecl::Create(*ast_context,
801 record_decl,
802 SourceLocation(),
803 name ? &identifier_table->get(name) : NULL, // Identifier
804 QualType::getFromOpaquePtr(field_type), // Field type
805 NULL, // DeclaratorInfo *
806 bit_width, // BitWidth
807 false); // Mutable
808
809 field->setAccess((AccessSpecifier)access);
810
811 if (field)
812 {
813 record_decl->addDecl(field);
814 return true;
815 }
816 }
817 }
818 return false;
819}
820
821bool
822ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
823{
824 return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
825}
826
827bool
828ClangASTContext::FieldIsBitfield
829(
830 ASTContext *ast_context,
831 FieldDecl* field,
832 uint32_t& bitfield_bit_size
833)
834{
835 if (ast_context == NULL || field == NULL)
836 return false;
837
838 if (field->isBitField())
839 {
840 Expr* bit_width_expr = field->getBitWidth();
841 if (bit_width_expr)
842 {
843 llvm::APSInt bit_width_apsint;
844 if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
845 {
846 bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
847 return true;
848 }
849 }
850 }
851 return false;
852}
853
854bool
855ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
856{
857 if (record_decl == NULL)
858 return false;
859
860 if (!record_decl->field_empty())
861 return true;
862
863 // No fields, lets check this is a CXX record and check the base classes
864 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
865 if (cxx_record_decl)
866 {
867 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
868 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
869 base_class != base_class_end;
870 ++base_class)
871 {
872 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
873 if (RecordHasFields(base_class_decl))
874 return true;
875 }
876 }
877 return false;
878}
879
880void
881ClangASTContext::SetDefaultAccessForRecordFields (void *clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
882{
883 if (clang_qual_type)
884 {
885 QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
886 Type *clang_type = qual_type.getTypePtr();
887 if (clang_type)
888 {
889 RecordType *record_type = dyn_cast<RecordType>(clang_type);
890 if (record_type)
891 {
892 RecordDecl *record_decl = record_type->getDecl();
893 if (record_decl)
894 {
895 uint32_t field_idx;
896 RecordDecl::field_iterator field, field_end;
897 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
898 field != field_end;
899 ++field, ++field_idx)
900 {
901 // If no accessibility was assigned, assign the correct one
902 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
903 field->setAccess ((AccessSpecifier)default_accessibility);
904 }
905 }
906 }
907 }
908 }
909}
910
911#pragma mark C++ Base Classes
912
913CXXBaseSpecifier *
914ClangASTContext::CreateBaseClassSpecifier (void *base_class_type, int access, bool is_virtual, bool base_of_class)
915{
916 if (base_class_type)
917 return new CXXBaseSpecifier(SourceRange(), is_virtual, base_of_class, (AccessSpecifier)access, QualType::getFromOpaquePtr(base_class_type));
918 return NULL;
919}
920
921bool
922ClangASTContext::SetBaseClassesForClassType (void *class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
923{
924 if (class_clang_type)
925 {
926 ASTContext *ast_context = getASTContext();
927 IdentifierTable *identifier_table = getIdentifierTable();
928
929 assert (ast_context != NULL);
930 assert (identifier_table != NULL);
931
932 Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
933 if (clang_type)
934 {
935 RecordType *record_type = dyn_cast<RecordType>(clang_type);
936 if (record_type)
937 {
938 CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
939 if (cxx_record_decl)
940 {
941 //cxx_record_decl->setEmpty (false);
942 cxx_record_decl->setBases(base_classes, num_base_classes);
943 return true;
944 }
945 }
946 }
947 }
948 return false;
949}
950
951
952#pragma mark Aggregate Types
953
954bool
955ClangASTContext::IsAggregateType (void *clang_type)
956{
957 if (clang_type == NULL)
958 return false;
959
960 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
961
962 if (qual_type->isAggregateType ())
963 return true;
964
965 switch (qual_type->getTypeClass())
966 {
967 case Type::IncompleteArray:
968 case Type::VariableArray:
969 case Type::ConstantArray:
970 case Type::ExtVector:
971 case Type::Vector:
972 case Type::Record:
973 return true;
974
975 case Type::Typedef:
976 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
977
978 default:
979 break;
980 }
981 // The clang type does have a value
982 return false;
983}
984
985uint32_t
986ClangASTContext::GetNumChildren (void *clang_qual_type, bool omit_empty_base_classes)
987{
988 if (clang_qual_type == NULL)
989 return 0;
990
991 uint32_t num_children = 0;
992 QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
993 switch (qual_type->getTypeClass())
994 {
995 case Type::Record:
996 {
997 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
998 const RecordDecl *record_decl = record_type->getDecl();
999 assert(record_decl);
1000 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1001 if (cxx_record_decl)
1002 {
1003 if (omit_empty_base_classes)
1004 {
1005 // Check each base classes to see if it or any of its
1006 // base classes contain any fields. This can help
1007 // limit the noise in variable views by not having to
1008 // show base classes that contain no members.
1009 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1010 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1011 base_class != base_class_end;
1012 ++base_class)
1013 {
1014 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1015
1016 // Skip empty base classes
1017 if (RecordHasFields(base_class_decl) == false)
1018 continue;
1019
1020 num_children++;
1021 }
1022 }
1023 else
1024 {
1025 // Include all base classes
1026 num_children += cxx_record_decl->getNumBases();
1027 }
1028
1029 }
1030 RecordDecl::field_iterator field, field_end;
1031 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
1032 ++num_children;
1033 }
1034 break;
1035
1036 case Type::ConstantArray:
1037 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
1038 break;
1039
1040 case Type::Pointer:
1041 {
1042 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
1043 QualType pointee_type = pointer_type->getPointeeType();
1044 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(), omit_empty_base_classes);
1045 // If this type points to a simple type, then it has 1 child
1046 if (num_pointee_children == 0)
1047 num_children = 1;
1048 else
1049 num_children = num_pointee_children;
1050 }
1051 break;
1052
1053 case Type::Typedef:
1054 num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), omit_empty_base_classes);
1055 break;
1056
1057 default:
1058 break;
1059 }
1060 return num_children;
1061}
1062
1063
1064void *
1065ClangASTContext::GetChildClangTypeAtIndex
1066(
1067 const char *parent_name,
1068 void *parent_clang_type,
1069 uint32_t idx,
1070 bool transparent_pointers,
1071 bool omit_empty_base_classes,
1072 std::string& child_name,
1073 uint32_t &child_byte_size,
1074 int32_t &child_byte_offset,
1075 uint32_t &child_bitfield_bit_size,
1076 uint32_t &child_bitfield_bit_offset
1077)
1078{
1079 if (parent_clang_type)
1080
1081 return GetChildClangTypeAtIndex (getASTContext(),
1082 parent_name,
1083 parent_clang_type,
1084 idx,
1085 transparent_pointers,
1086 omit_empty_base_classes,
1087 child_name,
1088 child_byte_size,
1089 child_byte_offset,
1090 child_bitfield_bit_size,
1091 child_bitfield_bit_offset);
1092 return NULL;
1093}
1094
1095void *
1096ClangASTContext::GetChildClangTypeAtIndex
1097(
1098 ASTContext *ast_context,
1099 const char *parent_name,
1100 void *parent_clang_type,
1101 uint32_t idx,
1102 bool transparent_pointers,
1103 bool omit_empty_base_classes,
1104 std::string& child_name,
1105 uint32_t &child_byte_size,
1106 int32_t &child_byte_offset,
1107 uint32_t &child_bitfield_bit_size,
1108 uint32_t &child_bitfield_bit_offset
1109)
1110{
1111 if (parent_clang_type == NULL)
1112 return NULL;
1113
1114 if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
1115 {
1116 uint32_t bit_offset;
1117 child_bitfield_bit_size = 0;
1118 child_bitfield_bit_offset = 0;
1119 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
1120 switch (parent_qual_type->getTypeClass())
1121 {
1122 case Type::Record:
1123 {
1124 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
1125 const RecordDecl *record_decl = record_type->getDecl();
1126 assert(record_decl);
1127 const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
1128 uint32_t child_idx = 0;
1129
1130 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1131 if (cxx_record_decl)
1132 {
1133 // We might have base classes to print out first
1134 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1135 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1136 base_class != base_class_end;
1137 ++base_class)
1138 {
1139 const CXXRecordDecl *base_class_decl = NULL;
1140
1141 // Skip empty base classes
1142 if (omit_empty_base_classes)
1143 {
1144 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1145 if (RecordHasFields(base_class_decl) == false)
1146 continue;
1147 }
1148
1149 if (idx == child_idx)
1150 {
1151 if (base_class_decl == NULL)
1152 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1153
1154
1155 if (base_class->isVirtual())
1156 bit_offset = record_layout.getVBaseClassOffset(base_class_decl);
1157 else
1158 bit_offset = record_layout.getBaseClassOffset(base_class_decl);
1159
1160 // Base classes should be a multiple of 8 bits in size
1161 assert (bit_offset % 8 == 0);
1162 child_byte_offset = bit_offset/8;
1163 std::string base_class_type_name(base_class->getType().getAsString());
1164
1165 child_name.assign(base_class_type_name.c_str());
1166
1167 uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
1168
1169 // Base classes biut sizes should be a multiple of 8 bits in size
1170 assert (clang_type_info_bit_size % 8 == 0);
1171 child_byte_size = clang_type_info_bit_size / 8;
1172 return base_class->getType().getAsOpaquePtr();
1173 }
1174 // We don't increment the child index in the for loop since we might
1175 // be skipping empty base classes
1176 ++child_idx;
1177 }
1178 }
1179 const unsigned num_fields = record_layout.getFieldCount();
1180
1181 // Make sure index is in range...
1182 uint32_t field_idx = 0;
1183 RecordDecl::field_iterator field, field_end;
1184 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
1185 {
1186 if (idx == child_idx)
1187 {
1188 // Print the member type if requested
1189 // Print the member name and equal sign
1190 child_name.assign(field->getNameAsString().c_str());
1191
1192 // Figure out the type byte size (field_type_info.first) and
1193 // alignment (field_type_info.second) from the AST context.
1194 std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
1195 assert(field_idx < num_fields);
1196
1197 child_byte_size = field_type_info.first / 8;
1198
1199 // Figure out the field offset within the current struct/union/class type
1200 bit_offset = record_layout.getFieldOffset (field_idx);
1201 child_byte_offset = bit_offset / 8;
1202 if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
1203 child_bitfield_bit_offset = bit_offset % 8;
1204
1205 return field->getType().getAsOpaquePtr();
1206 }
1207 }
1208 }
1209 break;
1210
1211 case Type::ConstantArray:
1212 {
1213 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
1214 const uint64_t element_count = array->getSize().getLimitedValue();
1215
1216 if (idx < element_count)
1217 {
1218 std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
1219
1220 char element_name[32];
1221 ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
1222
1223 child_name.assign(element_name);
1224 assert(field_type_info.first % 8 == 0);
1225 child_byte_size = field_type_info.first / 8;
1226 child_byte_offset = idx * child_byte_size;
1227 return array->getElementType().getAsOpaquePtr();
1228 }
1229 }
1230 break;
1231
1232 case Type::Pointer:
1233 {
1234 PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
1235 QualType pointee_type = pointer_type->getPointeeType();
1236
1237 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1238 {
1239 return GetChildClangTypeAtIndex (ast_context,
1240 parent_name,
1241 pointer_type->getPointeeType().getAsOpaquePtr(),
1242 idx,
1243 transparent_pointers,
1244 omit_empty_base_classes,
1245 child_name,
1246 child_byte_size,
1247 child_byte_offset,
1248 child_bitfield_bit_size,
1249 child_bitfield_bit_offset);
1250 }
1251 else
1252 {
1253 if (parent_name)
1254 {
1255 child_name.assign(1, '*');
1256 child_name += parent_name;
1257 }
1258
1259 // We have a pointer to an simple type
1260 if (idx == 0)
1261 {
1262 std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
1263 assert(clang_type_info.first % 8 == 0);
1264 child_byte_size = clang_type_info.first / 8;
1265 child_byte_offset = 0;
1266 return pointee_type.getAsOpaquePtr();
1267 }
1268 }
1269 }
1270 break;
1271
1272 case Type::Typedef:
1273 return GetChildClangTypeAtIndex (ast_context,
1274 parent_name,
1275 cast<TypedefType>(parent_qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
1276 idx,
1277 transparent_pointers,
1278 omit_empty_base_classes,
1279 child_name,
1280 child_byte_size,
1281 child_byte_offset,
1282 child_bitfield_bit_size,
1283 child_bitfield_bit_offset);
1284 break;
1285
1286 default:
1287 break;
1288 }
1289 }
1290 return false;
1291}
1292
1293static inline bool
1294BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
1295{
1296 return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
1297}
1298
1299static uint32_t
1300GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
1301{
1302 uint32_t num_bases = 0;
1303 if (cxx_record_decl)
1304 {
1305 if (omit_empty_base_classes)
1306 {
1307 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1308 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1309 base_class != base_class_end;
1310 ++base_class)
1311 {
1312 // Skip empty base classes
1313 if (omit_empty_base_classes)
1314 {
1315 if (BaseSpecifierIsEmpty (base_class))
1316 continue;
1317 }
1318 ++num_bases;
1319 }
1320 }
1321 else
1322 num_bases = cxx_record_decl->getNumBases();
1323 }
1324 return num_bases;
1325}
1326
1327
1328static uint32_t
1329GetIndexForRecordBase
1330(
1331 const RecordDecl *record_decl,
1332 const CXXBaseSpecifier *base_spec,
1333 bool omit_empty_base_classes
1334)
1335{
1336 uint32_t child_idx = 0;
1337
1338 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1339
1340// const char *super_name = record_decl->getNameAsCString();
1341// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
1342// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
1343//
1344 if (cxx_record_decl)
1345 {
1346 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1347 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1348 base_class != base_class_end;
1349 ++base_class)
1350 {
1351 if (omit_empty_base_classes)
1352 {
1353 if (BaseSpecifierIsEmpty (base_class))
1354 continue;
1355 }
1356
1357// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
1358// child_idx,
1359// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
1360//
1361//
1362 if (base_class == base_spec)
1363 return child_idx;
1364 ++child_idx;
1365 }
1366 }
1367
1368 return UINT32_MAX;
1369}
1370
1371
1372static uint32_t
1373GetIndexForRecordChild
1374(
1375 const RecordDecl *record_decl,
1376 NamedDecl *canonical_decl,
1377 bool omit_empty_base_classes
1378)
1379{
1380 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
1381
1382// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1383//
1384//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
1385// if (cxx_record_decl)
1386// {
1387// CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1388// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1389// base_class != base_class_end;
1390// ++base_class)
1391// {
1392// if (omit_empty_base_classes)
1393// {
1394// if (BaseSpecifierIsEmpty (base_class))
1395// continue;
1396// }
1397//
1398//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
1399//// record_decl->getNameAsCString(),
1400//// canonical_decl->getNameAsCString(),
1401//// child_idx,
1402//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
1403//
1404//
1405// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1406// if (curr_base_class_decl == canonical_decl)
1407// {
1408// return child_idx;
1409// }
1410// ++child_idx;
1411// }
1412// }
1413//
1414// const uint32_t num_bases = child_idx;
1415 RecordDecl::field_iterator field, field_end;
1416 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
1417 field != field_end;
1418 ++field, ++child_idx)
1419 {
1420// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
1421// record_decl->getNameAsCString(),
1422// canonical_decl->getNameAsCString(),
1423// child_idx - num_bases,
1424// field->getNameAsCString());
1425
1426 if (field->getCanonicalDecl() == canonical_decl)
1427 return child_idx;
1428 }
1429
1430 return UINT32_MAX;
1431}
1432
1433// Look for a child member (doesn't include base classes, but it does include
1434// their members) in the type hierarchy. Returns an index path into "clang_type"
1435// on how to reach the appropriate member.
1436//
1437// class A
1438// {
1439// public:
1440// int m_a;
1441// int m_b;
1442// };
1443//
1444// class B
1445// {
1446// };
1447//
1448// class C :
1449// public B,
1450// public A
1451// {
1452// };
1453//
1454// If we have a clang type that describes "class C", and we wanted to looked
1455// "m_b" in it:
1456//
1457// With omit_empty_base_classes == false we would get an integer array back with:
1458// { 1, 1 }
1459// The first index 1 is the child index for "class A" within class C
1460// The second index 1 is the child index for "m_b" within class A
1461//
1462// With omit_empty_base_classes == true we would get an integer array back with:
1463// { 0, 1 }
1464// 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)
1465// The second index 1 is the child index for "m_b" within class A
1466
1467size_t
1468ClangASTContext::GetIndexOfChildMemberWithName
1469(
1470 ASTContext *ast_context,
1471 void *clang_type,
1472 const char *name,
1473 bool omit_empty_base_classes,
1474 std::vector<uint32_t>& child_indexes
1475)
1476{
1477 if (clang_type && name && name[0])
1478 {
1479 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1480 switch (qual_type->getTypeClass())
1481 {
1482 case Type::Record:
1483 {
1484 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
1485 const RecordDecl *record_decl = record_type->getDecl();
1486
1487 assert(record_decl);
1488 uint32_t child_idx = 0;
1489
1490 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1491
1492 // Try and find a field that matches NAME
1493 RecordDecl::field_iterator field, field_end;
1494 StringRef name_sref(name);
1495 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
1496 field != field_end;
1497 ++field, ++child_idx)
1498 {
1499 if (field->getName().equals (name_sref))
1500 {
1501 // We have to add on the number of base classes to this index!
1502 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
1503 return child_indexes.size();
1504 }
1505 }
1506
1507 if (cxx_record_decl)
1508 {
1509 const RecordDecl *parent_record_decl = cxx_record_decl;
1510
1511 //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
1512
1513 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
1514 // Didn't find things easily, lets let clang do its thang...
1515 IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
1516 DeclarationName decl_name(&ident_ref);
1517
1518 CXXBasePaths paths;
1519 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
1520 decl_name.getAsOpaquePtr(),
1521 paths))
1522 {
1523 uint32_t child_idx;
1524 CXXBasePaths::const_paths_iterator path, path_end = paths.end();
1525 for (path = paths.begin(); path != path_end; ++path)
1526 {
1527 const size_t num_path_elements = path->size();
1528 for (size_t e=0; e<num_path_elements; ++e)
1529 {
1530 CXXBasePathElement elem = (*path)[e];
1531
1532 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
1533 if (child_idx == UINT32_MAX)
1534 {
1535 child_indexes.clear();
1536 return 0;
1537 }
1538 else
1539 {
1540 child_indexes.push_back (child_idx);
1541 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
1542 }
1543 }
1544 DeclContext::lookup_iterator named_decl_pos;
1545 for (named_decl_pos = path->Decls.first;
1546 named_decl_pos != path->Decls.second && parent_record_decl;
1547 ++named_decl_pos)
1548 {
1549 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString());
1550
1551 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
1552 if (child_idx == UINT32_MAX)
1553 {
1554 child_indexes.clear();
1555 return 0;
1556 }
1557 else
1558 {
1559 child_indexes.push_back (child_idx);
1560 }
1561 }
1562 }
1563 return child_indexes.size();
1564 }
1565 }
1566
1567 }
1568 break;
1569
1570 case Type::ConstantArray:
1571 {
1572// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
1573// const uint64_t element_count = array->getSize().getLimitedValue();
1574//
1575// if (idx < element_count)
1576// {
1577// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
1578//
1579// char element_name[32];
1580// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
1581//
1582// child_name.assign(element_name);
1583// assert(field_type_info.first % 8 == 0);
1584// child_byte_size = field_type_info.first / 8;
1585// child_byte_offset = idx * child_byte_size;
1586// return array->getElementType().getAsOpaquePtr();
1587// }
1588 }
1589 break;
1590
1591// case Type::MemberPointerType:
1592// {
1593// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
1594// QualType pointee_type = mem_ptr_type->getPointeeType();
1595//
1596// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1597// {
1598// return GetIndexOfChildWithName (ast_context,
1599// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
1600// name);
1601// }
1602// }
1603// break;
1604//
1605 case Type::LValueReference:
1606 case Type::RValueReference:
1607 {
1608 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
1609 QualType pointee_type = reference_type->getPointeeType();
1610
1611 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1612 {
1613 return GetIndexOfChildMemberWithName (ast_context,
1614 reference_type->getPointeeType().getAsOpaquePtr(),
1615 name,
1616 omit_empty_base_classes,
1617 child_indexes);
1618 }
1619 }
1620 break;
1621
1622 case Type::Pointer:
1623 {
1624 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
1625 QualType pointee_type = pointer_type->getPointeeType();
1626
1627 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1628 {
1629 return GetIndexOfChildMemberWithName (ast_context,
1630 pointer_type->getPointeeType().getAsOpaquePtr(),
1631 name,
1632 omit_empty_base_classes,
1633 child_indexes);
1634 }
1635 else
1636 {
1637// if (parent_name)
1638// {
1639// child_name.assign(1, '*');
1640// child_name += parent_name;
1641// }
1642//
1643// // We have a pointer to an simple type
1644// if (idx == 0)
1645// {
1646// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
1647// assert(clang_type_info.first % 8 == 0);
1648// child_byte_size = clang_type_info.first / 8;
1649// child_byte_offset = 0;
1650// return pointee_type.getAsOpaquePtr();
1651// }
1652 }
1653 }
1654 break;
1655
1656 case Type::Typedef:
1657 return GetIndexOfChildMemberWithName (ast_context,
1658 cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
1659 name,
1660 omit_empty_base_classes,
1661 child_indexes);
1662
1663 default:
1664 break;
1665 }
1666 }
1667 return 0;
1668}
1669
1670
1671// Get the index of the child of "clang_type" whose name matches. This function
1672// doesn't descend into the children, but only looks one level deep and name
1673// matches can include base class names.
1674
1675uint32_t
1676ClangASTContext::GetIndexOfChildWithName
1677(
1678 ASTContext *ast_context,
1679 void *clang_type,
1680 const char *name,
1681 bool omit_empty_base_classes
1682)
1683{
1684 if (clang_type && name && name[0])
1685 {
1686 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1687 switch (qual_type->getTypeClass())
1688 {
1689 case Type::Record:
1690 {
1691 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
1692 const RecordDecl *record_decl = record_type->getDecl();
1693
1694 assert(record_decl);
1695 uint32_t child_idx = 0;
1696
1697 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
1698
1699 if (cxx_record_decl)
1700 {
1701 CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
1702 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
1703 base_class != base_class_end;
1704 ++base_class)
1705 {
1706 // Skip empty base classes
1707 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
1708 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
1709 continue;
1710
1711 if (base_class->getType().getAsString().compare (name) == 0)
1712 return child_idx;
1713 ++child_idx;
1714 }
1715 }
1716
1717 // Try and find a field that matches NAME
1718 RecordDecl::field_iterator field, field_end;
1719 StringRef name_sref(name);
1720 for (field = record_decl->field_begin(), field_end = record_decl->field_end();
1721 field != field_end;
1722 ++field, ++child_idx)
1723 {
1724 if (field->getName().equals (name_sref))
1725 return child_idx;
1726 }
1727
1728 }
1729 break;
1730
1731 case Type::ConstantArray:
1732 {
1733// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
1734// const uint64_t element_count = array->getSize().getLimitedValue();
1735//
1736// if (idx < element_count)
1737// {
1738// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
1739//
1740// char element_name[32];
1741// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
1742//
1743// child_name.assign(element_name);
1744// assert(field_type_info.first % 8 == 0);
1745// child_byte_size = field_type_info.first / 8;
1746// child_byte_offset = idx * child_byte_size;
1747// return array->getElementType().getAsOpaquePtr();
1748// }
1749 }
1750 break;
1751
1752// case Type::MemberPointerType:
1753// {
1754// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
1755// QualType pointee_type = mem_ptr_type->getPointeeType();
1756//
1757// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1758// {
1759// return GetIndexOfChildWithName (ast_context,
1760// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
1761// name);
1762// }
1763// }
1764// break;
1765//
1766 case Type::LValueReference:
1767 case Type::RValueReference:
1768 {
1769 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
1770 QualType pointee_type = reference_type->getPointeeType();
1771
1772 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1773 {
1774 return GetIndexOfChildWithName (ast_context,
1775 reference_type->getPointeeType().getAsOpaquePtr(),
1776 name,
1777 omit_empty_base_classes);
1778 }
1779 }
1780 break;
1781
1782 case Type::Pointer:
1783 {
1784 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
1785 QualType pointee_type = pointer_type->getPointeeType();
1786
1787 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
1788 {
1789 return GetIndexOfChildWithName (ast_context,
1790 pointer_type->getPointeeType().getAsOpaquePtr(),
1791 name,
1792 omit_empty_base_classes);
1793 }
1794 else
1795 {
1796// if (parent_name)
1797// {
1798// child_name.assign(1, '*');
1799// child_name += parent_name;
1800// }
1801//
1802// // We have a pointer to an simple type
1803// if (idx == 0)
1804// {
1805// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
1806// assert(clang_type_info.first % 8 == 0);
1807// child_byte_size = clang_type_info.first / 8;
1808// child_byte_offset = 0;
1809// return pointee_type.getAsOpaquePtr();
1810// }
1811 }
1812 }
1813 break;
1814
1815 case Type::Typedef:
1816 return GetIndexOfChildWithName (ast_context,
1817 cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(),
1818 name,
1819 omit_empty_base_classes);
1820
1821 default:
1822 break;
1823 }
1824 }
1825 return UINT32_MAX;
1826}
1827
1828#pragma mark TagType
1829
1830bool
1831ClangASTContext::SetTagTypeKind (void *tag_clang_type, int kind)
1832{
1833 if (tag_clang_type)
1834 {
1835 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
1836 Type *clang_type = tag_qual_type.getTypePtr();
1837 if (clang_type)
1838 {
1839 TagType *tag_type = dyn_cast<TagType>(clang_type);
1840 if (tag_type)
1841 {
1842 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
1843 if (tag_decl)
1844 {
1845 tag_decl->setTagKind ((TagDecl::TagKind)kind);
1846 return true;
1847 }
1848 }
1849 }
1850 }
1851 return false;
1852}
1853
1854
1855#pragma mark DeclContext Functions
1856
1857DeclContext *
1858ClangASTContext::GetDeclContextForType (void *clang_type)
1859{
1860 if (clang_type == NULL)
1861 return NULL;
1862
1863 QualType qual_type(QualType::getFromOpaquePtr(clang_type));
1864 switch (qual_type->getTypeClass())
1865 {
1866 case Type::FunctionNoProto: break;
1867 case Type::FunctionProto: break;
1868 case Type::IncompleteArray: break;
1869 case Type::VariableArray: break;
1870 case Type::ConstantArray: break;
1871 case Type::ExtVector: break;
1872 case Type::Vector: break;
1873 case Type::Builtin: break;
1874 case Type::ObjCObjectPointer: break;
1875 case Type::BlockPointer: break;
1876 case Type::Pointer: break;
1877 case Type::LValueReference: break;
1878 case Type::RValueReference: break;
1879 case Type::MemberPointer: break;
1880 case Type::Complex: break;
1881 case Type::ObjCInterface: break;
1882 case Type::Record:
1883 return cast<RecordType>(qual_type)->getDecl();
1884 case Type::Enum:
1885 return cast<EnumType>(qual_type)->getDecl();
1886 case Type::Typedef:
1887 return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
1888
1889 case Type::TypeOfExpr: break;
1890 case Type::TypeOf: break;
1891 case Type::Decltype: break;
1892 //case Type::QualifiedName: break;
1893 case Type::TemplateSpecialization: break;
1894 }
1895 // No DeclContext in this type...
1896 return NULL;
1897}
1898
1899#pragma mark Namespace Declarations
1900
1901NamespaceDecl *
1902ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx)
1903{
1904 // TODO: Do something intelligent with the Declaration object passed in
1905 // like maybe filling in the SourceLocation with it...
1906 if (name)
1907 {
1908 ASTContext *ast_context = getASTContext();
1909 if (decl_ctx == NULL)
1910 decl_ctx = ast_context->getTranslationUnitDecl();
1911 return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
1912 }
1913 return NULL;
1914}
1915
1916
1917#pragma mark Function Types
1918
1919FunctionDecl *
1920ClangASTContext::CreateFunctionDeclaration (const char *name, void *function_clang_type, int storage, bool is_inline)
1921{
1922 if (name)
1923 {
1924 ASTContext *ast_context = getASTContext();
1925 assert (ast_context != NULL);
1926
1927 if (name && name[0])
1928 {
1929 return FunctionDecl::Create(*ast_context,
1930 ast_context->getTranslationUnitDecl(),
1931 SourceLocation(),
1932 DeclarationName (&ast_context->Idents.get(name)),
1933 QualType::getFromOpaquePtr(function_clang_type),
1934 NULL,
1935 (FunctionDecl::StorageClass)storage,
1936 (FunctionDecl::StorageClass)storage,
1937 is_inline);
1938 }
1939 else
1940 {
1941 return FunctionDecl::Create(*ast_context,
1942 ast_context->getTranslationUnitDecl(),
1943 SourceLocation(),
1944 DeclarationName (),
1945 QualType::getFromOpaquePtr(function_clang_type),
1946 NULL,
1947 (FunctionDecl::StorageClass)storage,
1948 (FunctionDecl::StorageClass)storage,
1949 is_inline);
1950 }
1951 }
1952 return NULL;
1953}
1954
1955void *
1956ClangASTContext::CreateFunctionType (void *result_type, void **args, unsigned num_args, bool isVariadic, unsigned TypeQuals)
1957{
1958 ASTContext *ast_context = getASTContext();
1959 assert (ast_context != NULL);
1960 std::vector<QualType> qual_type_args;
1961 for (unsigned i=0; i<num_args; ++i)
1962 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
1963
1964 // TODO: Detect calling convention in DWARF?
1965 return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
1966 qual_type_args.data(),
1967 qual_type_args.size(),
1968 isVariadic,
1969 TypeQuals,
1970 false, // hasExceptionSpec
1971 false, // hasAnyExceptionSpec,
1972 0, // NumExs
1973 0, // const QualType *ExArray
1974 FunctionType::ExtInfo ()).getAsOpaquePtr(); // NoReturn);
1975}
1976
1977ParmVarDecl *
1978ClangASTContext::CreateParmeterDeclaration (const char *name, void * return_type, int storage)
1979{
1980 ASTContext *ast_context = getASTContext();
1981 assert (ast_context != NULL);
1982 return ParmVarDecl::Create(*ast_context,
1983 ast_context->getTranslationUnitDecl(),
1984 SourceLocation(),
1985 name && name[0] ? &ast_context->Idents.get(name) : NULL,
1986 QualType::getFromOpaquePtr(return_type),
1987 NULL,
1988 (VarDecl::StorageClass)storage,
1989 (VarDecl::StorageClass)storage,
1990 0);
1991}
1992
1993void
1994ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
1995{
1996 if (function_decl)
1997 function_decl->setParams (params, num_params);
1998}
1999
2000
2001#pragma mark Array Types
2002
2003void *
2004ClangASTContext::CreateArrayType (void *element_type, size_t element_count, uint32_t bit_stride)
2005{
2006 if (element_type)
2007 {
2008 ASTContext *ast_context = getASTContext();
2009 assert (ast_context != NULL);
2010 llvm::APInt ap_element_count (64, element_count);
2011 return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
2012 ap_element_count,
2013 ArrayType::Normal,
2014 0).getAsOpaquePtr(); // ElemQuals
2015 }
2016 return NULL;
2017}
2018
2019
2020#pragma mark TagDecl
2021
2022bool
2023ClangASTContext::StartTagDeclarationDefinition (void *clang_type)
2024{
2025 if (clang_type)
2026 {
2027 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2028 Type *t = qual_type.getTypePtr();
2029 if (t)
2030 {
2031 TagType *tag_type = dyn_cast<TagType>(t);
2032 if (tag_type)
2033 {
2034 TagDecl *tag_decl = tag_type->getDecl();
2035 if (tag_decl)
2036 {
2037 tag_decl->startDefinition();
2038 return true;
2039 }
2040 }
2041 }
2042 }
2043 return false;
2044}
2045
2046bool
2047ClangASTContext::CompleteTagDeclarationDefinition (void *clang_type)
2048{
2049 if (clang_type)
2050 {
2051 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2052 Type *t = qual_type.getTypePtr();
2053 if (t)
2054 {
2055 TagType *tag_type = dyn_cast<TagType>(t);
2056 if (tag_type)
2057 {
2058 TagDecl *tag_decl = tag_type->getDecl();
2059 if (tag_decl)
2060 {
2061 tag_decl->completeDefinition();
2062 return true;
2063 }
2064 }
2065 }
2066 }
2067 return false;
2068}
2069
2070
2071#pragma mark Enumeration Types
2072
2073void *
2074ClangASTContext::CreateEnumerationType (const Declaration &decl, const char *name)
2075{
2076 // TODO: Do something intelligent with the Declaration object passed in
2077 // like maybe filling in the SourceLocation with it...
2078 ASTContext *ast_context = getASTContext();
2079 assert (ast_context != NULL);
2080 EnumDecl *enum_decl = EnumDecl::Create(*ast_context,
2081 ast_context->getTranslationUnitDecl(),
2082 SourceLocation(),
2083 name && name[0] ? &ast_context->Idents.get(name) : NULL,
2084 SourceLocation(),
2085 NULL);
2086 if (enum_decl)
2087 return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
2088 return NULL;
2089}
2090
2091bool
2092ClangASTContext::AddEnumerationValueToEnumerationType
2093(
2094 void *enum_clang_type,
2095 void *enumerator_clang_type,
2096 const Declaration &decl,
2097 const char *name,
2098 int64_t enum_value,
2099 uint32_t enum_value_bit_size
2100)
2101{
2102 if (enum_clang_type && enumerator_clang_type && name)
2103 {
2104 // TODO: Do something intelligent with the Declaration object passed in
2105 // like maybe filling in the SourceLocation with it...
2106 ASTContext *ast_context = getASTContext();
2107 IdentifierTable *identifier_table = getIdentifierTable();
2108
2109 assert (ast_context != NULL);
2110 assert (identifier_table != NULL);
2111 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
2112
2113 Type *clang_type = enum_qual_type.getTypePtr();
2114 if (clang_type)
2115 {
2116 const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
2117
2118 if (enum_type)
2119 {
2120 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
2121 enum_llvm_apsint = enum_value;
2122 EnumConstantDecl *enumerator_decl =
2123 EnumConstantDecl::Create(*ast_context,
2124 enum_type->getDecl(),
2125 SourceLocation(),
2126 name ? &identifier_table->get(name) : NULL, // Identifier
2127 QualType::getFromOpaquePtr(enumerator_clang_type),
2128 NULL,
2129 enum_llvm_apsint);
2130
2131 if (enumerator_decl)
2132 {
2133 enum_type->getDecl()->addDecl(enumerator_decl);
2134 return true;
2135 }
2136 }
2137 }
2138 }
2139 return false;
2140}
2141
2142#pragma mark Pointers & References
2143
2144void *
2145ClangASTContext::CreatePointerType (void *clang_type)
2146{
2147 if (clang_type)
2148 return getASTContext()->getPointerType(QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
2149 return NULL;
2150}
2151
2152void *
2153ClangASTContext::CreateLValueReferenceType (void *clang_type)
2154{
2155 if (clang_type)
2156 return getASTContext()->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
2157 return NULL;
2158}
2159
2160void *
2161ClangASTContext::CreateRValueReferenceType (void *clang_type)
2162{
2163 if (clang_type)
2164 return getASTContext()->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
2165 return NULL;
2166}
2167
Greg Claytonfa970692010-06-12 01:20:30 +00002168void *
2169ClangASTContext::CreateMemberPointerType (void * clang_pointee_type, void * clang_class_type)
2170{
2171 if (clang_pointee_type && clang_pointee_type)
2172 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
2173 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
2174 return NULL;
2175}
2176
Chris Lattner24943d22010-06-08 16:52:24 +00002177size_t
2178ClangASTContext::GetPointerBitSize ()
2179{
2180 ASTContext *ast_context = getASTContext();
2181 return ast_context->getTypeSize(ast_context->VoidPtrTy);
2182}
2183
2184bool
2185ClangASTContext::IsPointerOrReferenceType (void *clang_type, void **target_type)
2186{
2187 if (clang_type == NULL)
2188 return false;
2189
2190 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2191 switch (qual_type->getTypeClass())
2192 {
2193 case Type::ObjCObjectPointer:
2194 if (target_type)
2195 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2196 return true;
2197 case Type::BlockPointer:
2198 if (target_type)
2199 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2200 return true;
2201 case Type::Pointer:
2202 if (target_type)
2203 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2204 return true;
2205 case Type::MemberPointer:
2206 if (target_type)
2207 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2208 return true;
2209 case Type::LValueReference:
2210 if (target_type)
2211 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
2212 return true;
2213 case Type::RValueReference:
2214 if (target_type)
2215 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
2216 return true;
2217 case Type::Typedef:
2218 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr());
2219 default:
2220 break;
2221 }
2222 return false;
2223}
2224
2225size_t
2226ClangASTContext::GetTypeBitSize (clang::ASTContext *ast_context, void *clang_type)
2227{
2228 if (clang_type)
2229 return ast_context->getTypeSize(QualType::getFromOpaquePtr(clang_type));
2230 return 0;
2231}
2232
2233size_t
2234ClangASTContext::GetTypeBitAlign (clang::ASTContext *ast_context, void *clang_type)
2235{
2236 if (clang_type)
2237 return ast_context->getTypeAlign(QualType::getFromOpaquePtr(clang_type));
2238 return 0;
2239}
2240
2241bool
2242ClangASTContext::IsIntegerType (void * clang_type, bool &is_signed)
2243{
2244 if (!clang_type)
2245 return false;
2246
2247 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2248 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
2249
2250 if (builtin_type)
2251 {
2252 if (builtin_type->isInteger())
2253 is_signed = builtin_type->isSignedInteger();
2254
2255 return true;
2256 }
2257
2258 return false;
2259}
2260
2261bool
2262ClangASTContext::IsPointerType (void *clang_type, void **target_type)
2263{
2264 if (clang_type)
2265 {
2266 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2267 switch (qual_type->getTypeClass())
2268 {
2269 case Type::ObjCObjectPointer:
2270 if (target_type)
2271 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2272 return true;
2273 case Type::BlockPointer:
2274 if (target_type)
2275 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2276 return true;
2277 case Type::Pointer:
2278 if (target_type)
2279 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2280 return true;
2281 case Type::MemberPointer:
2282 if (target_type)
2283 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
2284 return true;
2285 case Type::Typedef:
2286 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), target_type);
2287 default:
2288 break;
2289 }
2290 }
2291 return false;
2292}
2293
2294bool
2295ClangASTContext::IsFloatingPointType (void *clang_type, uint32_t &count, bool &is_complex)
2296{
2297 if (clang_type)
2298 {
2299 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2300
2301 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
2302 {
2303 clang::BuiltinType::Kind kind = BT->getKind();
2304 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
2305 {
2306 count = 1;
2307 is_complex = false;
2308 return true;
2309 }
2310 }
2311 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
2312 {
2313 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
2314 {
2315 count = 2;
2316 is_complex = true;
2317 return true;
2318 }
2319 }
2320 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
2321 {
2322 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
2323 {
2324 count = VT->getNumElements();
2325 is_complex = false;
2326 return true;
2327 }
2328 }
2329 }
2330 return false;
2331}
2332
2333
2334bool
2335ClangASTContext::IsCStringType (void *clang_type, uint32_t &length)
2336{
2337 if (clang_type)
2338 {
2339 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2340 switch (qual_type->getTypeClass())
2341 {
2342 case Type::ConstantArray:
2343 {
2344 ConstantArrayType *array = cast<ConstantArrayType>(qual_type.getTypePtr());
2345 QualType element_qual_type = array->getElementType();
2346 Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
2347 if (canonical_type && canonical_type->isCharType())
2348 {
2349 // We know the size of the array and it could be a C string
2350 // since it is an array of characters
2351 length = array->getSize().getLimitedValue();
2352 return true;
2353 }
2354 }
2355 break;
2356
2357 case Type::Pointer:
2358 {
2359 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
2360 Type *pointee_type_ptr = pointer_type->getPointeeType().getTypePtr();
2361 if (pointee_type_ptr)
2362 {
2363 Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
2364 length = 0; // No length info, read until a NULL terminator is received
2365 if (canonical_type_ptr)
2366 return canonical_type_ptr->isCharType();
2367 else
2368 return pointee_type_ptr->isCharType();
2369 }
2370 }
2371 break;
2372
2373 case Type::Typedef:
2374 return ClangASTContext::IsCStringType (cast<TypedefType>(qual_type)->LookThroughTypedefs().getAsOpaquePtr(), length);
2375
2376 case Type::LValueReference:
2377 case Type::RValueReference:
2378 {
2379 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
2380 Type *pointee_type_ptr = reference_type->getPointeeType().getTypePtr();
2381 if (pointee_type_ptr)
2382 {
2383 Type *canonical_type_ptr = pointee_type_ptr->getCanonicalTypeInternal().getTypePtr();
2384 length = 0; // No length info, read until a NULL terminator is received
2385 if (canonical_type_ptr)
2386 return canonical_type_ptr->isCharType();
2387 else
2388 return pointee_type_ptr->isCharType();
2389 }
2390 }
2391 break;
2392 }
2393 }
2394 return false;
2395}
2396
2397bool
2398ClangASTContext::IsArrayType (void * clang_type, void **member_type, uint64_t *size)
2399{
2400 if (!clang_type)
2401 return false;
2402
2403 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2404
2405 switch (qual_type->getTypeClass())
2406 {
2407 case Type::ConstantArray:
2408 if (member_type)
2409 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
2410 if (size)
2411 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX);
2412 return true;
2413 case Type::IncompleteArray:
2414 if (member_type)
2415 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
2416 if (size)
2417 *size = 0;
2418 return true;
2419 case Type::VariableArray:
2420 if (member_type)
2421 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
2422 if (size)
2423 *size = 0;
2424 case Type::DependentSizedArray:
2425 if (member_type)
2426 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
2427 if (size)
2428 *size = 0;
2429 return true;
2430 }
2431 return false;
2432}
2433
2434
2435#pragma mark Typedefs
2436
2437void *
2438ClangASTContext::CreateTypedefType (const char *name, void *clang_type, DeclContext *decl_ctx)
2439{
2440 if (clang_type)
2441 {
2442 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2443 ASTContext *ast_context = getASTContext();
2444 IdentifierTable *identifier_table = getIdentifierTable();
2445 assert (ast_context != NULL);
2446 assert (identifier_table != NULL);
2447 if (decl_ctx == NULL)
2448 decl_ctx = ast_context->getTranslationUnitDecl();
2449 TypedefDecl *decl = TypedefDecl::Create(*ast_context,
2450 decl_ctx,
2451 SourceLocation(),
2452 name ? &identifier_table->get(name) : NULL, // Identifier
2453 ast_context->CreateTypeSourceInfo(qual_type));
2454
2455 // Get a uniqued QualType for the typedef decl type
2456 return ast_context->getTypedefType (decl).getAsOpaquePtr();
2457 }
2458 return NULL;
2459}
2460
2461
2462std::string
2463ClangASTContext::GetTypeName (void *opaque_qual_type)
2464{
2465 std::string return_name;
2466
2467 clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_qual_type));
2468
2469 const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
2470 if (typedef_type)
2471 {
2472 const clang::TypedefDecl *typedef_decl = typedef_type->getDecl();
2473 return_name = typedef_decl->getQualifiedNameAsString();
2474 }
2475 else
2476 {
2477 return_name = qual_type.getAsString();
2478 }
2479
2480 return return_name;
2481}
2482
2483// Disable this for now since I can't seem to get a nicely formatted float
2484// out of the APFloat class without just getting the float, double or quad
2485// and then using a formatted print on it which defeats the purpose. We ideally
2486// would like to get perfect string values for any kind of float semantics
2487// so we can support remote targets. The code below also requires a patch to
2488// llvm::APInt.
2489//bool
2490//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, void *clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
2491//{
2492// uint32_t count = 0;
2493// bool is_complex = false;
2494// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2495// {
2496// unsigned num_bytes_per_float = byte_size / count;
2497// unsigned num_bits_per_float = num_bytes_per_float * 8;
2498//
2499// float_str.clear();
2500// uint32_t i;
2501// for (i=0; i<count; i++)
2502// {
2503// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
2504// bool is_ieee = false;
2505// APFloat ap_float(ap_int, is_ieee);
2506// char s[1024];
2507// unsigned int hex_digits = 0;
2508// bool upper_case = false;
2509//
2510// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
2511// {
2512// if (i > 0)
2513// float_str.append(", ");
2514// float_str.append(s);
2515// if (i == 1 && is_complex)
2516// float_str.append(1, 'i');
2517// }
2518// }
2519// return !float_str.empty();
2520// }
2521// return false;
2522//}
2523
2524size_t
2525ClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, void *clang_type, const char *s, uint8_t *dst, size_t dst_size)
2526{
2527 if (clang_type)
2528 {
2529 QualType qual_type (QualType::getFromOpaquePtr(clang_type));
2530 uint32_t count = 0;
2531 bool is_complex = false;
2532 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
2533 {
2534 // TODO: handle complex and vector types
2535 if (count != 1)
2536 return false;
2537
2538 StringRef s_sref(s);
2539 APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
2540
2541 const uint64_t bit_size = ast_context->getTypeSize (qual_type);
2542 const uint64_t byte_size = bit_size / 8;
2543 if (dst_size >= byte_size)
2544 {
2545 if (bit_size == sizeof(float)*8)
2546 {
2547 float float32 = ap_float.convertToFloat();
2548 ::memcpy (dst, &float32, byte_size);
2549 return byte_size;
2550 }
2551 else if (bit_size >= 64)
2552 {
2553 llvm::APInt ap_int(ap_float.bitcastToAPInt());
2554 ::memcpy (dst, ap_int.getRawData(), byte_size);
2555 return byte_size;
2556 }
2557 }
2558 }
2559 }
2560 return 0;
2561}