ClangASTContext.cpp revision a4881d04b4f367c67e34e8040e1257fc222a8b41
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===// 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The LLVM Compiler Infrastructure 453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)// 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details. 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===// 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Symbol/ClangASTContext.h" 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// C Includes 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// C++ Includes 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <string> 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Other libraries and framework includes 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Clang headers like to use NDEBUG inside of them to enable/disable debug 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// or another. This is bad because it means that if clang was built in release 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// mode, it assumes that you are building in release mode which is not always 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// the case. You can end up with functions that are defined as empty in header 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// files when NDEBUG is not defined, and this can cause link errors with the 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// clang .a files that you have since you might be missing functions in the .a 2502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// file. So we have to define NDEBUG when including clang headers to avoid any 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// mismatches. This is covered by rdar://problem/8691220 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#define LLDB_DEFINED_NDEBUG_FOR_CLANG 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define NDEBUG 3176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)// Need to include assert.h so it is as clang would expect it to be (disabled) 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include <assert.h> 331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#endif 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) 351e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "clang/AST/ASTContext.h" 361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "clang/AST/ASTImporter.h" 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "clang/AST/CXXInheritance.h" 387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "clang/AST/DeclObjC.h" 397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "clang/AST/RecordLayout.h" 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "clang/AST/Type.h" 41926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "clang/Basic/Builtins.h" 42926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "clang/Basic/FileManager.h" 43926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "clang/Basic/FileSystemOptions.h" 44926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#include "clang/Basic/SourceManager.h" 45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "clang/Basic/TargetInfo.h" 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "clang/Basic/TargetOptions.h" 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "clang/Frontend/FrontendOptions.h" 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "clang/Frontend/LangStandard.h" 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef NDEBUG 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef LLDB_DEFINED_NDEBUG_FOR_CLANG 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Need to re-include assert.h so it is as _we_ would expect it to be (enabled) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <assert.h> 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "lldb/Core/dwarf.h" 5802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "lldb/Core/Flags.h" 5902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "lldb/Core/Log.h" 6002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include <stdio.h> 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace lldb; 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace lldb_private; 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace llvm; 6602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochusing namespace clang; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (type_class) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::Record: 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::Enum: 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr()); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (tag_type) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::TagDecl *tag_decl = tag_type->getDecl(); 8202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (tag_decl) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 8402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (tag_decl->getDefinition()) 8502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return true; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (tag_decl->hasExternalLexicalStorage()) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ExternalASTSource *external_ast_source = ast->getExternalSource(); 9002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (external_ast_source) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) external_ast_source->CompleteType(tag_decl); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !tag_type->isIncompleteType(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 10202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::ObjCObject: 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::ObjCInterface: 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (objc_class_type) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We currently can't complete objective C types through the newly added ASTContext 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // because it only supports TagDecl objects right now... 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_forward_decl = class_interface_decl->isForwardDecl(); 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage()) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch ExternalASTSource *external_ast_source = ast->getExternalSource(); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (external_ast_source) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) external_ast_source->CompleteType (class_interface_decl); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_forward_decl = class_interface_decl->isForwardDecl(); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return is_forward_decl == false; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 12402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::Typedef: 12902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType()); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochstatic AccessSpecifier 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ConvertAccessTypeToAccessSpecifier (AccessType access) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (access) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: break; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessNone: return AS_none; 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessPublic: return AS_public; 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessPrivate: return AS_private; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessProtected: return AS_protected; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return AS_none; 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static ObjCIvarDecl::AccessControl 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ConvertAccessTypeToObjCIvarAccessControl (AccessType access) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (access) 15702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: break; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessNone: return ObjCIvarDecl::None; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessPublic: return ObjCIvarDecl::Public; 16102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch case eAccessPrivate: return ObjCIvarDecl::Private; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessProtected: return ObjCIvarDecl::Protected; 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eAccessPackage: return ObjCIvarDecl::Package; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ObjCIvarDecl::None; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void 17002772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochParseLangArgs 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)( 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LangOptions &Opts, 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) InputKind IK 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)) 17502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Cleanup per-file based stuff. 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Set some properties which depend soley on the input kind; it would be nice 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to move these to the language standard, and have the driver resolve the 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // input kind + language standard. 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (IK == IK_Asm) { 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.AsmPreprocessor = 1; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else if (IK == IK_ObjC || 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IK == IK_ObjCXX || 18502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch IK == IK_PreprocessedObjC || 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IK == IK_PreprocessedObjCXX) { 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.ObjC1 = Opts.ObjC2 = 1; 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LangStandard::Kind LangStd = LangStandard::lang_unspecified; 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (LangStd == LangStandard::lang_unspecified) { 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Based on the base language, pick one. 19402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch switch (IK) { 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_None: 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_AST: 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert (!"Invalid input kind!"); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_OpenCL: 19902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch LangStd = LangStandard::lang_opencl; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_Asm: 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_C: 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_PreprocessedC: 20402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch case IK_ObjC: 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_PreprocessedObjC: 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LangStd = LangStandard::lang_gnu99; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_CXX: 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_PreprocessedCXX: 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_ObjCXX: 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case IK_PreprocessedObjCXX: 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LangStd = LangStandard::lang_gnucxx98; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd); 21802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch Opts.BCPLComment = Std.hasBCPLComments(); 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.C99 = Std.isC99(); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.CPlusPlus = Std.isCPlusPlus(); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.CPlusPlus0x = Std.isCPlusPlus0x(); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.Digraphs = Std.hasDigraphs(); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.GNUMode = Std.isGNUMode(); 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.GNUInline = !Std.isC99(); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.HexFloats = Std.hasHexFloats(); 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.ImplicitInt = Std.hasImplicitInt(); 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // OpenCL has some additional defaults. 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (LangStd == LangStandard::lang_opencl) { 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.OpenCL = 1; 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.AltiVec = 1; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.CXXOperatorNames = 1; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.LaxVectorConversions = 1; 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // OpenCL and C++ both have bool, true, false keywords. 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Opts.CPlusPlus) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_fobjc_gc_only)) 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.setGCMode(LangOptions::GCOnly); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// else if (Args.hasArg(OPT_fobjc_gc)) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.setGCMode(LangOptions::HybridGC); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_print_ivar_layout)) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.ObjCGCBitmapPrint = 1; 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_faltivec)) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.AltiVec = 1; 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_pthread)) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.POSIXThreads = 1; 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility, 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// "default"); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Vis == "default") 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.setVisibilityMode(DefaultVisibility); 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// else if (Vis == "hidden") 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.setVisibilityMode(LangOptions::Hidden); 2627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// else if (Vis == "protected") 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.setVisibilityMode(LangOptions::Protected); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// else 26502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Diags.Report(diag::err_drv_invalid_value) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis; 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.OverflowChecking = Args.hasArg(OPT_ftrapv); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // is specified, or -std is set to a conforming mode. 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.Trigraphs = !Opts.GNUMode; 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_trigraphs)) 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Trigraphs = 1; 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// 27602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers, 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OPT_fno_dollars_in_identifiers, 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// !Opts.AsmPreprocessor); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Microsoft = Args.hasArg(OPT_fms_extensions); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// if (Args.hasArg(OPT_fno_lax_vector_conversions)) 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.LaxVectorConversions = 0; 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Exceptions = Args.hasArg(OPT_fexceptions); 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.RTTI = !Args.hasArg(OPT_fno_rtti); 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Blocks = Args.hasArg(OPT_fblocks); 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); 2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); 2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Freestanding = Args.hasArg(OPT_ffreestanding); 2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; 2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new); 2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions); 2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.AccessControl = Args.hasArg(OPT_faccess_control); 2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors); 2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno); 2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99, 2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Diags); 2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime); 2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.ObjCConstantStringClass = getLastArgValue(Args, 3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OPT_fconstant_string_class); 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi); 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior); 3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls); 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags); 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Static = Args.hasArg(OPT_static_define); 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.OptimizeSize = 0; 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: Eliminate this dependency. 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// unsigned Opt = 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Opts.Optimize = Opt != 0; 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned Opt = 0; 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is the __NO_INLINE__ define, which just depends on things like the 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // optimization level and -fno-inline, not actually whether the backend has 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // inlining enabled. 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: This is affected by other options (-fno-inline). 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Opts.NoInline = !Opt; 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags); 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// switch (SSP) { 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// default: 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Diags.Report(diag::err_drv_invalid_value) 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// break; 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// } 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::ClangASTContext (const char *target_triple) : 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_triple(), 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ast_ap(), 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_language_options_ap(), 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_source_manager_ap(), 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_diagnostic_ap(), 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_options_ap(), 34102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_target_info_ap(), 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_identifier_table_ap(), 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selector_table_ap(), 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_builtins_ap(), 3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_callback_tag_decl (NULL), 34602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch m_callback_objc_decl (NULL), 3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_callback_baton (NULL) 3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (target_triple && target_triple[0]) 3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_triple.assign (target_triple); 3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//---------------------------------------------------------------------- 35502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// Destructor 3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//---------------------------------------------------------------------- 3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::~ClangASTContext() 3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_builtins_ap.reset(); 3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selector_table_ap.reset(); 3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_identifier_table_ap.reset(); 3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_info_ap.reset(); 3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_options_ap.reset(); 3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_diagnostic_ap.reset(); 3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_source_manager_ap.reset(); 3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_language_options_ap.reset(); 3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ast_ap.reset(); 3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::Clear() 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ast_ap.reset(); 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_language_options_ap.reset(); 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_source_manager_ap.reset(); 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_diagnostic_ap.reset(); 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_options_ap.reset(); 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_info_ap.reset(); 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_identifier_table_ap.reset(); 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selector_table_ap.reset(); 3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_builtins_ap.reset(); 3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char * 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetTargetTriple () 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_target_triple.c_str(); 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::SetTargetTriple (const char *target_triple) 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Clear(); 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_triple.assign(target_triple); 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 39802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochbool 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::HasExternalSource () 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast = getASTContext(); 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ast) 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->getExternalSource () != NULL; 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap) 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast = getASTContext(); 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ast) 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ast->setExternalSource (ast_source_ap); 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true); 41502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true); 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 41702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::RemoveExternalSource () 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast = getASTContext(); 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ast) 4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap; 4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ast->setExternalSource (empty_ast_source_ap); 4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false); 4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false); 4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 43202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ASTContext * 4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getASTContext() 4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_ast_ap.get() == NULL) 4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ast_ap.reset(new ASTContext (*getLanguageOptions(), 4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *getSourceManager(), 4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *getTargetInfo(), 44302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch *getIdentifierTable(), 4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci *getSelectorTable(), 4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *getBuiltinContext(), 44602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 0)); 44702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton) 44902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 4507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage(); 45102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage(); 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 45302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false); 45502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch } 4567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_ast_ap.get(); 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 45802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Builtin::Context * 4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getBuiltinContext() 4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_builtins_ap.get() == NULL) 4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_builtins_ap.reset (new Builtin::Context(*getTargetInfo())); 4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_builtins_ap.get(); 4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 46702772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochIdentifierTable * 4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getIdentifierTable() 4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_identifier_table_ap.get() == NULL) 4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL)); 4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_identifier_table_ap.get(); 4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LangOptions * 4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getLanguageOptions() 4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_language_options_ap.get() == NULL) 4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_language_options_ap.reset(new LangOptions()); 4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParseLangArgs(*m_language_options_ap, IK_ObjCXX); 4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); 4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_language_options_ap.get(); 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SelectorTable * 4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getSelectorTable() 4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_selector_table_ap.get() == NULL) 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_selector_table_ap.reset (new SelectorTable()); 4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_selector_table_ap.get(); 4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclang::FileManager * 4967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::getFileManager() 4977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_file_manager_ap.get() == NULL) 4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::FileSystemOptions file_system_options; 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_file_manager_ap.reset(new clang::FileManager(file_system_options)); 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_file_manager_ap.get(); 5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang::SourceManager * 5077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::getSourceManager() 5087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_source_manager_ap.get() == NULL) 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_source_manager_ap.reset(new clang::SourceManager(*getDiagnostic(), *getFileManager())); 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_source_manager_ap.get(); 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Diagnostic * 5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getDiagnostic() 5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_diagnostic_ap.get() == NULL) 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs()); 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_diagnostic_ap.reset(new Diagnostic(diag_id_sp)); 5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_diagnostic_ap.get(); 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class NullDiagnosticClient : public DiagnosticClient 5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NullDiagnosticClient () 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS); 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void HandleDiagnostic (Diagnostic::Level DiagLevel, const DiagnosticInfo &info) 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_log) 5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) llvm::SmallVectorImpl<char> diag_str(10); 538926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) info.FormatDiagnostic(diag_str); 5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) diag_str.push_back('\0'); 5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_log->Printf("Compiler diagnostic: %s\n", diag_str.data()); 5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 543926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)private: 5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) LogSP m_log; 5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DiagnosticClient * 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getDiagnosticClient() 5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_diagnostic_client_ap.get() == NULL) 5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_diagnostic_client_ap.reset(new NullDiagnosticClient); 5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_diagnostic_client_ap.get(); 55402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TargetOptions * 5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getTargetOptions() 55802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_target_options_ap.get() == NULL && !m_target_triple.empty()) 5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_options_ap.reset (new TargetOptions()); 5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_target_options_ap.get()) 5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_options_ap->Triple = m_target_triple; 5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_target_options_ap.get(); 5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 56802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TargetInfo * 5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::getTargetInfo() 5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // target_triple should be something like "x86_64-apple-darwin10" 5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_target_info_ap.get() == NULL && !m_target_triple.empty()) 5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnostic(), *getTargetOptions())); 5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_target_info_ap.get(); 5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#pragma mark Basic Types 5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline bool 5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type) 5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint64_t qual_type_bit_size = ast->getTypeSize(qual_type); 5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (qual_type_bit_size == bit_size) 5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size) 5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast = getASTContext(); 5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert (ast != NULL); 5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size); 5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size) 6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!ast) 6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (encoding) 6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eEncodingInvalid: 6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->VoidPtrTy.getAsOpaquePtr(); 6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 61102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eEncodingUint: 6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedCharTy.getAsOpaquePtr(); 6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedShortTy.getAsOpaquePtr(); 6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedIntTy.getAsOpaquePtr(); 6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedLongTy.getAsOpaquePtr(); 6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 622926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedLongLongTy.getAsOpaquePtr(); 6237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedInt128Ty.getAsOpaquePtr(); 6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eEncodingSint: 6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->CharTy.getAsOpaquePtr(); 6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->ShortTy.getAsOpaquePtr(); 6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->IntTy.getAsOpaquePtr(); 634926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 635d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return ast->LongTy.getAsOpaquePtr(); 6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongLongTy.getAsOpaquePtr(); 6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->Int128Ty.getAsOpaquePtr(); 640926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 641d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case eEncodingIEEE754: 6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->FloatTy.getAsOpaquePtr(); 6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->DoubleTy.getAsOpaquePtr(); 6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 64876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return ast->LongDoubleTy.getAsOpaquePtr(); 64976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) break; 65076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) 65176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) case eEncodingVector: 65276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) default: 65376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) break; 65476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) } 65576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) 65676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) return NULL; 65776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)} 65876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) 65976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)clang_type_t 66076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size) 66176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles){ 66276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) ASTContext *ast = getASTContext(); 66376c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) 66476c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) #define streq(a,b) strcmp(a,b) == 0 66576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) assert (ast != NULL); 66676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) if (ast) 66776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { 66876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) switch (dw_ate) 66976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) { 6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_address: 6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy)) 675926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->VoidPtrTy.getAsOpaquePtr(); 6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_boolean: 6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy)) 6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->BoolTy.getAsOpaquePtr(); 6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedCharTy.getAsOpaquePtr(); 6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedShortTy.getAsOpaquePtr(); 685926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedIntTy.getAsOpaquePtr(); 6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_lo_user: 6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This has been seen to mean DW_AT_complex_integer 6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (strcmp(type_name, "complex") == 0) 6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2); 6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr(); 6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_complex_float: 6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy)) 7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->FloatComplexTy.getAsOpaquePtr(); 7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy)) 7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->DoubleComplexTy.getAsOpaquePtr(); 7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy)) 7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongDoubleComplexTy.getAsOpaquePtr(); 7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 706926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 707926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2); 708926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr(); 709926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 710926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 711926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 712926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case DW_ATE_float: 713926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy)) 714926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->FloatTy.getAsOpaquePtr(); 715926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy)) 7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->DoubleTy.getAsOpaquePtr(); 7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy)) 7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongDoubleTy.getAsOpaquePtr(); 7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_signed: 7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (type_name) 7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (strstr(type_name, "long long")) 7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 727926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->LongLongTy.getAsOpaquePtr(); 728926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 729926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (strstr(type_name, "long")) 730926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongTy.getAsOpaquePtr(); 7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strstr(type_name, "short")) 7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->ShortTy.getAsOpaquePtr(); 7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strstr(type_name, "char")) 74002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->CharTy.getAsOpaquePtr(); 7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->SignedCharTy.getAsOpaquePtr(); 7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strstr(type_name, "int")) 7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->IntTy.getAsOpaquePtr(); 7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 75102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch return ast->Int128Ty.getAsOpaquePtr(); 7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (streq(type_name, "wchar_t")) 7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy)) 7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->WCharTy.getAsOpaquePtr(); 7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We weren't able to match up a type name, just search by size 7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->CharTy.getAsOpaquePtr(); 7627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy)) 7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->ShortTy.getAsOpaquePtr(); 76402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy)) 7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->IntTy.getAsOpaquePtr(); 7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy)) 7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongTy.getAsOpaquePtr(); 7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy)) 7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->LongLongTy.getAsOpaquePtr(); 7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty)) 7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->Int128Ty.getAsOpaquePtr(); 7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_signed_char: 7757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (type_name) 7767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 77702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (streq(type_name, "signed char")) 7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->SignedCharTy.getAsOpaquePtr(); 781926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 782926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 783926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) 784926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->CharTy.getAsOpaquePtr(); 785926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) 7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->SignedCharTy.getAsOpaquePtr(); 7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 788926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_unsigned: 7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (type_name) 791926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 792926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (strstr(type_name, "long long")) 793926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 794926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedLongLongTy.getAsOpaquePtr(); 796926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strstr(type_name, "long")) 798926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 799926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 800926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedLongTy.getAsOpaquePtr(); 8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 802926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (strstr(type_name, "short")) 8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 804926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 805926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedShortTy.getAsOpaquePtr(); 806926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 807926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (strstr(type_name, "char")) 8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 810926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedCharTy.getAsOpaquePtr(); 8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strstr(type_name, "int")) 813926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 814926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 815926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedIntTy.getAsOpaquePtr(); 816926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 817926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return ast->UnsignedInt128Ty.getAsOpaquePtr(); 818926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 819926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We weren't able to match up a type name, just search by size 8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedCharTy.getAsOpaquePtr(); 8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) 8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedShortTy.getAsOpaquePtr(); 8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy)) 8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedIntTy.getAsOpaquePtr(); 8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy)) 8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedLongTy.getAsOpaquePtr(); 8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy)) 8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedLongLongTy.getAsOpaquePtr(); 8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) 8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedInt128Ty.getAsOpaquePtr(); 8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case DW_ATE_unsigned_char: 8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) 8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->UnsignedCharTy.getAsOpaquePtr(); 838926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 839926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 840926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case DW_ATE_imaginary_float: 8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This assert should fire for anything that we don't catch above so we know 8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // to fix any issues we run into. 8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert (!"error: ClangASTContext::GetClangTypeForDWARFEncodingAndSize() contains an unhandled encoding. Fix this ASAP!"); 8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetBuiltInType_void(ASTContext *ast) 85202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->VoidTy.getAsOpaquePtr(); 85402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 8557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 8567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclang_type_t 85702772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochClangASTContext::GetBuiltInType_bool() 8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getASTContext()->BoolTy.getAsOpaquePtr(); 860926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 863926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ClangASTContext::GetBuiltInType_objc_id() 864926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 865926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinIdTy).getAsOpaquePtr(); 866926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 867926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 868926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)clang_type_t 869926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ClangASTContext::GetBuiltInType_objc_Class() 87002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getASTContext()->ObjCBuiltinClassTy.getAsOpaquePtr(); 87202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch} 8737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 8747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclang_type_t 87502772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochClangASTContext::GetBuiltInType_objc_selector() 8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 877926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return getASTContext()->getPointerType(getASTContext()->ObjCBuiltinSelTy).getAsOpaquePtr(); 8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 879926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 880926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)clang_type_t 881926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ClangASTContext::GetCStringType (bool is_const) 8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 883926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) QualType char_type(getASTContext()->CharTy); 8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (is_const) 886926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) char_type.addConst(); 887926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return getASTContext()->getPointerType(char_type).getAsOpaquePtr(); 8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclang_type_t 8927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::GetVoidPtrType (bool is_const) 89302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{ 894926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return GetVoidPtrType(getASTContext(), is_const); 895926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 896926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 897926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)clang_type_t 8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const) 8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 900926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) QualType void_ptr_type(ast->VoidPtrTy); 9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (is_const) 903926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) void_ptr_type.addConst(); 904926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 905926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return void_ptr_type.getAsOpaquePtr(); 9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::CopyType (ASTContext *dst_ast, 9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *src_ast, 9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t clang_type) 9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FileSystemOptions file_system_options; 9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FileManager file_manager (file_system_options); 9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTImporter importer(*dst_ast, file_manager, 9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *src_ast, file_manager, 9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) false); 9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType src (QualType::getFromOpaquePtr(clang_type)); 9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType dst (importer.Import(src)); 9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return dst.getAsOpaquePtr(); 9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang::Decl * 9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::CopyDecl (ASTContext *dst_ast, 9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *src_ast, 9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::Decl *source_decl) 9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FileSystemOptions file_system_options; 9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FileManager file_manager (file_system_options); 9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTImporter importer(*dst_ast, file_manager, 9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *src_ast, file_manager, 9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) false); 9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return importer.Import(source_decl); 9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool 9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::AreTypesSame(ASTContext *ast, 9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t type1, 9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t type2) 9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ast->hasSameType(QualType::getFromOpaquePtr(type1), 9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType::getFromOpaquePtr(type2)); 9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#pragma mark CVR modifiers 9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::AddConstModifier (clang_type_t clang_type) 9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (clang_type) 9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType result(QualType::getFromOpaquePtr(clang_type)); 9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.addConst(); 9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.getAsOpaquePtr(); 9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::AddRestrictModifier (clang_type_t clang_type) 9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (clang_type) 9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 96802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch QualType result(QualType::getFromOpaquePtr(clang_type)); 9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.getQualifiers().setRestrict (true); 9707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return result.getAsOpaquePtr(); 9717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::AddVolatileModifier (clang_type_t clang_type) 9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (clang_type) 9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType result(QualType::getFromOpaquePtr(clang_type)); 9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.getQualifiers().setVolatile (true); 9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result.getAsOpaquePtr(); 9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::GetTypeForDecl (TagDecl *decl) 9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No need to call the getASTContext() accessor (which can create the AST 9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // if it isn't created yet, because we can't have created a decl in this 9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // AST if our AST didn't already exist... 9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_ast_ap.get()) 9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr(); 9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 997926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)clang_type_t 10007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl) 10017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 10027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // No need to call the getASTContext() accessor (which can create the AST 10037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // if it isn't created yet, because we can't have created a decl in this 10047242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // AST if our AST didn't already exist... 10057242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (m_ast_ap.get()) 10067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr(); 10077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return NULL; 10087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 10097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#pragma mark Structure, Unions, Classes 10117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclang_type_t 10137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language) 10147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 10157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASTContext *ast = getASTContext(); 10167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci assert (ast != NULL); 10177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (decl_ctx == NULL) 10197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci decl_ctx = ast->getTranslationUnitDecl(); 10207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (language == eLanguageTypeObjC) 10237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 10247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool isForwardDecl = true; 10257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci bool isInternal = false; 10267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal); 10277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 10287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 10307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // we will need to update this code. I was told to currently always use 10317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // the CXXRecordDecl class since we often don't know from debug information 10327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // if something is struct or a class, so we default to always use the more 10337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // complete definition just in case. 10347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CXXRecordDecl *decl = CXXRecordDecl::Create(*ast, 10357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci (TagDecl::TagKind)kind, 10367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci decl_ctx, 10377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci SourceLocation(), 10387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci name && name[0] ? &ast->Idents.get(name) : NULL); 10397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return ast->getTagDeclType(decl).getAsOpaquePtr(); 10417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 10427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool 10447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern) 10457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 10467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (clang_type == NULL) 10477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return false; 10487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 10507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 10517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 10527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci switch (type_class) 10537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 10547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case clang::Type::Record: 10557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 10567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 10577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (cxx_record_decl) 10587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 10597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cxx_record_decl->setHasExternalLexicalStorage (has_extern); 10607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci cxx_record_decl->setHasExternalVisibleStorage (has_extern); 10617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return true; 10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::Enum: 10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl(); 10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (enum_decl) 10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum_decl->setHasExternalLexicalStorage (has_extern); 10725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) enum_decl->setHasExternalVisibleStorage (has_extern); 10735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 10775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::ObjCObject: 10795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::ObjCInterface: 10805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 10825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert (objc_class_type); 10835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (objc_class_type) 10845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 10865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (class_interface_decl) 10885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 10895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class_interface_decl->setHasExternalLexicalStorage (has_extern); 10905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class_interface_decl->setHasExternalVisibleStorage (has_extern); 10915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 10925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 10955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 10965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case clang::Type::Typedef: 10985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern); 10995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 11015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 11025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 11055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool 11075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IsOperator (const char *name, OverloadedOperatorKind &op_kind) 11085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 11095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name == NULL || name[0] == '\0') 11105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define OPERATOR_PREFIX "operator" 11135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1) 11145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *post_op_name = NULL; 11165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool no_space = true; 11185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH)) 11205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) post_op_name = name + OPERATOR_PREFIX_LENGTH; 11235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (post_op_name[0] == ' ') 11255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) post_op_name++; 11275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) no_space = false; 11285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 11295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef OPERATOR_PREFIX 11315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#undef OPERATOR_PREFIX_LENGTH 11325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This is an operator, set the overloaded operator kind to invalid 11345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // in case this is a conversion operator... 11355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = NUM_OVERLOADED_OPERATORS; 11365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (post_op_name[0]) 11385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 11395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) default: 11405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (no_space) 11415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 11435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'n': 11445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (no_space) 11455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (strcmp (post_op_name, "new") == 0) 11475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_New; 11485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strcmp (post_op_name, "new[]") == 0) 11495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Array_New; 11505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 11515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case 'd': 11535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (no_space) 11545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 11555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (strcmp (post_op_name, "delete") == 0) 11565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Delete; 11575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (strcmp (post_op_name, "delete[]") == 0) 11585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Array_Delete; 11595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 11605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 11615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '+': 11625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (post_op_name[1] == '\0') 1163926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Plus; 1164926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[2] == '\0') 1165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '=') 1167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_PlusEqual; 1168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '+') 1169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_PlusPlus; 1170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1171926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1173926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '-': 1174926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Minus; 1176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[2] == '\0') 1177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (post_op_name[1]) 1179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '=': op_kind = OO_MinusEqual; break; 1181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '-': op_kind = OO_MinusMinus; break; 1182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '>': op_kind = OO_Arrow; break; 1183926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1185926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[3] == '\0') 1186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1187926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[2] == '*') 1188926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_ArrowStar; break; 1189926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1190926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '*': 1193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Star; 1195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_StarEqual; 1197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '/': 1200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1201926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Slash; 1202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1203926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_SlashEqual; 1204926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1205926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1206926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '%': 1207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Percent; 1209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_PercentEqual; 1211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '^': 1215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Caret; 1217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_CaretEqual; 1219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '&': 1222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Amp; 1224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[2] == '\0') 1225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (post_op_name[1]) 1227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '=': op_kind = OO_AmpEqual; break; 1229926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '&': op_kind = OO_AmpAmp; break; 1230926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1231926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1232926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '|': 1235926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1236926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Pipe; 1237926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[2] == '\0') 1238926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1239926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (post_op_name[1]) 1240926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '=': op_kind = OO_PipeEqual; break; 1242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '|': op_kind = OO_PipePipe; break; 1243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1246926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1247926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '~': 1248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Tilde; 1250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '!': 1253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Exclaim; 1255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_ExclaimEqual; 1257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '=': 1260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Equal; 1262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[1] == '=' && post_op_name[2] == '\0') 1263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_EqualEqual; 1264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '<': 1267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 1268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_Less; 1269926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[2] == '\0') 1270926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1271926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) switch (post_op_name[1]) 1272926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '<': op_kind = OO_LessLess; break; 1274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '=': op_kind = OO_LessEqual; break; 1275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) else if (post_op_name[3] == '\0') 1278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 1279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[2] == '=') 1280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) op_kind = OO_LessLessEqual; 1281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 1282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) break; 1283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) case '>': 1285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (post_op_name[1] == '\0') 12865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Greater; 12875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (post_op_name[2] == '\0') 128802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 12895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (post_op_name[1]) 12905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 12915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '>': op_kind = OO_GreaterGreater; break; 12925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '=': op_kind = OO_GreaterEqual; break; 12935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 12955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (post_op_name[1] == '>' && 12965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) post_op_name[2] == '=' && 12975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) post_op_name[3] == '\0') 12985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 12995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_GreaterGreaterEqual; 13005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ',': 13045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (post_op_name[1] == '\0') 13055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Comma; 13065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '(': 13095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (post_op_name[1] == ')' && post_op_name[2] == '\0') 13105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Call; 13115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case '[': 13145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (post_op_name[1] == ']' && post_op_name[2] == '\0') 13155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) op_kind = OO_Subscript; 13165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 13175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 13185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 13205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 13215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CXXMethodDecl * 13235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::AddMethodToCXXRecordType 132402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch( 13255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast, 13265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t record_opaque_type, 13275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *name, 13285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t method_opaque_type, 13295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) lldb::AccessType access, 13305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_virtual, 13315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_static, 13325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_inline, 13335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_explicit 13345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)) 13355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!record_opaque_type || !method_opaque_type || !name) 13375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 13385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(ast); 13405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IdentifierTable *identifier_table = &ast->Idents; 13425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert(identifier_table); 13445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type)); 13465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl(); 13485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (cxx_record_decl == NULL) 13505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 13515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 13535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CXXMethodDecl *cxx_method_decl = NULL; 13555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DeclarationName decl_name (&identifier_table->get(name)); 13575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const bool is_implicitly_declared = false; 1359c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 13605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr()); 13615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (function_Type == NULL) 13635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 13645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type)); 13665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 136702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch if (!method_function_prototype) 13685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return NULL; 13695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) unsigned int num_params = method_function_prototype->getNumArgs(); 13715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 13725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name[0] == '~') 137302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 13745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl = CXXDestructorDecl::Create (*ast, 13755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_record_decl, 13765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 13775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method_qual_type, 13785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, 13795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_inline, 138002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch is_implicitly_declared); 13815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1382c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else if (decl_name == cxx_record_decl->getDeclName()) 13835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 13845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl = CXXConstructorDecl::Create (*ast, 138502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch cxx_record_decl, 13865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()), 13875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method_qual_type, 13885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, // TypeSourceInfo * 13895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_explicit, 13905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_inline, 13915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_implicitly_declared); 13925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 139302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch else 13945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 13955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 139602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS; 13975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (IsOperator (name, op_kind)) 13985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 13995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (op_kind != NUM_OVERLOADED_OPERATORS) 14005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 140102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch cxx_method_decl = CXXMethodDecl::Create (*ast, 14025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_record_decl, 14035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()), 14045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method_qual_type, 14055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, // TypeSourceInfo * 14065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_static, 14075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SC_None, 14085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_inline); 14095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else if (num_params == 0) 14115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 14125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Conversion operators don't take params... 14135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl = CXXConversionDecl::Create (*ast, 14145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_record_decl, 14155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()), 14165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method_qual_type, 14175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, // TypeSourceInfo * 14185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_inline, 14195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_explicit); 14205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 142202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (cxx_method_decl == NULL) 14245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 14255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl = CXXMethodDecl::Create (*ast, 1426197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch cxx_record_decl, 1427197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch DeclarationNameInfo (decl_name, SourceLocation()), 1428197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch method_qual_type, 1429197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch NULL, // TypeSourceInfo * 1430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch is_static, 14315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SC_None, 14325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_inline); 14335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access); 14375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl->setAccess (access_specifier); 14395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl->setVirtualAsWritten (is_virtual); 14405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Populate the method decl with parameter decls 14425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ParmVarDecl *params[num_params]; 14445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (int param_index = 0; 144602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch param_index < num_params; 14475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ++param_index) 144802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 14495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) params[param_index] = ParmVarDecl::Create (*ast, 14505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl, 14515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SourceLocation(), 14525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, // anonymous 14535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) method_function_prototype->getArgType(param_index), 14545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, 14555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SC_None, 14565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SC_None, 14575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL); 14585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 14595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) cxx_method_decl->setParams (params, num_params); 14615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 146202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch cxx_record_decl->addDecl (cxx_method_decl); 1463c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 14645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->isPolymorphic() = %i\n", cxx_record_decl->isPolymorphic()); 14655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->isAggregate() = %i\n", cxx_record_decl->isAggregate()); 14665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->isPOD() = %i\n", cxx_record_decl->isPOD()); 14675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->isEmpty() = %i\n", cxx_record_decl->isEmpty()); 14685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->isAbstract() = %i\n", cxx_record_decl->isAbstract()); 14695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->hasTrivialConstructor() = %i\n", cxx_record_decl->hasTrivialConstructor()); 14705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor()); 147102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// printf ("decl->hasTrivialCopyAssignment() = %i\n", cxx_record_decl->hasTrivialCopyAssignment()); 14725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// printf ("decl->hasTrivialDestructor() = %i\n", cxx_record_decl->hasTrivialDestructor()); 1473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return cxx_method_decl; 1474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 1475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool 147702772c6a72f1ee0b226341a4f4439970c29fc861Ben MurdochClangASTContext::AddFieldToRecordType 14785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)( 1479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) ASTContext *ast, 148002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch clang_type_t record_clang_type, 14815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const char *name, 14825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clang_type_t field_type, 14835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) AccessType access, 14845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t bitfield_bit_size 14855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)) 14865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (record_clang_type == NULL || field_type == NULL) 14885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 14895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IdentifierTable *identifier_table = &ast->Idents; 149102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 14925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) assert (ast != NULL); 149302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch assert (identifier_table != NULL); 14945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 14955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type)); 14965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 149702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch clang::Type *clang_type = record_qual_type.getTypePtr(); 14985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (clang_type) 149902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch { 15005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const RecordType *record_type = dyn_cast<RecordType>(clang_type); 15015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (record_type) 1503926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 15045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) RecordDecl *record_decl = record_type->getDecl(); 15055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 150602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch clang::Expr *bit_width = NULL; 15075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (bitfield_bit_size != 0) 15085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1509926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 15105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 15115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 151202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch FieldDecl *field = FieldDecl::Create (*ast, 15135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) record_decl, 15145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) SourceLocation(), 1515926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) name ? &identifier_table->get(name) : NULL, // Identifier 15165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) QualType::getFromOpaquePtr(field_type), // Field type 15175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) NULL, // DeclaratorInfo * 151802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch bit_width, // BitWidth 15195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) false); // Mutable 1520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 15215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) field->setAccess (ConvertAccessTypeToAccessSpecifier (access)); 15225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (field) 15245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 15255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) record_decl->addDecl(field); 15265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 15295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 15305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type); 15315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (objc_class_type) 15325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 15335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool is_synthesized = false; 15345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ClangASTContext::AddObjCClassIVar (ast, 15355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) record_clang_type, 15365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name, 15375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) field_type, 15385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) access, 15395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bitfield_bit_size, 15405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) is_synthesized); 15415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 15445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 15455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool 15485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size) 15495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FieldIsBitfield(getASTContext(), field, bitfield_bit_size); 15515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 15525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool 15545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext::FieldIsBitfield 15555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)( 15565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASTContext *ast, 15575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FieldDecl* field, 15585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) uint32_t& bitfield_bit_size 15595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)) 15605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 15615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (ast == NULL || field == NULL) 15625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 15635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 15645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (field->isBitField()) 15655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 15665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Expr* bit_width_expr = field->getBitWidth(); 1567bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (bit_width_expr) 1568bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 1569bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) llvm::APSInt bit_width_apsint; 1570bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast)) 1571bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) { 1572bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX); 1573bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return true; 1574bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 1575bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 1576bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) } 1577bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return false; 1578bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)} 1579bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 1580bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)bool 1581bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)ClangASTContext::RecordHasFields (const RecordDecl *record_decl) 1582bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){ 1583bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (record_decl == NULL) 1584bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return false; 1585bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 1586bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) if (!record_decl->field_empty()) 1587bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) return true; 1588bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles) 15895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // No fields, lets check this is a CXX record and check the base classes 1590 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 1591 if (cxx_record_decl) 1592 { 1593 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 1594 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 1595 base_class != base_class_end; 1596 ++base_class) 1597 { 1598 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 1599 if (RecordHasFields(base_class_decl)) 1600 return true; 1601 } 1602 } 1603 return false; 1604} 1605 1606void 1607ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities) 1608{ 1609 if (clang_type) 1610 { 1611 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 1612 1613 RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr()); 1614 if (record_type) 1615 { 1616 RecordDecl *record_decl = record_type->getDecl(); 1617 if (record_decl) 1618 { 1619 uint32_t field_idx; 1620 RecordDecl::field_iterator field, field_end; 1621 for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0; 1622 field != field_end; 1623 ++field, ++field_idx) 1624 { 1625 // If no accessibility was assigned, assign the correct one 1626 if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none) 1627 field->setAccess ((AccessSpecifier)default_accessibility); 1628 } 1629 } 1630 } 1631 } 1632} 1633 1634#pragma mark C++ Base Classes 1635 1636CXXBaseSpecifier * 1637ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class) 1638{ 1639 if (base_class_type) 1640 return new CXXBaseSpecifier (SourceRange(), 1641 is_virtual, 1642 base_of_class, 1643 ConvertAccessTypeToAccessSpecifier (access), 1644 getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)), 1645 SourceLocation()); 1646 return NULL; 1647} 1648 1649void 1650ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes) 1651{ 1652 for (unsigned i=0; i<num_base_classes; ++i) 1653 { 1654 delete base_classes[i]; 1655 base_classes[i] = NULL; 1656 } 1657} 1658 1659bool 1660ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes) 1661{ 1662 if (class_clang_type) 1663 { 1664 CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl(); 1665 if (cxx_record_decl) 1666 { 1667 cxx_record_decl->setBases(base_classes, num_base_classes); 1668 return true; 1669 } 1670 } 1671 return false; 1672} 1673#pragma mark Objective C Classes 1674 1675clang_type_t 1676ClangASTContext::CreateObjCClass 1677( 1678 const char *name, 1679 DeclContext *decl_ctx, 1680 bool isForwardDecl, 1681 bool isInternal 1682) 1683{ 1684 ASTContext *ast = getASTContext(); 1685 assert (ast != NULL); 1686 assert (name && name[0]); 1687 if (decl_ctx == NULL) 1688 decl_ctx = ast->getTranslationUnitDecl(); 1689 1690 // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and 1691 // we will need to update this code. I was told to currently always use 1692 // the CXXRecordDecl class since we often don't know from debug information 1693 // if something is struct or a class, so we default to always use the more 1694 // complete definition just in case. 1695 ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast, 1696 decl_ctx, 1697 SourceLocation(), 1698 &ast->Idents.get(name), 1699 SourceLocation(), 1700 isForwardDecl, 1701 isInternal); 1702 1703 return ast->getObjCInterfaceType(decl).getAsOpaquePtr(); 1704} 1705 1706bool 1707ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type) 1708{ 1709 if (class_opaque_type && super_opaque_type) 1710 { 1711 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 1712 QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type)); 1713 clang::Type *class_type = class_qual_type.getTypePtr(); 1714 clang::Type *super_type = super_qual_type.getTypePtr(); 1715 if (class_type && super_type) 1716 { 1717 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1718 ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type); 1719 if (objc_class_type && objc_super_type) 1720 { 1721 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1722 ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface(); 1723 if (class_interface_decl && super_interface_decl) 1724 { 1725 class_interface_decl->setSuperClass(super_interface_decl); 1726 return true; 1727 } 1728 } 1729 } 1730 } 1731 return false; 1732} 1733 1734 1735bool 1736ClangASTContext::AddObjCClassIVar 1737( 1738 ASTContext *ast, 1739 clang_type_t class_opaque_type, 1740 const char *name, 1741 clang_type_t ivar_opaque_type, 1742 AccessType access, 1743 uint32_t bitfield_bit_size, 1744 bool is_synthesized 1745) 1746{ 1747 if (class_opaque_type == NULL || ivar_opaque_type == NULL) 1748 return false; 1749 1750 IdentifierTable *identifier_table = &ast->Idents; 1751 1752 assert (ast != NULL); 1753 assert (identifier_table != NULL); 1754 1755 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 1756 1757 clang::Type *class_type = class_qual_type.getTypePtr(); 1758 if (class_type) 1759 { 1760 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1761 1762 if (objc_class_type) 1763 { 1764 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1765 1766 if (class_interface_decl) 1767 { 1768 clang::Expr *bit_width = NULL; 1769 if (bitfield_bit_size != 0) 1770 { 1771 APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size); 1772 bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation()); 1773 } 1774 1775 ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast, 1776 class_interface_decl, 1777 SourceLocation(), 1778 &identifier_table->get(name), // Identifier 1779 QualType::getFromOpaquePtr(ivar_opaque_type), // Field type 1780 NULL, // TypeSourceInfo * 1781 ConvertAccessTypeToObjCIvarAccessControl (access), 1782 bit_width, 1783 is_synthesized); 1784 1785 if (field) 1786 { 1787 class_interface_decl->addDecl(field); 1788 return true; 1789 } 1790 } 1791 } 1792 } 1793 return false; 1794} 1795 1796 1797bool 1798ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass) 1799{ 1800 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 1801 1802 clang::Type *class_type = class_qual_type.getTypePtr(); 1803 if (class_type) 1804 { 1805 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1806 1807 if (objc_class_type) 1808 return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass); 1809 } 1810 return false; 1811} 1812 1813bool 1814ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass) 1815{ 1816 while (class_interface_decl) 1817 { 1818 if (class_interface_decl->ivar_size() > 0) 1819 return true; 1820 1821 if (check_superclass) 1822 class_interface_decl = class_interface_decl->getSuperClass(); 1823 else 1824 break; 1825 } 1826 return false; 1827} 1828 1829ObjCMethodDecl * 1830ClangASTContext::AddMethodToObjCObjectType 1831( 1832 ASTContext *ast, 1833 clang_type_t class_opaque_type, 1834 const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]") 1835 clang_type_t method_opaque_type, 1836 lldb::AccessType access 1837) 1838{ 1839 if (class_opaque_type == NULL || method_opaque_type == NULL) 1840 return NULL; 1841 1842 IdentifierTable *identifier_table = &ast->Idents; 1843 1844 assert (ast != NULL); 1845 assert (identifier_table != NULL); 1846 1847 QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type)); 1848 1849 clang::Type *class_type = class_qual_type.getTypePtr(); 1850 if (class_type == NULL) 1851 return NULL; 1852 1853 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type); 1854 1855 if (objc_class_type == NULL) 1856 return NULL; 1857 1858 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 1859 1860 if (class_interface_decl == NULL) 1861 return NULL; 1862 1863 const char *selector_start = ::strchr (name, ' '); 1864 if (selector_start == NULL) 1865 return NULL; 1866 1867 selector_start++; 1868 if (!(::isalpha (selector_start[0]) || selector_start[0] == '_')) 1869 return NULL; 1870 llvm::SmallVector<IdentifierInfo *, 12> selector_idents; 1871 1872 size_t len = 0; 1873 const char *start; 1874 //printf ("name = '%s'\n", name); 1875 1876 unsigned num_selectors_with_args = 0; 1877 for (start = selector_start; 1878 start && *start != '\0' && *start != ']'; 1879 start += len) 1880 { 1881 len = ::strcspn(start, ":]"); 1882 bool has_arg = (start[len] == ':'); 1883 if (has_arg) 1884 ++num_selectors_with_args; 1885 selector_idents.push_back (&identifier_table->get (StringRef (start, len))); 1886 if (has_arg) 1887 len += 1; 1888 } 1889 1890 1891 if (selector_idents.size() == 0) 1892 return 0; 1893 1894 clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0, 1895 selector_idents.data()); 1896 1897 QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type)); 1898 1899 // Populate the method decl with parameter decls 1900 clang::Type *method_type(method_qual_type.getTypePtr()); 1901 1902 if (method_type == NULL) 1903 return NULL; 1904 1905 FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type)); 1906 1907 if (!method_function_prototype) 1908 return NULL; 1909 1910 1911 bool is_variadic = false; 1912 bool is_synthesized = false; 1913 bool is_defined = false; 1914 ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None; 1915 1916 const unsigned num_args = method_function_prototype->getNumArgs(); 1917 1918 ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast, 1919 SourceLocation(), // beginLoc, 1920 SourceLocation(), // endLoc, 1921 method_selector, 1922 method_function_prototype->getResultType(), 1923 NULL, // TypeSourceInfo *ResultTInfo, 1924 GetDeclContextForType (class_opaque_type), 1925 name[0] == '-', 1926 is_variadic, 1927 is_synthesized, 1928 is_defined, 1929 imp_control, 1930 num_args); 1931 1932 1933 if (objc_method_decl == NULL) 1934 return NULL; 1935 1936 if (num_args > 0) 1937 { 1938 llvm::SmallVector<ParmVarDecl *, 12> params; 1939 1940 for (int param_index = 0; param_index < num_args; ++param_index) 1941 { 1942 params.push_back (ParmVarDecl::Create (*ast, 1943 objc_method_decl, 1944 SourceLocation(), 1945 NULL, // anonymous 1946 method_function_prototype->getArgType(param_index), 1947 NULL, 1948 SC_Auto, 1949 SC_Auto, 1950 NULL)); 1951 } 1952 1953 objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args); 1954 } 1955 1956 class_interface_decl->addDecl (objc_method_decl); 1957 1958 1959 return objc_method_decl; 1960} 1961 1962 1963uint32_t 1964ClangASTContext::GetTypeInfo 1965( 1966 clang_type_t clang_type, 1967 clang::ASTContext *ast, 1968 clang_type_t *pointee_or_element_clang_type 1969) 1970{ 1971 if (clang_type == NULL) 1972 return 0; 1973 1974 if (pointee_or_element_clang_type) 1975 *pointee_or_element_clang_type = NULL; 1976 1977 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 1978 1979 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 1980 switch (type_class) 1981 { 1982 case clang::Type::Builtin: 1983 switch (cast<clang::BuiltinType>(qual_type)->getKind()) 1984 { 1985 case clang::BuiltinType::ObjCId: 1986 case clang::BuiltinType::ObjCClass: 1987 if (ast && pointee_or_element_clang_type) 1988 *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 1989 return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue; 1990 1991 default: 1992 break; 1993 } 1994 return eTypeIsBuiltIn | eTypeHasValue; 1995 1996 case clang::Type::BlockPointer: 1997 if (pointee_or_element_clang_type) 1998 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 1999 return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock; 2000 2001 case clang::Type::Complex: return eTypeIsBuiltIn | eTypeHasValue; 2002 2003 case clang::Type::ConstantArray: 2004 case clang::Type::DependentSizedArray: 2005 case clang::Type::IncompleteArray: 2006 case clang::Type::VariableArray: 2007 if (pointee_or_element_clang_type) 2008 *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr(); 2009 return eTypeHasChildren | eTypeIsArray; 2010 2011 case clang::Type::DependentName: return 0; 2012 case clang::Type::DependentSizedExtVector: return eTypeHasChildren | eTypeIsVector; 2013 case clang::Type::DependentTemplateSpecialization: return eTypeIsTemplate; 2014 case clang::Type::Decltype: return 0; 2015 2016 case clang::Type::Enum: 2017 if (pointee_or_element_clang_type) 2018 *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr(); 2019 return eTypeIsEnumeration | eTypeHasValue; 2020 2021 case clang::Type::Elaborated: return 0; 2022 case clang::Type::ExtVector: return eTypeHasChildren | eTypeIsVector; 2023 case clang::Type::FunctionProto: return eTypeIsFuncPrototype | eTypeHasValue; 2024 case clang::Type::FunctionNoProto: return eTypeIsFuncPrototype | eTypeHasValue; 2025 case clang::Type::InjectedClassName: return 0; 2026 2027 case clang::Type::LValueReference: 2028 case clang::Type::RValueReference: 2029 if (pointee_or_element_clang_type) 2030 *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(); 2031 return eTypeHasChildren | eTypeIsReference | eTypeHasValue; 2032 2033 case clang::Type::MemberPointer: return eTypeIsPointer | eTypeIsMember | eTypeHasValue; 2034 2035 case clang::Type::ObjCObjectPointer: 2036 if (pointee_or_element_clang_type) 2037 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2038 return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue; 2039 2040 case clang::Type::ObjCObject: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2041 case clang::Type::ObjCInterface: return eTypeHasChildren | eTypeIsObjC | eTypeIsClass; 2042 2043 case clang::Type::Pointer: 2044 if (pointee_or_element_clang_type) 2045 *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr(); 2046 return eTypeHasChildren | eTypeIsPointer | eTypeHasValue; 2047 2048 case clang::Type::Record: 2049 if (qual_type->getAsCXXRecordDecl()) 2050 return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus; 2051 else 2052 return eTypeHasChildren | eTypeIsStructUnion; 2053 break; 2054 case clang::Type::SubstTemplateTypeParm: return eTypeIsTemplate; 2055 case clang::Type::TemplateTypeParm: return eTypeIsTemplate; 2056 case clang::Type::TemplateSpecialization: return eTypeIsTemplate; 2057 2058 case clang::Type::Typedef: 2059 return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2060 ast, 2061 pointee_or_element_clang_type); 2062 2063 case clang::Type::TypeOfExpr: return 0; 2064 case clang::Type::TypeOf: return 0; 2065 case clang::Type::UnresolvedUsing: return 0; 2066 case clang::Type::Vector: return eTypeHasChildren | eTypeIsVector; 2067 default: return 0; 2068 } 2069 return 0; 2070} 2071 2072 2073#pragma mark Aggregate Types 2074 2075bool 2076ClangASTContext::IsAggregateType (clang_type_t clang_type) 2077{ 2078 if (clang_type == NULL) 2079 return false; 2080 2081 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 2082 2083 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2084 switch (type_class) 2085 { 2086 case clang::Type::IncompleteArray: 2087 case clang::Type::VariableArray: 2088 case clang::Type::ConstantArray: 2089 case clang::Type::ExtVector: 2090 case clang::Type::Vector: 2091 case clang::Type::Record: 2092 case clang::Type::ObjCObject: 2093 case clang::Type::ObjCInterface: 2094 return true; 2095 2096 case clang::Type::Typedef: 2097 return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2098 2099 default: 2100 break; 2101 } 2102 // The clang type does have a value 2103 return false; 2104} 2105 2106uint32_t 2107ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes) 2108{ 2109 if (clang_type == NULL) 2110 return 0; 2111 2112 uint32_t num_children = 0; 2113 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2114 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2115 switch (type_class) 2116 { 2117 case clang::Type::Builtin: 2118 switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2119 { 2120 case clang::BuiltinType::ObjCId: // child is Class 2121 case clang::BuiltinType::ObjCClass: // child is Class 2122 num_children = 1; 2123 break; 2124 2125 default: 2126 break; 2127 } 2128 break; 2129 2130 case clang::Type::Complex: return 0; 2131 2132 case clang::Type::Record: 2133 if (GetCompleteQualType (ast, qual_type)) 2134 { 2135 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 2136 const RecordDecl *record_decl = record_type->getDecl(); 2137 assert(record_decl); 2138 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 2139 if (cxx_record_decl) 2140 { 2141 if (omit_empty_base_classes) 2142 { 2143 // Check each base classes to see if it or any of its 2144 // base classes contain any fields. This can help 2145 // limit the noise in variable views by not having to 2146 // show base classes that contain no members. 2147 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 2148 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 2149 base_class != base_class_end; 2150 ++base_class) 2151 { 2152 const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 2153 2154 // Skip empty base classes 2155 if (RecordHasFields(base_class_decl) == false) 2156 continue; 2157 2158 num_children++; 2159 } 2160 } 2161 else 2162 { 2163 // Include all base classes 2164 num_children += cxx_record_decl->getNumBases(); 2165 } 2166 2167 } 2168 RecordDecl::field_iterator field, field_end; 2169 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field) 2170 ++num_children; 2171 } 2172 break; 2173 2174 case clang::Type::ObjCObject: 2175 case clang::Type::ObjCInterface: 2176 if (GetCompleteQualType (ast, qual_type)) 2177 { 2178 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 2179 assert (objc_class_type); 2180 if (objc_class_type) 2181 { 2182 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 2183 2184 if (class_interface_decl) 2185 { 2186 2187 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 2188 if (superclass_interface_decl) 2189 { 2190 if (omit_empty_base_classes) 2191 { 2192 if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true)) 2193 ++num_children; 2194 } 2195 else 2196 ++num_children; 2197 } 2198 2199 num_children += class_interface_decl->ivar_size(); 2200 } 2201 } 2202 } 2203 break; 2204 2205 case clang::Type::ObjCObjectPointer: 2206 { 2207 ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr()); 2208 QualType pointee_type = pointer_type->getPointeeType(); 2209 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2210 pointee_type.getAsOpaquePtr(), 2211 omit_empty_base_classes); 2212 // If this type points to a simple type, then it has 1 child 2213 if (num_pointee_children == 0) 2214 num_children = 1; 2215 else 2216 num_children = num_pointee_children; 2217 } 2218 break; 2219 2220 case clang::Type::ConstantArray: 2221 num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 2222 break; 2223 2224 case clang::Type::Pointer: 2225 { 2226 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 2227 QualType pointee_type (pointer_type->getPointeeType()); 2228 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2229 pointee_type.getAsOpaquePtr(), 2230 omit_empty_base_classes); 2231 if (num_pointee_children == 0) 2232 { 2233 // We have a pointer to a pointee type that claims it has no children. 2234 // We will want to look at 2235 num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr()); 2236 } 2237 else 2238 num_children = num_pointee_children; 2239 } 2240 break; 2241 2242 case clang::Type::LValueReference: 2243 case clang::Type::RValueReference: 2244 { 2245 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 2246 QualType pointee_type = reference_type->getPointeeType(); 2247 uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast, 2248 pointee_type.getAsOpaquePtr(), 2249 omit_empty_base_classes); 2250 // If this type points to a simple type, then it has 1 child 2251 if (num_pointee_children == 0) 2252 num_children = 1; 2253 else 2254 num_children = num_pointee_children; 2255 } 2256 break; 2257 2258 2259 case clang::Type::Typedef: 2260 num_children = ClangASTContext::GetNumChildren (ast, 2261 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2262 omit_empty_base_classes); 2263 break; 2264 2265 default: 2266 break; 2267 } 2268 return num_children; 2269} 2270 2271// If a pointer to a pointee type (the clang_type arg) says that it has no 2272// children, then we either need to trust it, or override it and return a 2273// different result. For example, an "int *" has one child that is an integer, 2274// but a function pointer doesn't have any children. Likewise if a Record type 2275// claims it has no children, then there really is nothing to show. 2276uint32_t 2277ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type) 2278{ 2279 if (clang_type == NULL) 2280 return 0; 2281 2282 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2283 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2284 switch (type_class) 2285 { 2286 case clang::Type::Builtin: 2287 switch (cast<clang::BuiltinType>(qual_type)->getKind()) 2288 { 2289 case clang::BuiltinType::Void: 2290 case clang::BuiltinType::NullPtr: 2291 return 0; 2292 case clang::BuiltinType::Bool: 2293 case clang::BuiltinType::Char_U: 2294 case clang::BuiltinType::UChar: 2295 case clang::BuiltinType::WChar_U: 2296 case clang::BuiltinType::Char16: 2297 case clang::BuiltinType::Char32: 2298 case clang::BuiltinType::UShort: 2299 case clang::BuiltinType::UInt: 2300 case clang::BuiltinType::ULong: 2301 case clang::BuiltinType::ULongLong: 2302 case clang::BuiltinType::UInt128: 2303 case clang::BuiltinType::Char_S: 2304 case clang::BuiltinType::SChar: 2305 case clang::BuiltinType::WChar_S: 2306 case clang::BuiltinType::Short: 2307 case clang::BuiltinType::Int: 2308 case clang::BuiltinType::Long: 2309 case clang::BuiltinType::LongLong: 2310 case clang::BuiltinType::Int128: 2311 case clang::BuiltinType::Float: 2312 case clang::BuiltinType::Double: 2313 case clang::BuiltinType::LongDouble: 2314 case clang::BuiltinType::Dependent: 2315 case clang::BuiltinType::Overload: 2316 case clang::BuiltinType::UndeducedAuto: 2317 case clang::BuiltinType::ObjCId: 2318 case clang::BuiltinType::ObjCClass: 2319 case clang::BuiltinType::ObjCSel: 2320 return 1; 2321 } 2322 break; 2323 2324 case clang::Type::Complex: return 1; 2325 case clang::Type::Pointer: return 1; 2326 case clang::Type::BlockPointer: return 0; // If block pointers don't have debug info, then no children for them 2327 case clang::Type::LValueReference: return 1; 2328 case clang::Type::RValueReference: return 1; 2329 case clang::Type::MemberPointer: return 0; 2330 case clang::Type::ConstantArray: return 0; 2331 case clang::Type::IncompleteArray: return 0; 2332 case clang::Type::VariableArray: return 0; 2333 case clang::Type::DependentSizedArray: return 0; 2334 case clang::Type::DependentSizedExtVector: return 0; 2335 case clang::Type::Vector: return 0; 2336 case clang::Type::ExtVector: return 0; 2337 case clang::Type::FunctionProto: return 0; // When we function pointers, they have no children... 2338 case clang::Type::FunctionNoProto: return 0; // When we function pointers, they have no children... 2339 case clang::Type::UnresolvedUsing: return 0; 2340 case clang::Type::Paren: return 0; 2341 case clang::Type::Typedef: return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 2342 case clang::Type::TypeOfExpr: return 0; 2343 case clang::Type::TypeOf: return 0; 2344 case clang::Type::Decltype: return 0; 2345 case clang::Type::Record: return 0; 2346 case clang::Type::Enum: return 1; 2347 case clang::Type::Elaborated: return 1; 2348 case clang::Type::TemplateTypeParm: return 1; 2349 case clang::Type::SubstTemplateTypeParm: return 1; 2350 case clang::Type::TemplateSpecialization: return 1; 2351 case clang::Type::InjectedClassName: return 0; 2352 case clang::Type::DependentName: return 1; 2353 case clang::Type::DependentTemplateSpecialization: return 1; 2354 case clang::Type::ObjCObject: return 0; 2355 case clang::Type::ObjCInterface: return 0; 2356 case clang::Type::ObjCObjectPointer: return 1; 2357 default: 2358 break; 2359 } 2360 return 0; 2361} 2362 2363clang_type_t 2364ClangASTContext::GetChildClangTypeAtIndex 2365( 2366 const char *parent_name, 2367 clang_type_t parent_clang_type, 2368 uint32_t idx, 2369 bool transparent_pointers, 2370 bool omit_empty_base_classes, 2371 std::string& child_name, 2372 uint32_t &child_byte_size, 2373 int32_t &child_byte_offset, 2374 uint32_t &child_bitfield_bit_size, 2375 uint32_t &child_bitfield_bit_offset, 2376 bool &child_is_base_class, 2377 bool &child_is_deref_of_parent 2378) 2379{ 2380 if (parent_clang_type) 2381 2382 return GetChildClangTypeAtIndex (getASTContext(), 2383 parent_name, 2384 parent_clang_type, 2385 idx, 2386 transparent_pointers, 2387 omit_empty_base_classes, 2388 child_name, 2389 child_byte_size, 2390 child_byte_offset, 2391 child_bitfield_bit_size, 2392 child_bitfield_bit_offset, 2393 child_is_base_class, 2394 child_is_deref_of_parent); 2395 return NULL; 2396} 2397 2398clang_type_t 2399ClangASTContext::GetChildClangTypeAtIndex 2400( 2401 ASTContext *ast, 2402 const char *parent_name, 2403 clang_type_t parent_clang_type, 2404 uint32_t idx, 2405 bool transparent_pointers, 2406 bool omit_empty_base_classes, 2407 std::string& child_name, 2408 uint32_t &child_byte_size, 2409 int32_t &child_byte_offset, 2410 uint32_t &child_bitfield_bit_size, 2411 uint32_t &child_bitfield_bit_offset, 2412 bool &child_is_base_class, 2413 bool &child_is_deref_of_parent 2414) 2415{ 2416 if (parent_clang_type == NULL) 2417 return NULL; 2418 2419 if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes)) 2420 { 2421 uint32_t bit_offset; 2422 child_bitfield_bit_size = 0; 2423 child_bitfield_bit_offset = 0; 2424 child_is_base_class = false; 2425 QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type)); 2426 const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass(); 2427 switch (parent_type_class) 2428 { 2429 case clang::Type::Builtin: 2430 switch (cast<clang::BuiltinType>(parent_qual_type)->getKind()) 2431 { 2432 case clang::BuiltinType::ObjCId: 2433 case clang::BuiltinType::ObjCClass: 2434 child_name = "isa"; 2435 child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT; 2436 return ast->ObjCBuiltinClassTy.getAsOpaquePtr(); 2437 2438 default: 2439 break; 2440 } 2441 break; 2442 2443 case clang::Type::Record: 2444 if (GetCompleteQualType (ast, parent_qual_type)) 2445 { 2446 const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr()); 2447 const RecordDecl *record_decl = record_type->getDecl(); 2448 assert(record_decl); 2449 const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl); 2450 uint32_t child_idx = 0; 2451 2452 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 2453 if (cxx_record_decl) 2454 { 2455 // We might have base classes to print out first 2456 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 2457 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 2458 base_class != base_class_end; 2459 ++base_class) 2460 { 2461 const CXXRecordDecl *base_class_decl = NULL; 2462 2463 // Skip empty base classes 2464 if (omit_empty_base_classes) 2465 { 2466 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 2467 if (RecordHasFields(base_class_decl) == false) 2468 continue; 2469 } 2470 2471 if (idx == child_idx) 2472 { 2473 if (base_class_decl == NULL) 2474 base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 2475 2476 2477 if (base_class->isVirtual()) 2478 bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8; 2479 else 2480 bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8; 2481 2482 // Base classes should be a multiple of 8 bits in size 2483 assert (bit_offset % 8 == 0); 2484 child_byte_offset = bit_offset/8; 2485 std::string base_class_type_name(base_class->getType().getAsString()); 2486 2487 child_name.assign(base_class_type_name.c_str()); 2488 2489 uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType()); 2490 2491 // Base classes biut sizes should be a multiple of 8 bits in size 2492 assert (clang_type_info_bit_size % 8 == 0); 2493 child_byte_size = clang_type_info_bit_size / 8; 2494 child_is_base_class = true; 2495 return base_class->getType().getAsOpaquePtr(); 2496 } 2497 // We don't increment the child index in the for loop since we might 2498 // be skipping empty base classes 2499 ++child_idx; 2500 } 2501 } 2502 // Make sure index is in range... 2503 uint32_t field_idx = 0; 2504 RecordDecl::field_iterator field, field_end; 2505 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx) 2506 { 2507 if (idx == child_idx) 2508 { 2509 // Print the member type if requested 2510 // Print the member name and equal sign 2511 child_name.assign(field->getNameAsString().c_str()); 2512 2513 // Figure out the type byte size (field_type_info.first) and 2514 // alignment (field_type_info.second) from the AST context. 2515 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType()); 2516 assert(field_idx < record_layout.getFieldCount()); 2517 2518 child_byte_size = field_type_info.first / 8; 2519 2520 // Figure out the field offset within the current struct/union/class type 2521 bit_offset = record_layout.getFieldOffset (field_idx); 2522 child_byte_offset = bit_offset / 8; 2523 if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size)) 2524 child_bitfield_bit_offset = bit_offset % 8; 2525 2526 return field->getType().getAsOpaquePtr(); 2527 } 2528 } 2529 } 2530 break; 2531 2532 case clang::Type::ObjCObject: 2533 case clang::Type::ObjCInterface: 2534 if (GetCompleteQualType (ast, parent_qual_type)) 2535 { 2536 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr()); 2537 assert (objc_class_type); 2538 if (objc_class_type) 2539 { 2540 uint32_t child_idx = 0; 2541 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 2542 2543 if (class_interface_decl) 2544 { 2545 2546 const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl); 2547 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 2548 if (superclass_interface_decl) 2549 { 2550 if (omit_empty_base_classes) 2551 { 2552 if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0) 2553 { 2554 if (idx == 0) 2555 { 2556 QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl)); 2557 2558 2559 child_name.assign(superclass_interface_decl->getNameAsString().c_str()); 2560 2561 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 2562 2563 child_byte_size = ivar_type_info.first / 8; 2564 child_byte_offset = 0; 2565 child_is_base_class = true; 2566 2567 return ivar_qual_type.getAsOpaquePtr(); 2568 } 2569 2570 ++child_idx; 2571 } 2572 } 2573 else 2574 ++child_idx; 2575 } 2576 2577 const uint32_t superclass_idx = child_idx; 2578 2579 if (idx < (child_idx + class_interface_decl->ivar_size())) 2580 { 2581 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 2582 2583 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 2584 { 2585 if (child_idx == idx) 2586 { 2587 const ObjCIvarDecl* ivar_decl = *ivar_pos; 2588 2589 QualType ivar_qual_type(ivar_decl->getType()); 2590 2591 child_name.assign(ivar_decl->getNameAsString().c_str()); 2592 2593 std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr()); 2594 2595 child_byte_size = ivar_type_info.first / 8; 2596 2597 // Figure out the field offset within the current struct/union/class type 2598 bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx); 2599 child_byte_offset = bit_offset / 8; 2600 2601 return ivar_qual_type.getAsOpaquePtr(); 2602 } 2603 ++child_idx; 2604 } 2605 } 2606 } 2607 } 2608 } 2609 break; 2610 2611 case clang::Type::ObjCObjectPointer: 2612 { 2613 ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr()); 2614 QualType pointee_type = pointer_type->getPointeeType(); 2615 2616 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2617 { 2618 child_is_deref_of_parent = false; 2619 bool tmp_child_is_deref_of_parent = false; 2620 return GetChildClangTypeAtIndex (ast, 2621 parent_name, 2622 pointer_type->getPointeeType().getAsOpaquePtr(), 2623 idx, 2624 transparent_pointers, 2625 omit_empty_base_classes, 2626 child_name, 2627 child_byte_size, 2628 child_byte_offset, 2629 child_bitfield_bit_size, 2630 child_bitfield_bit_offset, 2631 child_is_base_class, 2632 tmp_child_is_deref_of_parent); 2633 } 2634 else 2635 { 2636 child_is_deref_of_parent = true; 2637 if (parent_name) 2638 { 2639 child_name.assign(1, '*'); 2640 child_name += parent_name; 2641 } 2642 2643 // We have a pointer to an simple type 2644 if (idx == 0) 2645 { 2646 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2647 assert(clang_type_info.first % 8 == 0); 2648 child_byte_size = clang_type_info.first / 8; 2649 child_byte_offset = 0; 2650 return pointee_type.getAsOpaquePtr(); 2651 } 2652 } 2653 } 2654 break; 2655 2656 case clang::Type::ConstantArray: 2657 { 2658 const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 2659 const uint64_t element_count = array->getSize().getLimitedValue(); 2660 2661 if (idx < element_count) 2662 { 2663 if (GetCompleteQualType (ast, array->getElementType())) 2664 { 2665 std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 2666 2667 char element_name[64]; 2668 ::snprintf (element_name, sizeof (element_name), "[%u]", idx); 2669 2670 child_name.assign(element_name); 2671 assert(field_type_info.first % 8 == 0); 2672 child_byte_size = field_type_info.first / 8; 2673 child_byte_offset = idx * child_byte_size; 2674 return array->getElementType().getAsOpaquePtr(); 2675 } 2676 } 2677 } 2678 break; 2679 2680 case clang::Type::Pointer: 2681 { 2682 PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr()); 2683 QualType pointee_type = pointer_type->getPointeeType(); 2684 2685 // Don't dereference "void *" pointers 2686 if (pointee_type->isVoidType()) 2687 return NULL; 2688 2689 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 2690 { 2691 child_is_deref_of_parent = false; 2692 bool tmp_child_is_deref_of_parent = false; 2693 return GetChildClangTypeAtIndex (ast, 2694 parent_name, 2695 pointer_type->getPointeeType().getAsOpaquePtr(), 2696 idx, 2697 transparent_pointers, 2698 omit_empty_base_classes, 2699 child_name, 2700 child_byte_size, 2701 child_byte_offset, 2702 child_bitfield_bit_size, 2703 child_bitfield_bit_offset, 2704 child_is_base_class, 2705 tmp_child_is_deref_of_parent); 2706 } 2707 else 2708 { 2709 child_is_deref_of_parent = true; 2710 2711 if (parent_name) 2712 { 2713 child_name.assign(1, '*'); 2714 child_name += parent_name; 2715 } 2716 2717 // We have a pointer to an simple type 2718 if (idx == 0) 2719 { 2720 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2721 assert(clang_type_info.first % 8 == 0); 2722 child_byte_size = clang_type_info.first / 8; 2723 child_byte_offset = 0; 2724 return pointee_type.getAsOpaquePtr(); 2725 } 2726 } 2727 } 2728 break; 2729 2730 case clang::Type::LValueReference: 2731 case clang::Type::RValueReference: 2732 { 2733 ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr()); 2734 QualType pointee_type(reference_type->getPointeeType()); 2735 clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr(); 2736 if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type)) 2737 { 2738 child_is_deref_of_parent = false; 2739 bool tmp_child_is_deref_of_parent = false; 2740 return GetChildClangTypeAtIndex (ast, 2741 parent_name, 2742 pointee_clang_type, 2743 idx, 2744 transparent_pointers, 2745 omit_empty_base_classes, 2746 child_name, 2747 child_byte_size, 2748 child_byte_offset, 2749 child_bitfield_bit_size, 2750 child_bitfield_bit_offset, 2751 child_is_base_class, 2752 tmp_child_is_deref_of_parent); 2753 } 2754 else 2755 { 2756 if (parent_name) 2757 { 2758 child_name.assign(1, '&'); 2759 child_name += parent_name; 2760 } 2761 2762 // We have a pointer to an simple type 2763 if (idx == 0) 2764 { 2765 std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 2766 assert(clang_type_info.first % 8 == 0); 2767 child_byte_size = clang_type_info.first / 8; 2768 child_byte_offset = 0; 2769 return pointee_type.getAsOpaquePtr(); 2770 } 2771 } 2772 } 2773 break; 2774 2775 case clang::Type::Typedef: 2776 return GetChildClangTypeAtIndex (ast, 2777 parent_name, 2778 cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 2779 idx, 2780 transparent_pointers, 2781 omit_empty_base_classes, 2782 child_name, 2783 child_byte_size, 2784 child_byte_offset, 2785 child_bitfield_bit_size, 2786 child_bitfield_bit_offset, 2787 child_is_base_class, 2788 child_is_deref_of_parent); 2789 break; 2790 2791 default: 2792 break; 2793 } 2794 } 2795 return NULL; 2796} 2797 2798static inline bool 2799BaseSpecifierIsEmpty (const CXXBaseSpecifier *b) 2800{ 2801 return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false; 2802} 2803 2804static uint32_t 2805GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes) 2806{ 2807 uint32_t num_bases = 0; 2808 if (cxx_record_decl) 2809 { 2810 if (omit_empty_base_classes) 2811 { 2812 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 2813 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 2814 base_class != base_class_end; 2815 ++base_class) 2816 { 2817 // Skip empty base classes 2818 if (omit_empty_base_classes) 2819 { 2820 if (BaseSpecifierIsEmpty (base_class)) 2821 continue; 2822 } 2823 ++num_bases; 2824 } 2825 } 2826 else 2827 num_bases = cxx_record_decl->getNumBases(); 2828 } 2829 return num_bases; 2830} 2831 2832 2833static uint32_t 2834GetIndexForRecordBase 2835( 2836 const RecordDecl *record_decl, 2837 const CXXBaseSpecifier *base_spec, 2838 bool omit_empty_base_classes 2839) 2840{ 2841 uint32_t child_idx = 0; 2842 2843 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 2844 2845// const char *super_name = record_decl->getNameAsCString(); 2846// const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString(); 2847// printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name); 2848// 2849 if (cxx_record_decl) 2850 { 2851 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 2852 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 2853 base_class != base_class_end; 2854 ++base_class) 2855 { 2856 if (omit_empty_base_classes) 2857 { 2858 if (BaseSpecifierIsEmpty (base_class)) 2859 continue; 2860 } 2861 2862// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name, 2863// child_idx, 2864// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 2865// 2866// 2867 if (base_class == base_spec) 2868 return child_idx; 2869 ++child_idx; 2870 } 2871 } 2872 2873 return UINT32_MAX; 2874} 2875 2876 2877static uint32_t 2878GetIndexForRecordChild 2879( 2880 const RecordDecl *record_decl, 2881 NamedDecl *canonical_decl, 2882 bool omit_empty_base_classes 2883) 2884{ 2885 uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes); 2886 2887// const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 2888// 2889//// printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString()); 2890// if (cxx_record_decl) 2891// { 2892// CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 2893// for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 2894// base_class != base_class_end; 2895// ++base_class) 2896// { 2897// if (omit_empty_base_classes) 2898// { 2899// if (BaseSpecifierIsEmpty (base_class)) 2900// continue; 2901// } 2902// 2903//// printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", 2904//// record_decl->getNameAsCString(), 2905//// canonical_decl->getNameAsCString(), 2906//// child_idx, 2907//// base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString()); 2908// 2909// 2910// CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 2911// if (curr_base_class_decl == canonical_decl) 2912// { 2913// return child_idx; 2914// } 2915// ++child_idx; 2916// } 2917// } 2918// 2919// const uint32_t num_bases = child_idx; 2920 RecordDecl::field_iterator field, field_end; 2921 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 2922 field != field_end; 2923 ++field, ++child_idx) 2924 { 2925// printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n", 2926// record_decl->getNameAsCString(), 2927// canonical_decl->getNameAsCString(), 2928// child_idx - num_bases, 2929// field->getNameAsCString()); 2930 2931 if (field->getCanonicalDecl() == canonical_decl) 2932 return child_idx; 2933 } 2934 2935 return UINT32_MAX; 2936} 2937 2938// Look for a child member (doesn't include base classes, but it does include 2939// their members) in the type hierarchy. Returns an index path into "clang_type" 2940// on how to reach the appropriate member. 2941// 2942// class A 2943// { 2944// public: 2945// int m_a; 2946// int m_b; 2947// }; 2948// 2949// class B 2950// { 2951// }; 2952// 2953// class C : 2954// public B, 2955// public A 2956// { 2957// }; 2958// 2959// If we have a clang type that describes "class C", and we wanted to looked 2960// "m_b" in it: 2961// 2962// With omit_empty_base_classes == false we would get an integer array back with: 2963// { 1, 1 } 2964// The first index 1 is the child index for "class A" within class C 2965// The second index 1 is the child index for "m_b" within class A 2966// 2967// With omit_empty_base_classes == true we would get an integer array back with: 2968// { 0, 1 } 2969// 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) 2970// The second index 1 is the child index for "m_b" within class A 2971 2972size_t 2973ClangASTContext::GetIndexOfChildMemberWithName 2974( 2975 ASTContext *ast, 2976 clang_type_t clang_type, 2977 const char *name, 2978 bool omit_empty_base_classes, 2979 std::vector<uint32_t>& child_indexes 2980) 2981{ 2982 if (clang_type && name && name[0]) 2983 { 2984 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 2985 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 2986 switch (type_class) 2987 { 2988 case clang::Type::Record: 2989 if (GetCompleteQualType (ast, qual_type)) 2990 { 2991 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 2992 const RecordDecl *record_decl = record_type->getDecl(); 2993 2994 assert(record_decl); 2995 uint32_t child_idx = 0; 2996 2997 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 2998 2999 // Try and find a field that matches NAME 3000 RecordDecl::field_iterator field, field_end; 3001 StringRef name_sref(name); 3002 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 3003 field != field_end; 3004 ++field, ++child_idx) 3005 { 3006 if (field->getName().equals (name_sref)) 3007 { 3008 // We have to add on the number of base classes to this index! 3009 child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes)); 3010 return child_indexes.size(); 3011 } 3012 } 3013 3014 if (cxx_record_decl) 3015 { 3016 const RecordDecl *parent_record_decl = cxx_record_decl; 3017 3018 //printf ("parent = %s\n", parent_record_decl->getNameAsCString()); 3019 3020 //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl(); 3021 // Didn't find things easily, lets let clang do its thang... 3022 IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name)); 3023 DeclarationName decl_name(&ident_ref); 3024 3025 CXXBasePaths paths; 3026 if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember, 3027 decl_name.getAsOpaquePtr(), 3028 paths)) 3029 { 3030 CXXBasePaths::const_paths_iterator path, path_end = paths.end(); 3031 for (path = paths.begin(); path != path_end; ++path) 3032 { 3033 const size_t num_path_elements = path->size(); 3034 for (size_t e=0; e<num_path_elements; ++e) 3035 { 3036 CXXBasePathElement elem = (*path)[e]; 3037 3038 child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes); 3039 if (child_idx == UINT32_MAX) 3040 { 3041 child_indexes.clear(); 3042 return 0; 3043 } 3044 else 3045 { 3046 child_indexes.push_back (child_idx); 3047 parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl()); 3048 } 3049 } 3050 DeclContext::lookup_iterator named_decl_pos; 3051 for (named_decl_pos = path->Decls.first; 3052 named_decl_pos != path->Decls.second && parent_record_decl; 3053 ++named_decl_pos) 3054 { 3055 //printf ("path[%zu] = %s\n", child_indexes.size(), (*named_decl_pos)->getNameAsCString()); 3056 3057 child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes); 3058 if (child_idx == UINT32_MAX) 3059 { 3060 child_indexes.clear(); 3061 return 0; 3062 } 3063 else 3064 { 3065 child_indexes.push_back (child_idx); 3066 } 3067 } 3068 } 3069 return child_indexes.size(); 3070 } 3071 } 3072 3073 } 3074 break; 3075 3076 case clang::Type::ObjCObject: 3077 case clang::Type::ObjCInterface: 3078 if (GetCompleteQualType (ast, qual_type)) 3079 { 3080 StringRef name_sref(name); 3081 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 3082 assert (objc_class_type); 3083 if (objc_class_type) 3084 { 3085 uint32_t child_idx = 0; 3086 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 3087 3088 if (class_interface_decl) 3089 { 3090 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 3091 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 3092 3093 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx) 3094 { 3095 const ObjCIvarDecl* ivar_decl = *ivar_pos; 3096 3097 if (ivar_decl->getName().equals (name_sref)) 3098 { 3099 if ((!omit_empty_base_classes && superclass_interface_decl) || 3100 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 3101 ++child_idx; 3102 3103 child_indexes.push_back (child_idx); 3104 return child_indexes.size(); 3105 } 3106 } 3107 3108 if (superclass_interface_decl) 3109 { 3110 // The super class index is always zero for ObjC classes, 3111 // so we push it onto the child indexes in case we find 3112 // an ivar in our superclass... 3113 child_indexes.push_back (0); 3114 3115 if (GetIndexOfChildMemberWithName (ast, 3116 ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), 3117 name, 3118 omit_empty_base_classes, 3119 child_indexes)) 3120 { 3121 // We did find an ivar in a superclass so just 3122 // return the results! 3123 return child_indexes.size(); 3124 } 3125 3126 // We didn't find an ivar matching "name" in our 3127 // superclass, pop the superclass zero index that 3128 // we pushed on above. 3129 child_indexes.pop_back(); 3130 } 3131 } 3132 } 3133 } 3134 break; 3135 3136 case clang::Type::ObjCObjectPointer: 3137 { 3138 return GetIndexOfChildMemberWithName (ast, 3139 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 3140 name, 3141 omit_empty_base_classes, 3142 child_indexes); 3143 } 3144 break; 3145 3146 3147 case clang::Type::ConstantArray: 3148 { 3149// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 3150// const uint64_t element_count = array->getSize().getLimitedValue(); 3151// 3152// if (idx < element_count) 3153// { 3154// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 3155// 3156// char element_name[32]; 3157// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 3158// 3159// child_name.assign(element_name); 3160// assert(field_type_info.first % 8 == 0); 3161// child_byte_size = field_type_info.first / 8; 3162// child_byte_offset = idx * child_byte_size; 3163// return array->getElementType().getAsOpaquePtr(); 3164// } 3165 } 3166 break; 3167 3168// case clang::Type::MemberPointerType: 3169// { 3170// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 3171// QualType pointee_type = mem_ptr_type->getPointeeType(); 3172// 3173// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3174// { 3175// return GetIndexOfChildWithName (ast, 3176// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 3177// name); 3178// } 3179// } 3180// break; 3181// 3182 case clang::Type::LValueReference: 3183 case clang::Type::RValueReference: 3184 { 3185 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 3186 QualType pointee_type = reference_type->getPointeeType(); 3187 3188 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3189 { 3190 return GetIndexOfChildMemberWithName (ast, 3191 reference_type->getPointeeType().getAsOpaquePtr(), 3192 name, 3193 omit_empty_base_classes, 3194 child_indexes); 3195 } 3196 } 3197 break; 3198 3199 case clang::Type::Pointer: 3200 { 3201 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 3202 QualType pointee_type = pointer_type->getPointeeType(); 3203 3204 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3205 { 3206 return GetIndexOfChildMemberWithName (ast, 3207 pointer_type->getPointeeType().getAsOpaquePtr(), 3208 name, 3209 omit_empty_base_classes, 3210 child_indexes); 3211 } 3212 else 3213 { 3214// if (parent_name) 3215// { 3216// child_name.assign(1, '*'); 3217// child_name += parent_name; 3218// } 3219// 3220// // We have a pointer to an simple type 3221// if (idx == 0) 3222// { 3223// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 3224// assert(clang_type_info.first % 8 == 0); 3225// child_byte_size = clang_type_info.first / 8; 3226// child_byte_offset = 0; 3227// return pointee_type.getAsOpaquePtr(); 3228// } 3229 } 3230 } 3231 break; 3232 3233 case clang::Type::Typedef: 3234 return GetIndexOfChildMemberWithName (ast, 3235 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 3236 name, 3237 omit_empty_base_classes, 3238 child_indexes); 3239 3240 default: 3241 break; 3242 } 3243 } 3244 return 0; 3245} 3246 3247 3248// Get the index of the child of "clang_type" whose name matches. This function 3249// doesn't descend into the children, but only looks one level deep and name 3250// matches can include base class names. 3251 3252uint32_t 3253ClangASTContext::GetIndexOfChildWithName 3254( 3255 ASTContext *ast, 3256 clang_type_t clang_type, 3257 const char *name, 3258 bool omit_empty_base_classes 3259) 3260{ 3261 if (clang_type && name && name[0]) 3262 { 3263 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 3264 3265 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3266 3267 switch (type_class) 3268 { 3269 case clang::Type::Record: 3270 if (GetCompleteQualType (ast, qual_type)) 3271 { 3272 const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr()); 3273 const RecordDecl *record_decl = record_type->getDecl(); 3274 3275 assert(record_decl); 3276 uint32_t child_idx = 0; 3277 3278 const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl); 3279 3280 if (cxx_record_decl) 3281 { 3282 CXXRecordDecl::base_class_const_iterator base_class, base_class_end; 3283 for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); 3284 base_class != base_class_end; 3285 ++base_class) 3286 { 3287 // Skip empty base classes 3288 CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl()); 3289 if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false) 3290 continue; 3291 3292 if (base_class->getType().getAsString().compare (name) == 0) 3293 return child_idx; 3294 ++child_idx; 3295 } 3296 } 3297 3298 // Try and find a field that matches NAME 3299 RecordDecl::field_iterator field, field_end; 3300 StringRef name_sref(name); 3301 for (field = record_decl->field_begin(), field_end = record_decl->field_end(); 3302 field != field_end; 3303 ++field, ++child_idx) 3304 { 3305 if (field->getName().equals (name_sref)) 3306 return child_idx; 3307 } 3308 3309 } 3310 break; 3311 3312 case clang::Type::ObjCObject: 3313 case clang::Type::ObjCInterface: 3314 if (GetCompleteQualType (ast, qual_type)) 3315 { 3316 StringRef name_sref(name); 3317 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr()); 3318 assert (objc_class_type); 3319 if (objc_class_type) 3320 { 3321 uint32_t child_idx = 0; 3322 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 3323 3324 if (class_interface_decl) 3325 { 3326 ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end(); 3327 ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass(); 3328 3329 for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos) 3330 { 3331 const ObjCIvarDecl* ivar_decl = *ivar_pos; 3332 3333 if (ivar_decl->getName().equals (name_sref)) 3334 { 3335 if ((!omit_empty_base_classes && superclass_interface_decl) || 3336 ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true))) 3337 ++child_idx; 3338 3339 return child_idx; 3340 } 3341 } 3342 3343 if (superclass_interface_decl) 3344 { 3345 if (superclass_interface_decl->getName().equals (name_sref)) 3346 return 0; 3347 } 3348 } 3349 } 3350 } 3351 break; 3352 3353 case clang::Type::ObjCObjectPointer: 3354 { 3355 return GetIndexOfChildWithName (ast, 3356 cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(), 3357 name, 3358 omit_empty_base_classes); 3359 } 3360 break; 3361 3362 case clang::Type::ConstantArray: 3363 { 3364// const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr()); 3365// const uint64_t element_count = array->getSize().getLimitedValue(); 3366// 3367// if (idx < element_count) 3368// { 3369// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType()); 3370// 3371// char element_name[32]; 3372// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx); 3373// 3374// child_name.assign(element_name); 3375// assert(field_type_info.first % 8 == 0); 3376// child_byte_size = field_type_info.first / 8; 3377// child_byte_offset = idx * child_byte_size; 3378// return array->getElementType().getAsOpaquePtr(); 3379// } 3380 } 3381 break; 3382 3383// case clang::Type::MemberPointerType: 3384// { 3385// MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr()); 3386// QualType pointee_type = mem_ptr_type->getPointeeType(); 3387// 3388// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3389// { 3390// return GetIndexOfChildWithName (ast, 3391// mem_ptr_type->getPointeeType().getAsOpaquePtr(), 3392// name); 3393// } 3394// } 3395// break; 3396// 3397 case clang::Type::LValueReference: 3398 case clang::Type::RValueReference: 3399 { 3400 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 3401 QualType pointee_type = reference_type->getPointeeType(); 3402 3403 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3404 { 3405 return GetIndexOfChildWithName (ast, 3406 reference_type->getPointeeType().getAsOpaquePtr(), 3407 name, 3408 omit_empty_base_classes); 3409 } 3410 } 3411 break; 3412 3413 case clang::Type::Pointer: 3414 { 3415 PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr()); 3416 QualType pointee_type = pointer_type->getPointeeType(); 3417 3418 if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr())) 3419 { 3420 return GetIndexOfChildWithName (ast, 3421 pointer_type->getPointeeType().getAsOpaquePtr(), 3422 name, 3423 omit_empty_base_classes); 3424 } 3425 else 3426 { 3427// if (parent_name) 3428// { 3429// child_name.assign(1, '*'); 3430// child_name += parent_name; 3431// } 3432// 3433// // We have a pointer to an simple type 3434// if (idx == 0) 3435// { 3436// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type); 3437// assert(clang_type_info.first % 8 == 0); 3438// child_byte_size = clang_type_info.first / 8; 3439// child_byte_offset = 0; 3440// return pointee_type.getAsOpaquePtr(); 3441// } 3442 } 3443 } 3444 break; 3445 3446 case clang::Type::Typedef: 3447 return GetIndexOfChildWithName (ast, 3448 cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 3449 name, 3450 omit_empty_base_classes); 3451 3452 default: 3453 break; 3454 } 3455 } 3456 return UINT32_MAX; 3457} 3458 3459#pragma mark TagType 3460 3461bool 3462ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind) 3463{ 3464 if (tag_clang_type) 3465 { 3466 QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type)); 3467 clang::Type *clang_type = tag_qual_type.getTypePtr(); 3468 if (clang_type) 3469 { 3470 TagType *tag_type = dyn_cast<TagType>(clang_type); 3471 if (tag_type) 3472 { 3473 TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl()); 3474 if (tag_decl) 3475 { 3476 tag_decl->setTagKind ((TagDecl::TagKind)kind); 3477 return true; 3478 } 3479 } 3480 } 3481 } 3482 return false; 3483} 3484 3485 3486#pragma mark DeclContext Functions 3487 3488DeclContext * 3489ClangASTContext::GetDeclContextForType (clang_type_t clang_type) 3490{ 3491 if (clang_type == NULL) 3492 return NULL; 3493 3494 QualType qual_type(QualType::getFromOpaquePtr(clang_type)); 3495 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3496 switch (type_class) 3497 { 3498 case clang::Type::FunctionNoProto: break; 3499 case clang::Type::FunctionProto: break; 3500 case clang::Type::IncompleteArray: break; 3501 case clang::Type::VariableArray: break; 3502 case clang::Type::ConstantArray: break; 3503 case clang::Type::ExtVector: break; 3504 case clang::Type::Vector: break; 3505 case clang::Type::Builtin: break; 3506 case clang::Type::BlockPointer: break; 3507 case clang::Type::Pointer: break; 3508 case clang::Type::LValueReference: break; 3509 case clang::Type::RValueReference: break; 3510 case clang::Type::MemberPointer: break; 3511 case clang::Type::Complex: break; 3512 case clang::Type::ObjCObject: break; 3513 case clang::Type::ObjCInterface: return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface(); 3514 case clang::Type::ObjCObjectPointer: return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr()); 3515 case clang::Type::Record: return cast<RecordType>(qual_type)->getDecl(); 3516 case clang::Type::Enum: return cast<EnumType>(qual_type)->getDecl(); 3517 case clang::Type::Typedef: return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 3518 3519 case clang::Type::TypeOfExpr: break; 3520 case clang::Type::TypeOf: break; 3521 case clang::Type::Decltype: break; 3522 //case clang::Type::QualifiedName: break; 3523 case clang::Type::TemplateSpecialization: break; 3524 } 3525 // No DeclContext in this type... 3526 return NULL; 3527} 3528 3529#pragma mark Namespace Declarations 3530 3531NamespaceDecl * 3532ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declaration &decl, DeclContext *decl_ctx) 3533{ 3534 // TODO: Do something intelligent with the Declaration object passed in 3535 // like maybe filling in the SourceLocation with it... 3536 if (name) 3537 { 3538 ASTContext *ast = getASTContext(); 3539 if (decl_ctx == NULL) 3540 decl_ctx = ast->getTranslationUnitDecl(); 3541 return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), &ast->Idents.get(name)); 3542 } 3543 return NULL; 3544} 3545 3546 3547#pragma mark Function Types 3548 3549FunctionDecl * 3550ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t function_clang_type, int storage, bool is_inline) 3551{ 3552 if (name) 3553 { 3554 ASTContext *ast = getASTContext(); 3555 assert (ast != NULL); 3556 3557 if (name && name[0]) 3558 { 3559 return FunctionDecl::Create(*ast, 3560 ast->getTranslationUnitDecl(), 3561 SourceLocation(), 3562 DeclarationName (&ast->Idents.get(name)), 3563 QualType::getFromOpaquePtr(function_clang_type), 3564 NULL, 3565 (FunctionDecl::StorageClass)storage, 3566 (FunctionDecl::StorageClass)storage, 3567 is_inline); 3568 } 3569 else 3570 { 3571 return FunctionDecl::Create(*ast, 3572 ast->getTranslationUnitDecl(), 3573 SourceLocation(), 3574 DeclarationName (), 3575 QualType::getFromOpaquePtr(function_clang_type), 3576 NULL, 3577 (FunctionDecl::StorageClass)storage, 3578 (FunctionDecl::StorageClass)storage, 3579 is_inline); 3580 } 3581 } 3582 return NULL; 3583} 3584 3585clang_type_t 3586ClangASTContext::CreateFunctionType (ASTContext *ast, 3587 clang_type_t result_type, 3588 clang_type_t *args, 3589 unsigned num_args, 3590 bool is_variadic, 3591 unsigned type_quals) 3592{ 3593 assert (ast != NULL); 3594 std::vector<QualType> qual_type_args; 3595 for (unsigned i=0; i<num_args; ++i) 3596 qual_type_args.push_back (QualType::getFromOpaquePtr(args[i])); 3597 3598 // TODO: Detect calling convention in DWARF? 3599 FunctionProtoType::ExtProtoInfo proto_info; 3600 proto_info.Variadic = is_variadic; 3601 proto_info.HasExceptionSpec = false; 3602 proto_info.HasAnyExceptionSpec = false; 3603 proto_info.TypeQuals = type_quals; 3604 proto_info.NumExceptions = 0; 3605 proto_info.Exceptions = NULL; 3606 3607 return ast->getFunctionType(QualType::getFromOpaquePtr(result_type), 3608 qual_type_args.empty() ? NULL : &qual_type_args.front(), 3609 qual_type_args.size(), 3610 proto_info).getAsOpaquePtr(); // NoReturn); 3611} 3612 3613ParmVarDecl * 3614ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage) 3615{ 3616 ASTContext *ast = getASTContext(); 3617 assert (ast != NULL); 3618 return ParmVarDecl::Create(*ast, 3619 ast->getTranslationUnitDecl(), 3620 SourceLocation(), 3621 name && name[0] ? &ast->Idents.get(name) : NULL, 3622 QualType::getFromOpaquePtr(param_type), 3623 NULL, 3624 (VarDecl::StorageClass)storage, 3625 (VarDecl::StorageClass)storage, 3626 0); 3627} 3628 3629void 3630ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params) 3631{ 3632 if (function_decl) 3633 function_decl->setParams (params, num_params); 3634} 3635 3636 3637#pragma mark Array Types 3638 3639clang_type_t 3640ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride) 3641{ 3642 if (element_type) 3643 { 3644 ASTContext *ast = getASTContext(); 3645 assert (ast != NULL); 3646 llvm::APInt ap_element_count (64, element_count); 3647 return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type), 3648 ap_element_count, 3649 ArrayType::Normal, 3650 0).getAsOpaquePtr(); // ElemQuals 3651 } 3652 return NULL; 3653} 3654 3655 3656#pragma mark TagDecl 3657 3658bool 3659ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type) 3660{ 3661 if (clang_type) 3662 { 3663 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3664 clang::Type *t = qual_type.getTypePtr(); 3665 if (t) 3666 { 3667 TagType *tag_type = dyn_cast<TagType>(t); 3668 if (tag_type) 3669 { 3670 TagDecl *tag_decl = tag_type->getDecl(); 3671 if (tag_decl) 3672 { 3673 tag_decl->startDefinition(); 3674 return true; 3675 } 3676 } 3677 } 3678 } 3679 return false; 3680} 3681 3682bool 3683ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type) 3684{ 3685 if (clang_type) 3686 { 3687 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3688 3689 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 3690 3691 if (cxx_record_decl) 3692 { 3693 cxx_record_decl->completeDefinition(); 3694 3695 return true; 3696 } 3697 3698 ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type); 3699 3700 if (objc_class_type) 3701 { 3702 ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface(); 3703 3704 class_interface_decl->setForwardDecl(false); 3705 } 3706 3707 const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr()); 3708 3709 if (enum_type) 3710 { 3711 EnumDecl *enum_decl = enum_type->getDecl(); 3712 3713 if (enum_decl) 3714 { 3715 /// TODO This really needs to be fixed. 3716 3717 unsigned NumPositiveBits = 1; 3718 unsigned NumNegativeBits = 0; 3719 3720 ASTContext *ast = getASTContext(); 3721 3722 QualType promotion_qual_type; 3723 // If the enum integer type is less than an integer in bit width, 3724 // then we must promote it to an integer size. 3725 if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy)) 3726 { 3727 if (enum_decl->getIntegerType()->isSignedIntegerType()) 3728 promotion_qual_type = ast->IntTy; 3729 else 3730 promotion_qual_type = ast->UnsignedIntTy; 3731 } 3732 else 3733 promotion_qual_type = enum_decl->getIntegerType(); 3734 3735 enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits); 3736 return true; 3737 } 3738 } 3739 } 3740 return false; 3741} 3742 3743 3744#pragma mark Enumeration Types 3745 3746clang_type_t 3747ClangASTContext::CreateEnumerationType 3748( 3749 const char *name, 3750 DeclContext *decl_ctx, 3751 const Declaration &decl, 3752 clang_type_t integer_qual_type 3753) 3754{ 3755 // TODO: Do something intelligent with the Declaration object passed in 3756 // like maybe filling in the SourceLocation with it... 3757 ASTContext *ast = getASTContext(); 3758 assert (ast != NULL); 3759 3760 // TODO: ask about these... 3761// const bool IsScoped = false; 3762// const bool IsFixed = false; 3763 3764 EnumDecl *enum_decl = EnumDecl::Create (*ast, 3765 decl_ctx, 3766 SourceLocation(), 3767 name && name[0] ? &ast->Idents.get(name) : NULL, 3768 SourceLocation(), 3769 NULL, 3770 false, // IsScoped 3771 false, // IsScopedUsingClassTag 3772 false); // IsFixed 3773 3774 3775 if (enum_decl) 3776 { 3777 // TODO: check if we should be setting the promotion type too? 3778 enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type)); 3779 3780 enum_decl->setAccess(AS_public); // TODO respect what's in the debug info 3781 3782 return ast->getTagDeclType(enum_decl).getAsOpaquePtr(); 3783 } 3784 return NULL; 3785} 3786 3787clang_type_t 3788ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type) 3789{ 3790 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3791 3792 clang::Type *clang_type = enum_qual_type.getTypePtr(); 3793 if (clang_type) 3794 { 3795 const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3796 if (enum_type) 3797 { 3798 EnumDecl *enum_decl = enum_type->getDecl(); 3799 if (enum_decl) 3800 return enum_decl->getIntegerType().getAsOpaquePtr(); 3801 } 3802 } 3803 return NULL; 3804} 3805bool 3806ClangASTContext::AddEnumerationValueToEnumerationType 3807( 3808 clang_type_t enum_clang_type, 3809 clang_type_t enumerator_clang_type, 3810 const Declaration &decl, 3811 const char *name, 3812 int64_t enum_value, 3813 uint32_t enum_value_bit_size 3814) 3815{ 3816 if (enum_clang_type && enumerator_clang_type && name) 3817 { 3818 // TODO: Do something intelligent with the Declaration object passed in 3819 // like maybe filling in the SourceLocation with it... 3820 ASTContext *ast = getASTContext(); 3821 IdentifierTable *identifier_table = getIdentifierTable(); 3822 3823 assert (ast != NULL); 3824 assert (identifier_table != NULL); 3825 QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type)); 3826 3827 clang::Type *clang_type = enum_qual_type.getTypePtr(); 3828 if (clang_type) 3829 { 3830 const EnumType *enum_type = dyn_cast<EnumType>(clang_type); 3831 3832 if (enum_type) 3833 { 3834 llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false); 3835 enum_llvm_apsint = enum_value; 3836 EnumConstantDecl *enumerator_decl = 3837 EnumConstantDecl::Create (*ast, 3838 enum_type->getDecl(), 3839 SourceLocation(), 3840 name ? &identifier_table->get(name) : NULL, // Identifier 3841 QualType::getFromOpaquePtr(enumerator_clang_type), 3842 NULL, 3843 enum_llvm_apsint); 3844 3845 if (enumerator_decl) 3846 { 3847 enum_type->getDecl()->addDecl(enumerator_decl); 3848 return true; 3849 } 3850 } 3851 } 3852 } 3853 return false; 3854} 3855 3856#pragma mark Pointers & References 3857 3858clang_type_t 3859ClangASTContext::CreatePointerType (clang_type_t clang_type) 3860{ 3861 return CreatePointerType (getASTContext(), clang_type); 3862} 3863 3864clang_type_t 3865ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type) 3866{ 3867 if (ast && clang_type) 3868 { 3869 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3870 3871 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3872 switch (type_class) 3873 { 3874 case clang::Type::ObjCObject: 3875 case clang::Type::ObjCInterface: 3876 return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr(); 3877 3878 default: 3879 return ast->getPointerType(qual_type).getAsOpaquePtr(); 3880 } 3881 } 3882 return NULL; 3883} 3884 3885clang_type_t 3886ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast, 3887 clang_type_t clang_type) 3888{ 3889 if (clang_type) 3890 return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 3891 return NULL; 3892} 3893 3894clang_type_t 3895ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast, 3896 clang_type_t clang_type) 3897{ 3898 if (clang_type) 3899 return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr(); 3900 return NULL; 3901} 3902 3903clang_type_t 3904ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type) 3905{ 3906 if (clang_pointee_type && clang_pointee_type) 3907 return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type), 3908 QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr(); 3909 return NULL; 3910} 3911 3912size_t 3913ClangASTContext::GetPointerBitSize () 3914{ 3915 ASTContext *ast = getASTContext(); 3916 return ast->getTypeSize(ast->VoidPtrTy); 3917} 3918 3919bool 3920ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type) 3921{ 3922 if (clang_type == NULL) 3923 return false; 3924 3925 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3926 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3927 switch (type_class) 3928 { 3929 case clang::Type::Builtin: 3930 switch (cast<clang::BuiltinType>(qual_type)->getKind()) 3931 { 3932 default: 3933 break; 3934 case clang::BuiltinType::ObjCId: 3935 case clang::BuiltinType::ObjCClass: 3936 return true; 3937 } 3938 return false; 3939 case clang::Type::ObjCObjectPointer: 3940 if (target_type) 3941 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 3942 return true; 3943 case clang::Type::BlockPointer: 3944 if (target_type) 3945 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 3946 return true; 3947 case clang::Type::Pointer: 3948 if (target_type) 3949 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 3950 return true; 3951 case clang::Type::MemberPointer: 3952 if (target_type) 3953 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 3954 return true; 3955 case clang::Type::LValueReference: 3956 if (target_type) 3957 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 3958 return true; 3959 case clang::Type::RValueReference: 3960 if (target_type) 3961 *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr(); 3962 return true; 3963 case clang::Type::Typedef: 3964 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 3965 default: 3966 break; 3967 } 3968 return false; 3969} 3970 3971bool 3972ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed) 3973{ 3974 if (!clang_type) 3975 return false; 3976 3977 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3978 const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()); 3979 3980 if (builtin_type) 3981 { 3982 if (builtin_type->isInteger()) 3983 is_signed = builtin_type->isSignedInteger(); 3984 3985 return true; 3986 } 3987 3988 return false; 3989} 3990 3991bool 3992ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t*target_type) 3993{ 3994 if (clang_type) 3995 { 3996 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 3997 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 3998 switch (type_class) 3999 { 4000 case clang::Type::Builtin: 4001 switch (cast<clang::BuiltinType>(qual_type)->getKind()) 4002 { 4003 default: 4004 break; 4005 case clang::BuiltinType::ObjCId: 4006 case clang::BuiltinType::ObjCClass: 4007 return true; 4008 } 4009 return false; 4010 case clang::Type::ObjCObjectPointer: 4011 if (target_type) 4012 *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4013 return true; 4014 case clang::Type::BlockPointer: 4015 if (target_type) 4016 *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4017 return true; 4018 case clang::Type::Pointer: 4019 if (target_type) 4020 *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4021 return true; 4022 case clang::Type::MemberPointer: 4023 if (target_type) 4024 *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr(); 4025 return true; 4026 case clang::Type::Typedef: 4027 return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type); 4028 default: 4029 break; 4030 } 4031 } 4032 return false; 4033} 4034 4035bool 4036ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex) 4037{ 4038 if (clang_type) 4039 { 4040 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4041 4042 if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal())) 4043 { 4044 clang::BuiltinType::Kind kind = BT->getKind(); 4045 if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble) 4046 { 4047 count = 1; 4048 is_complex = false; 4049 return true; 4050 } 4051 } 4052 else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal())) 4053 { 4054 if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex)) 4055 { 4056 count = 2; 4057 is_complex = true; 4058 return true; 4059 } 4060 } 4061 else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal())) 4062 { 4063 if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex)) 4064 { 4065 count = VT->getNumElements(); 4066 is_complex = false; 4067 return true; 4068 } 4069 } 4070 } 4071 return false; 4072} 4073 4074 4075bool 4076ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name) 4077{ 4078 if (clang_type) 4079 { 4080 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4081 4082 CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl(); 4083 if (cxx_record_decl) 4084 { 4085 class_name.assign (cxx_record_decl->getIdentifier()->getNameStart()); 4086 return true; 4087 } 4088 } 4089 class_name.clear(); 4090 return false; 4091} 4092 4093 4094bool 4095ClangASTContext::IsCXXClassType (clang_type_t clang_type) 4096{ 4097 if (clang_type) 4098 { 4099 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4100 if (qual_type->getAsCXXRecordDecl() != NULL) 4101 return true; 4102 } 4103 return false; 4104} 4105 4106bool 4107ClangASTContext::IsObjCClassType (clang_type_t clang_type) 4108{ 4109 if (clang_type) 4110 { 4111 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4112 if (qual_type->isObjCObjectOrInterfaceType()) 4113 return true; 4114 } 4115 return false; 4116} 4117 4118 4119bool 4120ClangASTContext::IsCharType (clang_type_t clang_type) 4121{ 4122 if (clang_type) 4123 return QualType::getFromOpaquePtr(clang_type)->isCharType(); 4124 return false; 4125} 4126 4127bool 4128ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length) 4129{ 4130 clang_type_t pointee_or_element_clang_type = NULL; 4131 Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type)); 4132 4133 if (pointee_or_element_clang_type == NULL) 4134 return false; 4135 4136 if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer)) 4137 { 4138 QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type)); 4139 4140 if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType()) 4141 { 4142 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4143 if (type_flags.Test (eTypeIsArray)) 4144 { 4145 // We know the size of the array and it could be a C string 4146 // since it is an array of characters 4147 length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue(); 4148 return true; 4149 } 4150 else 4151 { 4152 length = 0; 4153 return true; 4154 } 4155 4156 } 4157 } 4158 return false; 4159} 4160 4161bool 4162ClangASTContext::IsFunctionPointerType (clang_type_t clang_type) 4163{ 4164 if (clang_type) 4165 { 4166 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4167 4168 if (qual_type->isFunctionPointerType()) 4169 return true; 4170 4171 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 4172 switch (type_class) 4173 { 4174 case clang::Type::Typedef: 4175 return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr()); 4176 4177 case clang::Type::LValueReference: 4178 case clang::Type::RValueReference: 4179 { 4180 ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr()); 4181 if (reference_type) 4182 return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr()); 4183 } 4184 break; 4185 } 4186 } 4187 return false; 4188} 4189 4190size_t 4191ClangASTContext::GetArraySize (clang_type_t clang_type) 4192{ 4193 if (clang_type) 4194 { 4195 ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr()); 4196 if (array) 4197 return array->getSize().getLimitedValue(); 4198 } 4199 return 0; 4200} 4201 4202bool 4203ClangASTContext::IsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size) 4204{ 4205 if (!clang_type) 4206 return false; 4207 4208 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4209 4210 const clang::Type::TypeClass type_class = qual_type->getTypeClass(); 4211 switch (type_class) 4212 { 4213 case clang::Type::ConstantArray: 4214 if (member_type) 4215 *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 4216 if (size) 4217 *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULONG_LONG_MAX); 4218 return true; 4219 case clang::Type::IncompleteArray: 4220 if (member_type) 4221 *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 4222 if (size) 4223 *size = 0; 4224 return true; 4225 case clang::Type::VariableArray: 4226 if (member_type) 4227 *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 4228 if (size) 4229 *size = 0; 4230 case clang::Type::DependentSizedArray: 4231 if (member_type) 4232 *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr(); 4233 if (size) 4234 *size = 0; 4235 return true; 4236 } 4237 return false; 4238} 4239 4240 4241#pragma mark Typedefs 4242 4243clang_type_t 4244ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx) 4245{ 4246 if (clang_type) 4247 { 4248 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4249 ASTContext *ast = getASTContext(); 4250 IdentifierTable *identifier_table = getIdentifierTable(); 4251 assert (ast != NULL); 4252 assert (identifier_table != NULL); 4253 if (decl_ctx == NULL) 4254 decl_ctx = ast->getTranslationUnitDecl(); 4255 TypedefDecl *decl = TypedefDecl::Create (*ast, 4256 decl_ctx, 4257 SourceLocation(), 4258 name ? &identifier_table->get(name) : NULL, // Identifier 4259 ast->CreateTypeSourceInfo(qual_type)); 4260 4261 decl->setAccess(AS_public); // TODO respect proper access specifier 4262 4263 // Get a uniqued QualType for the typedef decl type 4264 return ast->getTypedefType (decl).getAsOpaquePtr(); 4265 } 4266 return NULL; 4267} 4268 4269 4270std::string 4271ClangASTContext::GetTypeName (clang_type_t opaque_qual_type) 4272{ 4273 std::string return_name; 4274 4275 QualType qual_type(QualType::getFromOpaquePtr(opaque_qual_type)); 4276 4277 const TypedefType *typedef_type = qual_type->getAs<TypedefType>(); 4278 if (typedef_type) 4279 { 4280 const TypedefDecl *typedef_decl = typedef_type->getDecl(); 4281 return_name = typedef_decl->getQualifiedNameAsString(); 4282 } 4283 else 4284 { 4285 return_name = qual_type.getAsString(); 4286 } 4287 4288 return return_name; 4289} 4290 4291// Disable this for now since I can't seem to get a nicely formatted float 4292// out of the APFloat class without just getting the float, double or quad 4293// and then using a formatted print on it which defeats the purpose. We ideally 4294// would like to get perfect string values for any kind of float semantics 4295// so we can support remote targets. The code below also requires a patch to 4296// llvm::APInt. 4297//bool 4298//ClangASTContext::ConvertFloatValueToString (ASTContext *ast, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str) 4299//{ 4300// uint32_t count = 0; 4301// bool is_complex = false; 4302// if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 4303// { 4304// unsigned num_bytes_per_float = byte_size / count; 4305// unsigned num_bits_per_float = num_bytes_per_float * 8; 4306// 4307// float_str.clear(); 4308// uint32_t i; 4309// for (i=0; i<count; i++) 4310// { 4311// APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order); 4312// bool is_ieee = false; 4313// APFloat ap_float(ap_int, is_ieee); 4314// char s[1024]; 4315// unsigned int hex_digits = 0; 4316// bool upper_case = false; 4317// 4318// if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0) 4319// { 4320// if (i > 0) 4321// float_str.append(", "); 4322// float_str.append(s); 4323// if (i == 1 && is_complex) 4324// float_str.append(1, 'i'); 4325// } 4326// } 4327// return !float_str.empty(); 4328// } 4329// return false; 4330//} 4331 4332size_t 4333ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size) 4334{ 4335 if (clang_type) 4336 { 4337 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4338 uint32_t count = 0; 4339 bool is_complex = false; 4340 if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex)) 4341 { 4342 // TODO: handle complex and vector types 4343 if (count != 1) 4344 return false; 4345 4346 StringRef s_sref(s); 4347 APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref); 4348 4349 const uint64_t bit_size = ast->getTypeSize (qual_type); 4350 const uint64_t byte_size = bit_size / 8; 4351 if (dst_size >= byte_size) 4352 { 4353 if (bit_size == sizeof(float)*8) 4354 { 4355 float float32 = ap_float.convertToFloat(); 4356 ::memcpy (dst, &float32, byte_size); 4357 return byte_size; 4358 } 4359 else if (bit_size >= 64) 4360 { 4361 llvm::APInt ap_int(ap_float.bitcastToAPInt()); 4362 ::memcpy (dst, ap_int.getRawData(), byte_size); 4363 return byte_size; 4364 } 4365 } 4366 } 4367 } 4368 return 0; 4369} 4370 4371unsigned 4372ClangASTContext::GetTypeQualifiers(clang_type_t clang_type) 4373{ 4374 assert (clang_type); 4375 4376 QualType qual_type (QualType::getFromOpaquePtr(clang_type)); 4377 4378 return qual_type.getQualifiers().getCVRQualifiers(); 4379} 4380 4381bool 4382ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type) 4383{ 4384 if (clang_type == NULL) 4385 return false; 4386 4387 return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)); 4388} 4389 4390 4391bool 4392ClangASTContext::GetCompleteType (clang_type_t clang_type) 4393{ 4394 return ClangASTContext::GetCompleteType (getASTContext(), clang_type); 4395} 4396 4397