blob: 11b67c3640481b60f49b6002ff6d81145329e4e0 [file] [log] [blame]
//===-- ClangASTContext.h ---------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef liblldb_ClangASTContext_h_
#define liblldb_ClangASTContext_h_
// C Includes
// C++ Includes
#include <string>
#include <vector>
#include <memory>
#include <stdint.h>
// Other libraries and framework includes
#include "llvm/ADT/OwningPtr.h"
#include "llvm/ADT/SmallVector.h"
#include "clang/AST/TemplateBase.h"
// Project includes
#include "lldb/lldb-enumerations.h"
#include "lldb/Core/ClangForward.h"
#include "lldb/Symbol/ClangASTType.h"
namespace lldb_private {
class Declaration;
class ClangASTContext
{
public:
enum {
eTypeHasChildren = (1u << 0),
eTypeHasValue = (1u << 1),
eTypeIsArray = (1u << 2),
eTypeIsBlock = (1u << 3),
eTypeIsBuiltIn = (1u << 4),
eTypeIsClass = (1u << 5),
eTypeIsCPlusPlus = (1u << 6),
eTypeIsEnumeration = (1u << 7),
eTypeIsFuncPrototype = (1u << 8),
eTypeIsMember = (1u << 9),
eTypeIsObjC = (1u << 10),
eTypeIsPointer = (1u << 11),
eTypeIsReference = (1u << 12),
eTypeIsStructUnion = (1u << 13),
eTypeIsTemplate = (1u << 14),
eTypeIsTypedef = (1u << 15),
eTypeIsVector = (1u << 16),
eTypeIsScalar = (1u << 17)
};
typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *);
typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *);
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
ClangASTContext (const char *triple = NULL);
~ClangASTContext();
clang::ASTContext *
getASTContext();
clang::Builtin::Context *
getBuiltinContext();
clang::IdentifierTable *
getIdentifierTable();
clang::LangOptions *
getLanguageOptions();
clang::SelectorTable *
getSelectorTable();
clang::FileManager *
getFileManager();
clang::SourceManager *
getSourceManager();
clang::DiagnosticsEngine *
getDiagnosticsEngine();
clang::DiagnosticConsumer *
getDiagnosticConsumer();
clang::TargetOptions *
getTargetOptions();
clang::TargetInfo *
getTargetInfo();
void
Clear();
const char *
GetTargetTriple ();
void
SetTargetTriple (const char *target_triple);
void
SetArchitecture (const ArchSpec &arch);
bool
HasExternalSource ();
void
SetExternalSource (llvm::OwningPtr<clang::ExternalASTSource> &ast_source_ap);
void
RemoveExternalSource ();
bool
GetCompleteType (lldb::clang_type_t clang_type);
static bool
GetCompleteType (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
bool
IsCompleteType (lldb::clang_type_t clang_type);
static bool
IsCompleteType (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
bool
GetCompleteDecl (clang::Decl *decl)
{
return ClangASTContext::GetCompleteDecl(getASTContext(), decl);
}
static bool
GetCompleteDecl (clang::ASTContext *ast,
clang::Decl *decl);
void SetMetadata (uintptr_t object,
uint64_t metadata)
{
SetMetadata(getASTContext(), object, metadata);
}
static void
SetMetadata (clang::ASTContext *ast,
uintptr_t object,
uint64_t metadata);
uint64_t GetMetadata (uintptr_t object)
{
return GetMetadata(getASTContext(), object);
}
static uint64_t
GetMetadata (clang::ASTContext *ast,
uintptr_t object);
//------------------------------------------------------------------
// Basic Types
//------------------------------------------------------------------
lldb::clang_type_t
GetBuiltinTypeForEncodingAndBitSize (lldb::Encoding encoding,
uint32_t bit_size);
static lldb::clang_type_t
GetBuiltinTypeForEncodingAndBitSize (clang::ASTContext *ast,
lldb::Encoding encoding,
uint32_t bit_size);
lldb::clang_type_t
GetBuiltinTypeForDWARFEncodingAndBitSize (
const char *type_name,
uint32_t dw_ate,
uint32_t bit_size);
static lldb::clang_type_t
GetBuiltInType_void(clang::ASTContext *ast);
lldb::clang_type_t
GetBuiltInType_void()
{
return GetBuiltInType_void(getASTContext());
}
lldb::clang_type_t
GetBuiltInType_bool();
lldb::clang_type_t
GetBuiltInType_objc_id();
lldb::clang_type_t
GetBuiltInType_objc_Class();
static lldb::clang_type_t
GetUnknownAnyType(clang::ASTContext *ast);
lldb::clang_type_t
GetUnknownAnyType()
{
return ClangASTContext::GetUnknownAnyType(getASTContext());
}
lldb::clang_type_t
GetBuiltInType_objc_selector();
lldb::clang_type_t
GetCStringType(bool is_const);
lldb::clang_type_t
GetVoidType();
lldb::clang_type_t
GetVoidType(clang::ASTContext *ast);
lldb::clang_type_t
GetVoidPtrType(bool is_const);
static lldb::clang_type_t
GetVoidPtrType(clang::ASTContext *ast, bool is_const);
static clang::DeclContext *
GetTranslationUnitDecl (clang::ASTContext *ast);
clang::DeclContext *
GetTranslationUnitDecl ()
{
return GetTranslationUnitDecl (getASTContext());
}
static lldb::clang_type_t
CopyType(clang::ASTContext *dest_context,
clang::ASTContext *source_context,
lldb::clang_type_t clang_type);
static clang::Decl *
CopyDecl (clang::ASTContext *dest_context,
clang::ASTContext *source_context,
clang::Decl *source_decl);
static bool
AreTypesSame(clang::ASTContext *ast,
lldb::clang_type_t type1,
lldb::clang_type_t type2,
bool ignore_qualifiers = false);
bool
AreTypesSame(lldb::clang_type_t type1,
lldb::clang_type_t type2,
bool ignore_qualifiers = false)
{
return ClangASTContext::AreTypesSame(getASTContext(), type1, type2, ignore_qualifiers);
}
lldb::clang_type_t
GetTypeForDecl (clang::TagDecl *decl);
lldb::clang_type_t
GetTypeForDecl (clang::ObjCInterfaceDecl *objc_decl);
//------------------------------------------------------------------
// CVR modifiers
//------------------------------------------------------------------
static lldb::clang_type_t
AddConstModifier (lldb::clang_type_t clang_type);
static lldb::clang_type_t
AddRestrictModifier (lldb::clang_type_t clang_type);
static lldb::clang_type_t
AddVolatileModifier (lldb::clang_type_t clang_type);
//------------------------------------------------------------------
// Structure, Unions, Classes
//------------------------------------------------------------------
lldb::clang_type_t
CreateRecordType (clang::DeclContext *decl_ctx,
lldb::AccessType access_type,
const char *name,
int kind,
lldb::LanguageType language,
uint64_t metadata = 0);
static clang::FieldDecl *
AddFieldToRecordType (clang::ASTContext *ast,
lldb::clang_type_t record_qual_type,
const char *name,
lldb::clang_type_t field_type,
lldb::AccessType access,
uint32_t bitfield_bit_size);
clang::FieldDecl *
AddFieldToRecordType (lldb::clang_type_t record_qual_type,
const char *name,
lldb::clang_type_t field_type,
lldb::AccessType access,
uint32_t bitfield_bit_size)
{
return ClangASTContext::AddFieldToRecordType (getASTContext(),
record_qual_type,
name,
field_type,
access,
bitfield_bit_size);
}
static void
BuildIndirectFields (clang::ASTContext *ast,
lldb::clang_type_t record_qual_type);
void
BuildIndirectFields (lldb::clang_type_t record_qual_type)
{
ClangASTContext::BuildIndirectFields(getASTContext(),
record_qual_type);
}
static clang::CXXMethodDecl *
AddMethodToCXXRecordType (clang::ASTContext *ast,
lldb::clang_type_t record_opaque_type,
const char *name,
lldb::clang_type_t method_type,
lldb::AccessType access,
bool is_virtual,
bool is_static,
bool is_inline,
bool is_explicit,
bool is_attr_used,
bool is_artificial);
clang::CXXMethodDecl *
AddMethodToCXXRecordType (lldb::clang_type_t record_opaque_type,
const char *name,
lldb::clang_type_t method_type,
lldb::AccessType access,
bool is_virtual,
bool is_static,
bool is_inline,
bool is_explicit,
bool is_attr_used,
bool is_artificial)
{
return ClangASTContext::AddMethodToCXXRecordType (getASTContext(),
record_opaque_type,
name,
method_type,
access,
is_virtual,
is_static,
is_inline,
is_explicit,
is_attr_used,
is_artificial);
}
class TemplateParameterInfos
{
public:
bool
IsValid() const
{
if (args.empty())
return false;
return args.size() == names.size();
}
size_t
GetSize () const
{
if (IsValid())
return args.size();
return 0;
}
llvm::SmallVector<const char *, 8> names;
llvm::SmallVector<clang::TemplateArgument, 8> args;
};
clang::FunctionTemplateDecl *
CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
clang::FunctionDecl *func_decl,
const char *name,
const TemplateParameterInfos &infos);
void
CreateFunctionTemplateSpecializationInfo (clang::FunctionDecl *func_decl,
clang::FunctionTemplateDecl *Template,
const TemplateParameterInfos &infos);
clang::ClassTemplateDecl *
CreateClassTemplateDecl (clang::DeclContext *decl_ctx,
lldb::AccessType access_type,
const char *class_name,
int kind,
const TemplateParameterInfos &infos);
clang::ClassTemplateSpecializationDecl *
CreateClassTemplateSpecializationDecl (clang::DeclContext *decl_ctx,
clang::ClassTemplateDecl *class_template_decl,
int kind,
const TemplateParameterInfos &infos);
lldb::clang_type_t
CreateClassTemplateSpecializationType (clang::ClassTemplateSpecializationDecl *class_template_specialization_decl);
static clang::DeclContext *
GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl);
static clang::DeclContext *
GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl);
static bool
CheckOverloadedOperatorKindParameterCount (uint32_t op_kind,
uint32_t num_params);
bool
FieldIsBitfield (clang::FieldDecl* field,
uint32_t& bitfield_bit_size);
static bool
FieldIsBitfield (clang::ASTContext *ast,
clang::FieldDecl* field,
uint32_t& bitfield_bit_size);
static bool
RecordHasFields (const clang::RecordDecl *record_decl);
void
SetDefaultAccessForRecordFields (lldb::clang_type_t clang_type,
int default_accessibility,
int *assigned_accessibilities,
size_t num_assigned_accessibilities);
lldb::clang_type_t
CreateObjCClass (const char *name,
clang::DeclContext *decl_ctx,
bool isForwardDecl,
bool isInternal,
uint64_t metadata = 0);
static clang::FieldDecl *
AddObjCClassIVar (clang::ASTContext *ast,
lldb::clang_type_t class_opaque_type,
const char *name,
lldb::clang_type_t ivar_opaque_type,
lldb::AccessType access,
uint32_t bitfield_bit_size,
bool isSynthesized);
clang::FieldDecl *
AddObjCClassIVar (lldb::clang_type_t class_opaque_type,
const char *name,
lldb::clang_type_t ivar_opaque_type,
lldb::AccessType access,
uint32_t bitfield_bit_size,
bool isSynthesized)
{
return ClangASTContext::AddObjCClassIVar (getASTContext(),
class_opaque_type,
name,
ivar_opaque_type,
access,
bitfield_bit_size,
isSynthesized);
}
static bool
AddObjCClassProperty
(
clang::ASTContext *ast,
lldb::clang_type_t class_opaque_type,
const char *property_name,
lldb::clang_type_t property_opaque_type, // The property type is only required if you don't have an ivar decl
clang::ObjCIvarDecl *ivar_decl,
const char *property_setter_name,
const char *property_getter_name,
uint32_t property_attributes,
uint64_t metadata = 0
);
bool
AddObjCClassProperty
(
lldb::clang_type_t class_opaque_type,
const char *property_name,
lldb::clang_type_t property_opaque_type,
clang::ObjCIvarDecl *ivar_decl,
const char *property_setter_name,
const char *property_getter_name,
uint32_t property_attributes,
uint64_t metadata = 0
)
{
return ClangASTContext::AddObjCClassProperty (getASTContext(),
class_opaque_type,
property_name,
property_opaque_type,
ivar_decl,
property_setter_name,
property_getter_name,
property_attributes,
metadata);
}
bool
SetObjCSuperClass (lldb::clang_type_t class_clang_type,
lldb::clang_type_t superclass_clang_type);
static bool
ObjCTypeHasIVars (lldb::clang_type_t class_clang_type, bool check_superclass);
static bool
ObjCDeclHasIVars (clang::ObjCInterfaceDecl *class_interface_decl,
bool check_superclass);
static clang::ObjCMethodDecl *
AddMethodToObjCObjectType (clang::ASTContext *ast,
lldb::clang_type_t class_opaque_type,
const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
lldb::clang_type_t method_opaque_type,
lldb::AccessType access);
clang::ObjCMethodDecl *
AddMethodToObjCObjectType (lldb::clang_type_t class_opaque_type,
const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
lldb::clang_type_t method_opaque_type,
lldb::AccessType access)
{
return AddMethodToObjCObjectType (getASTContext(),
class_opaque_type,
name,
method_opaque_type,
access);
}
static bool
SetHasExternalStorage (lldb::clang_type_t clang_type, bool has_extern);
//------------------------------------------------------------------
// Aggregate Types
//------------------------------------------------------------------
static bool
IsAggregateType (lldb::clang_type_t clang_type);
// Returns a mask containing bits from the ClangASTContext::eTypeXXX enumerations
static uint32_t
GetTypeInfo (lldb::clang_type_t clang_type,
clang::ASTContext *ast, // The AST for clang_type (can be NULL)
lldb::clang_type_t *pointee_or_element_type); // (can be NULL)
static uint32_t
GetNumChildren (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
bool omit_empty_base_classes);
static uint32_t
GetNumDirectBaseClasses (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static uint32_t
GetNumVirtualBaseClasses (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static uint32_t
GetNumFields (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static lldb::clang_type_t
GetDirectBaseClassAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
uint32_t *bit_offset_ptr);
static lldb::clang_type_t
GetVirtualBaseClassAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
uint32_t *bit_offset_ptr);
static lldb::clang_type_t
GetFieldAtIndex (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
uint32_t idx,
std::string& name,
uint32_t *bit_offset_ptr);
static uint32_t
GetNumPointeeChildren (lldb::clang_type_t clang_type);
lldb::clang_type_t
GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
const char *parent_name,
lldb::clang_type_t parent_clang_type,
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
uint32_t &child_bitfield_bit_size,
uint32_t &child_bitfield_bit_offset,
bool &child_is_base_class,
bool &child_is_deref_of_parent);
static lldb::clang_type_t
GetChildClangTypeAtIndex (ExecutionContext *exe_ctx,
clang::ASTContext *ast,
const char *parent_name,
lldb::clang_type_t parent_clang_type,
uint32_t idx,
bool transparent_pointers,
bool omit_empty_base_classes,
bool ignore_array_bounds,
std::string& child_name,
uint32_t &child_byte_size,
int32_t &child_byte_offset,
uint32_t &child_bitfield_bit_size,
uint32_t &child_bitfield_bit_offset,
bool &child_is_base_class,
bool &child_is_deref_of_parent);
// Lookup a child given a name. This function will match base class names
// and member member names in "clang_type" only, not descendants.
static uint32_t
GetIndexOfChildWithName (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
const char *name,
bool omit_empty_base_classes);
// Lookup a child member given a name. This function will match member names
// only and will descend into "clang_type" children in search for the first
// member in this class, or any base class that matches "name".
// TODO: Return all matches for a given name by returning a vector<vector<uint32_t>>
// so we catch all names that match a given child name, not just the first.
static size_t
GetIndexOfChildMemberWithName (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
const char *name,
bool omit_empty_base_classes,
std::vector<uint32_t>& child_indexes);
size_t
GetNumTemplateArguments (lldb::clang_type_t clang_type)
{
return GetNumTemplateArguments(getASTContext(), clang_type);
}
lldb::clang_type_t
GetTemplateArgument (lldb::clang_type_t clang_type,
size_t idx,
lldb::TemplateArgumentKind &kind)
{
return GetTemplateArgument(getASTContext(), clang_type, idx, kind);
}
static size_t
GetNumTemplateArguments (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static lldb::clang_type_t
GetTemplateArgument (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
size_t idx,
lldb::TemplateArgumentKind &kind);
//------------------------------------------------------------------
// clang::TagType
//------------------------------------------------------------------
bool
SetTagTypeKind (lldb::clang_type_t tag_qual_type,
int kind);
//------------------------------------------------------------------
// C++ Base Classes
//------------------------------------------------------------------
clang::CXXBaseSpecifier *
CreateBaseClassSpecifier (lldb::clang_type_t base_class_type,
lldb::AccessType access,
bool is_virtual,
bool base_of_class);
static void
DeleteBaseClassSpecifiers (clang::CXXBaseSpecifier **base_classes,
unsigned num_base_classes);
bool
SetBaseClassesForClassType (lldb::clang_type_t class_clang_type,
clang::CXXBaseSpecifier const * const *base_classes,
unsigned num_base_classes);
//------------------------------------------------------------------
// DeclContext Functions
//------------------------------------------------------------------
static clang::DeclContext *
GetDeclContextForType (lldb::clang_type_t qual_type);
//------------------------------------------------------------------
// Namespace Declarations
//------------------------------------------------------------------
clang::NamespaceDecl *
GetUniqueNamespaceDeclaration (const char *name,
clang::DeclContext *decl_ctx);
//------------------------------------------------------------------
// Function Types
//------------------------------------------------------------------
clang::FunctionDecl *
CreateFunctionDeclaration (clang::DeclContext *decl_ctx,
const char *name,
lldb::clang_type_t function_Type,
int storage,
bool is_inline);
static lldb::clang_type_t
CreateFunctionType (clang::ASTContext *ast,
lldb::clang_type_t result_type,
lldb::clang_type_t *args,
unsigned num_args,
bool is_variadic,
unsigned type_quals);
lldb::clang_type_t
CreateFunctionType (lldb::clang_type_t result_type,
lldb::clang_type_t *args,
unsigned num_args,
bool is_variadic,
unsigned type_quals)
{
return ClangASTContext::CreateFunctionType(getASTContext(),
result_type,
args,
num_args,
is_variadic,
type_quals);
}
clang::ParmVarDecl *
CreateParameterDeclaration (const char *name,
lldb::clang_type_t param_type,
int storage);
void
SetFunctionParameters (clang::FunctionDecl *function_decl,
clang::ParmVarDecl **params,
unsigned num_params);
//------------------------------------------------------------------
// Array Types
//------------------------------------------------------------------
lldb::clang_type_t
CreateArrayType (lldb::clang_type_t element_type,
size_t element_count,
uint32_t bit_stride);
//------------------------------------------------------------------
// Tag Declarations
//------------------------------------------------------------------
bool
StartTagDeclarationDefinition (lldb::clang_type_t qual_type);
bool
CompleteTagDeclarationDefinition (lldb::clang_type_t qual_type);
//------------------------------------------------------------------
// Enumeration Types
//------------------------------------------------------------------
lldb::clang_type_t
CreateEnumerationType (const char *name,
clang::DeclContext *decl_ctx,
const Declaration &decl,
lldb::clang_type_t integer_qual_type);
static lldb::clang_type_t
GetEnumerationIntegerType (lldb::clang_type_t enum_clang_type);
bool
AddEnumerationValueToEnumerationType (lldb::clang_type_t enum_qual_type,
lldb::clang_type_t enumerator_qual_type,
const Declaration &decl,
const char *name,
int64_t enum_value,
uint32_t enum_value_bit_size);
//------------------------------------------------------------------
// Pointers & References
//------------------------------------------------------------------
lldb::clang_type_t
CreatePointerType (lldb::clang_type_t clang_type);
static lldb::clang_type_t
CreatePointerType (clang::ASTContext *ast,
lldb::clang_type_t clang_type);
static lldb::clang_type_t
CreateLValueReferenceType (clang::ASTContext *ast_context,
lldb::clang_type_t clang_type);
static lldb::clang_type_t
CreateRValueReferenceType (clang::ASTContext *ast_context,
lldb::clang_type_t clang_type);
lldb::clang_type_t
CreateLValueReferenceType (lldb::clang_type_t clang_type)
{
return ClangASTContext::CreateLValueReferenceType(getASTContext(), clang_type);
}
lldb::clang_type_t
CreateRValueReferenceType (lldb::clang_type_t clang_type)
{
return ClangASTContext::CreateRValueReferenceType(getASTContext(), clang_type);
}
lldb::clang_type_t
CreateMemberPointerType (lldb::clang_type_t clang_pointee_type,
lldb::clang_type_t clang_class_type);
uint32_t
GetPointerBitSize ();
static bool
IsIntegerType (lldb::clang_type_t clang_type, bool &is_signed);
static bool
IsPointerType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
static bool
IsReferenceType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
static bool
IsPointerOrReferenceType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type = NULL);
static bool
IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
lldb::clang_type_t *target_type = NULL);
static bool
IsPossibleDynamicType (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
lldb::clang_type_t *dynamic_pointee_type = NULL,
bool cplusplus = true,
bool objc = true);
static bool
IsCStringType (lldb::clang_type_t clang_type, uint32_t &length);
static bool
IsFunctionPointerType (lldb::clang_type_t clang_type);
static lldb::clang_type_t
GetAsArrayType (lldb::clang_type_t clang_type,
lldb::clang_type_t *member_type = NULL,
uint64_t *size = NULL);
static bool
IsArrayType (lldb::clang_type_t clang_type,
lldb::clang_type_t *member_type = NULL,
uint64_t *size = NULL)
{
return GetAsArrayType(clang_type, member_type, size) != 0;
}
//------------------------------------------------------------------
// Typedefs
//------------------------------------------------------------------
lldb::clang_type_t
CreateTypedefType (const char *name,
lldb::clang_type_t clang_type,
clang::DeclContext *decl_ctx);
//------------------------------------------------------------------
// Type names
//------------------------------------------------------------------
static bool
IsFloatingPointType (lldb::clang_type_t clang_type, uint32_t &count, bool &is_complex);
// true iff this is one of the types that can "fit"
// in a Scalar object
static bool
IsScalarType (lldb::clang_type_t clang_type);
static bool
IsPointerToScalarType (lldb::clang_type_t clang_type);
static bool
IsArrayOfScalarType (lldb::clang_type_t clang_type);
static bool
GetCXXClassName (lldb::clang_type_t clang_type,
std::string &class_name);
static bool
IsCXXClassType (lldb::clang_type_t clang_type);
static bool
IsBeingDefined (lldb::clang_type_t clang_type);
static bool
IsObjCClassType (lldb::clang_type_t clang_type);
static bool
IsObjCObjectPointerType (lldb::clang_type_t clang_type, lldb::clang_type_t *target_type);
static bool
GetObjCClassName (lldb::clang_type_t clang_type,
std::string &class_name);
static bool
IsCharType (lldb::clang_type_t clang_type);
static size_t
GetArraySize (lldb::clang_type_t clang_type);
//static bool
//ConvertFloatValueToString (clang::ASTContext *ast,
// lldb::clang_type_t clang_type,
// const uint8_t* bytes,
// size_t byte_size,
// int apint_byte_order,
// std::string &float_str);
static size_t
ConvertStringToFloatValue (clang::ASTContext *ast,
lldb::clang_type_t clang_type,
const char *s,
uint8_t *dst,
size_t dst_size);
//------------------------------------------------------------------
// Qualifiers
//------------------------------------------------------------------
static unsigned
GetTypeQualifiers(lldb::clang_type_t clang_type);
protected:
//------------------------------------------------------------------
// Classes that inherit from ClangASTContext can see and modify these
//------------------------------------------------------------------
std::string m_target_triple;
std::auto_ptr<clang::ASTContext> m_ast_ap;
std::auto_ptr<clang::LangOptions> m_language_options_ap;
std::auto_ptr<clang::FileManager> m_file_manager_ap;
std::auto_ptr<clang::FileSystemOptions> m_file_system_options_ap;
std::auto_ptr<clang::SourceManager> m_source_manager_ap;
std::auto_ptr<clang::DiagnosticsEngine> m_diagnostics_engine_ap;
std::auto_ptr<clang::DiagnosticConsumer> m_diagnostic_consumer_ap;
std::auto_ptr<clang::TargetOptions> m_target_options_ap;
std::auto_ptr<clang::TargetInfo> m_target_info_ap;
std::auto_ptr<clang::IdentifierTable> m_identifier_table_ap;
std::auto_ptr<clang::SelectorTable> m_selector_table_ap;
std::auto_ptr<clang::Builtin::Context> m_builtins_ap;
CompleteTagDeclCallback m_callback_tag_decl;
CompleteObjCInterfaceDeclCallback m_callback_objc_decl;
void * m_callback_baton;
private:
//------------------------------------------------------------------
// For ClangASTContext only
//------------------------------------------------------------------
ClangASTContext(const ClangASTContext&);
const ClangASTContext& operator=(const ClangASTContext&);
};
} // namespace lldb_private
#endif // liblldb_ClangASTContext_h_