summaryrefslogtreecommitdiffstats
path: root/lldb/source/Symbol/ClangASTContext.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-01-17 03:46:26 +0000
committerGreg Clayton <gclayton@apple.com>2011-01-17 03:46:26 +0000
commit6beaaa680a0410c88c53573b2c85ad4c7e9e25b6 (patch)
tree47fb0f3c887b795b63645701cd2cdc15d8e5a082 /lldb/source/Symbol/ClangASTContext.cpp
parent0acd4cfc336c2cf6e7acd58100d273fd9818ac71 (diff)
downloadbcm5719-llvm-6beaaa680a0410c88c53573b2c85ad4c7e9e25b6.tar.gz
bcm5719-llvm-6beaaa680a0410c88c53573b2c85ad4c7e9e25b6.zip
A few of the issue I have been trying to track down and fix have been due to
the way LLDB lazily gets complete definitions for types within the debug info. When we run across a class/struct/union definition in the DWARF, we will only parse the full definition if we need to. This works fine for top level types that are assigned directly to variables and arguments, but when we have a variable with a class, lets say "A" for this example, that has a member: "B *m_b". Initially we don't need to hunt down a definition for this class unless we are ever asked to do something with it ("expr m_b->getDecl()" for example). With my previous approach to lazy type completion, we would be able to take a "A *a" and get a complete type for it, but we wouldn't be able to then do an "a->m_b->getDecl()" unless we always expanded all types within a class prior to handing out the type. Expanding everything is very costly and it would be great if there were a better way. A few months ago I worked with the llvm/clang folks to have the ExternalASTSource class be able to complete classes if there weren't completed yet: class ExternalASTSource { .... virtual void CompleteType (clang::TagDecl *Tag); virtual void CompleteType (clang::ObjCInterfaceDecl *Class); }; This was great, because we can now have the class that is producing the AST (SymbolFileDWARF and SymbolFileDWARFDebugMap) sign up as external AST sources and the object that creates the forward declaration types can now also complete them anywhere within the clang type system. This patch makes a few major changes: - lldb_private::Module classes now own the AST context. Previously the TypeList objects did. - The DWARF parsers now sign up as an external AST sources so they can complete types. - All of the pure clang type system wrapper code we have in LLDB (ClangASTContext, ClangASTType, and more) can now be iterating through children of any type, and if a class/union/struct type (clang::RecordType or ObjC interface) is found that is incomplete, we can ask the AST to get the definition. - The SymbolFileDWARFDebugMap class now will create and use a single AST that all child SymbolFileDWARF classes will share (much like what happens when we have a complete linked DWARF for an executable). We will need to modify some of the ClangUserExpression code to take more advantage of this completion ability in the near future. Meanwhile we should be better off now that we can be accessing any children of variables through pointers and always be able to resolve the clang type if needed. llvm-svn: 123613
Diffstat (limited to 'lldb/source/Symbol/ClangASTContext.cpp')
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp952
1 files changed, 590 insertions, 362 deletions
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp
index 90a1352f236..e2b09f1aaae 100644
--- a/lldb/source/Symbol/ClangASTContext.cpp
+++ b/lldb/source/Symbol/ClangASTContext.cpp
@@ -14,7 +14,24 @@
#include <string>
// Other libraries and framework includes
+
+// Clang headers like to use NDEBUG inside of them to enable/disable debug
+// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
+// or another. This is bad because it means that if clang was built in release
+// mode, it assumes that you are building in release mode which is not always
+// the case. You can end up with functions that are defined as empty in header
+// files when NDEBUG is not defined, and this can cause link errors with the
+// clang .a files that you have since you might be missing functions in the .a
+// file. So we have to define NDEBUG when including clang headers to avoid any
+// mismatches. This is covered by rdar://problem/8691220
+
+#ifndef NDEBUG
+#define LLDB_DEFINED_NDEBUG_FOR_CLANG
#define NDEBUG
+// Need to include assert.h so it is as clang would expect it to be (disabled)
+#include <assert.h>
+#endif
+
#include "clang/AST/ASTContext.h"
#include "clang/AST/ASTImporter.h"
#include "clang/AST/CXXInheritance.h"
@@ -29,7 +46,13 @@
#include "clang/Basic/TargetOptions.h"
#include "clang/Frontend/FrontendOptions.h"
#include "clang/Frontend/LangStandard.h"
+
+#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
#undef NDEBUG
+#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
+// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
+#include <assert.h>
+#endif
#include "lldb/Core/dwarf.h"
#include "lldb/Core/Flags.h"
@@ -42,6 +65,76 @@ using namespace lldb_private;
using namespace llvm;
using namespace clang;
+
+static bool
+GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type)
+{
+ const clang::Type::TypeClass type_class = qual_type->getTypeClass();
+ switch (type_class)
+ {
+ case clang::Type::Record:
+ case clang::Type::Enum:
+ {
+ clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type.getTypePtr());
+ if (tag_type)
+ {
+ clang::TagDecl *tag_decl = tag_type->getDecl();
+ if (tag_decl)
+ {
+ if (tag_decl->getDefinition())
+ return true;
+
+ if (tag_decl->hasExternalLexicalStorage())
+ {
+ ExternalASTSource *external_ast_source = ast->getExternalSource();
+ if (external_ast_source)
+ {
+ external_ast_source->CompleteType(tag_decl);
+ return !tag_type->isIncompleteType();
+ }
+ }
+ return false;
+ }
+ }
+
+ }
+ break;
+
+ case clang::Type::ObjCObject:
+ case clang::Type::ObjCInterface:
+ {
+ clang::ObjCObjectType *objc_class_type = dyn_cast<clang::ObjCObjectType>(qual_type);
+ if (objc_class_type)
+ {
+ clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
+ // We currently can't complete objective C types through the newly added ASTContext
+ // because it only supports TagDecl objects right now...
+ bool is_forward_decl = class_interface_decl->isForwardDecl();
+ if (is_forward_decl && class_interface_decl->hasExternalLexicalStorage())
+ {
+ ExternalASTSource *external_ast_source = ast->getExternalSource();
+ if (external_ast_source)
+ {
+ external_ast_source->CompleteType (class_interface_decl);
+ is_forward_decl = class_interface_decl->isForwardDecl();
+ }
+ }
+ return is_forward_decl;
+ }
+ }
+ break;
+
+ case clang::Type::Typedef:
+ return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType());
+
+ default:
+ break;
+ }
+
+ return true;
+}
+
+
static AccessSpecifier
ConvertAccessTypeToAccessSpecifier (AccessType access)
{
@@ -100,7 +193,7 @@ ParseLangArgs
switch (IK) {
case IK_None:
case IK_AST:
- assert(0 && "Invalid input kind!");
+ assert (!"Invalid input kind!");
case IK_OpenCL:
LangStd = LangStandard::lang_opencl;
break;
@@ -237,9 +330,9 @@ ParseLangArgs
}
-ClangASTContext::ClangASTContext(const char *target_triple) :
+ClangASTContext::ClangASTContext (const char *target_triple) :
m_target_triple(),
- m_ast_context_ap(),
+ m_ast_ap(),
m_language_options_ap(),
m_source_manager_ap(),
m_diagnostic_ap(),
@@ -247,7 +340,11 @@ ClangASTContext::ClangASTContext(const char *target_triple) :
m_target_info_ap(),
m_identifier_table_ap(),
m_selector_table_ap(),
- m_builtins_ap()
+ m_builtins_ap(),
+ m_callback_tag_decl (NULL),
+ m_callback_objc_decl (NULL),
+ m_callback_baton (NULL)
+
{
if (target_triple && target_triple[0])
m_target_triple.assign (target_triple);
@@ -266,14 +363,14 @@ ClangASTContext::~ClangASTContext()
m_diagnostic_ap.reset();
m_source_manager_ap.reset();
m_language_options_ap.reset();
- m_ast_context_ap.reset();
+ m_ast_ap.reset();
}
void
ClangASTContext::Clear()
{
- m_ast_context_ap.reset();
+ m_ast_ap.reset();
m_language_options_ap.reset();
m_source_manager_ap.reset();
m_diagnostic_ap.reset();
@@ -297,25 +394,65 @@ ClangASTContext::SetTargetTriple (const char *target_triple)
m_target_triple.assign(target_triple);
}
+bool
+ClangASTContext::HasExternalSource ()
+{
+ ASTContext *ast = getASTContext();
+ if (ast)
+ return ast->getExternalSource () != NULL;
+ return false;
+}
+
+void
+ClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
+{
+ ASTContext *ast = getASTContext();
+ if (ast)
+ {
+ ast->setExternalSource (ast_source_ap);
+ ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
+ //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
+ }
+}
+
+void
+ClangASTContext::RemoveExternalSource ()
+{
+ ASTContext *ast = getASTContext();
+
+ if (ast)
+ {
+ llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
+ ast->setExternalSource (empty_ast_source_ap);
+ ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
+ //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
+ }
+}
+
+
ASTContext *
ClangASTContext::getASTContext()
{
- if (m_ast_context_ap.get() == NULL)
+ if (m_ast_ap.get() == NULL)
{
- m_ast_context_ap.reset(
- new ASTContext(
- *getLanguageOptions(),
- *getSourceManager(),
- *getTargetInfo(),
- *getIdentifierTable(),
- *getSelectorTable(),
- *getBuiltinContext(),
- 0));
+ m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
+ *getSourceManager(),
+ *getTargetInfo(),
+ *getIdentifierTable(),
+ *getSelectorTable(),
+ *getBuiltinContext(),
+ 0));
- m_ast_context_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
+ if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
+ {
+ m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
+ //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
+ }
+
+ m_ast_ap->getDiagnostics().setClient(getDiagnosticClient(), false);
}
- return m_ast_context_ap.get();
+ return m_ast_ap.get();
}
Builtin::Context *
@@ -440,9 +577,9 @@ ClangASTContext::getTargetInfo()
#pragma mark Basic Types
static inline bool
-QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualType qual_type)
+QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
{
- uint64_t qual_type_bit_size = ast_context->getTypeSize(qual_type);
+ uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
if (qual_type_bit_size == bit_size)
return true;
return false;
@@ -451,63 +588,63 @@ QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast_context, QualTyp
clang_type_t
ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
{
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
- assert (ast_context != NULL);
+ assert (ast != NULL);
- return GetBuiltinTypeForEncodingAndBitSize (ast_context, encoding, bit_size);
+ return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
}
clang_type_t
-ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, Encoding encoding, uint32_t bit_size)
+ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
{
- if (!ast_context)
+ if (!ast)
return NULL;
switch (encoding)
{
case eEncodingInvalid:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
- return ast_context->VoidPtrTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
+ return ast->VoidPtrTy.getAsOpaquePtr();
break;
case eEncodingUint:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
- return ast_context->UnsignedCharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
- return ast_context->UnsignedShortTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
- return ast_context->UnsignedIntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
- return ast_context->UnsignedLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
- return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
- return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
+ return ast->UnsignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
+ return ast->UnsignedShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
+ return ast->UnsignedIntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
+ return ast->UnsignedLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
+ return ast->UnsignedLongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
+ return ast->UnsignedInt128Ty.getAsOpaquePtr();
break;
case eEncodingSint:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
- return ast_context->CharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
- return ast_context->ShortTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
- return ast_context->IntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
- return ast_context->LongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
- return ast_context->LongLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
- return ast_context->Int128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
+ return ast->CharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
+ return ast->ShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
+ return ast->IntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
+ return ast->LongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
+ return ast->LongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
+ return ast->Int128Ty.getAsOpaquePtr();
break;
case eEncodingIEEE754:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
- return ast_context->FloatTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
- return ast_context->DoubleTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
- return ast_context->LongDoubleTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
+ return ast->FloatTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
+ return ast->DoubleTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
+ return ast->LongDoubleTy.getAsOpaquePtr();
break;
case eEncodingVector:
@@ -521,11 +658,11 @@ ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast_context, E
clang_type_t
ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
{
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
#define streq(a,b) strcmp(a,b) == 0
- assert (ast_context != NULL);
- if (ast_context)
+ assert (ast != NULL);
+ if (ast)
{
switch (dw_ate)
{
@@ -533,19 +670,19 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
break;
case DW_ATE_address:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->VoidPtrTy))
- return ast_context->VoidPtrTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
+ return ast->VoidPtrTy.getAsOpaquePtr();
break;
case DW_ATE_boolean:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->BoolTy))
- return ast_context->BoolTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
- return ast_context->UnsignedCharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
- return ast_context->UnsignedShortTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
- return ast_context->UnsignedIntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
+ return ast->BoolTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
+ return ast->UnsignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
+ return ast->UnsignedShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
+ return ast->UnsignedIntTy.getAsOpaquePtr();
break;
case DW_ATE_lo_user:
@@ -553,31 +690,31 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
if (strcmp(type_name, "complex") == 0)
{
clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
- return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
+ return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
}
break;
case DW_ATE_complex_float:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatComplexTy))
- return ast_context->FloatComplexTy.getAsOpaquePtr();
- else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleComplexTy))
- return ast_context->DoubleComplexTy.getAsOpaquePtr();
- else if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleComplexTy))
- return ast_context->LongDoubleComplexTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
+ return ast->FloatComplexTy.getAsOpaquePtr();
+ else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
+ return ast->DoubleComplexTy.getAsOpaquePtr();
+ else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
+ return ast->LongDoubleComplexTy.getAsOpaquePtr();
else
{
clang_type_t complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
- return ast_context->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
+ return ast->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
}
break;
case DW_ATE_float:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->FloatTy))
- return ast_context->FloatTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->DoubleTy))
- return ast_context->DoubleTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongDoubleTy))
- return ast_context->LongDoubleTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
+ return ast->FloatTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
+ return ast->DoubleTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
+ return ast->LongDoubleTy.getAsOpaquePtr();
break;
case DW_ATE_signed:
@@ -585,52 +722,52 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
{
if (strstr(type_name, "long long"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
- return ast_context->LongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
+ return ast->LongLongTy.getAsOpaquePtr();
}
else if (strstr(type_name, "long"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
- return ast_context->LongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
+ return ast->LongTy.getAsOpaquePtr();
}
else if (strstr(type_name, "short"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
- return ast_context->ShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
+ return ast->ShortTy.getAsOpaquePtr();
}
else if (strstr(type_name, "char"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
- return ast_context->CharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
- return ast_context->SignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
+ return ast->CharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
+ return ast->SignedCharTy.getAsOpaquePtr();
}
else if (strstr(type_name, "int"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
- return ast_context->IntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
- return ast_context->Int128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
+ return ast->IntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
+ return ast->Int128Ty.getAsOpaquePtr();
}
else if (streq(type_name, "wchar_t"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->WCharTy))
- return ast_context->WCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
+ return ast->WCharTy.getAsOpaquePtr();
}
}
// We weren't able to match up a type name, just search by size
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
- return ast_context->CharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->ShortTy))
- return ast_context->ShortTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->IntTy))
- return ast_context->IntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongTy))
- return ast_context->LongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->LongLongTy))
- return ast_context->LongLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->Int128Ty))
- return ast_context->Int128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
+ return ast->CharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
+ return ast->ShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
+ return ast->IntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
+ return ast->LongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
+ return ast->LongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
+ return ast->Int128Ty.getAsOpaquePtr();
break;
case DW_ATE_signed_char:
@@ -638,14 +775,14 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
{
if (streq(type_name, "signed char"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
- return ast_context->SignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
+ return ast->SignedCharTy.getAsOpaquePtr();
}
}
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->CharTy))
- return ast_context->CharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->SignedCharTy))
- return ast_context->SignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
+ return ast->CharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
+ return ast->SignedCharTy.getAsOpaquePtr();
break;
case DW_ATE_unsigned:
@@ -653,50 +790,50 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
{
if (strstr(type_name, "long long"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
- return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
+ return ast->UnsignedLongLongTy.getAsOpaquePtr();
}
else if (strstr(type_name, "long"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
- return ast_context->UnsignedLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
+ return ast->UnsignedLongTy.getAsOpaquePtr();
}
else if (strstr(type_name, "short"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
- return ast_context->UnsignedShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
+ return ast->UnsignedShortTy.getAsOpaquePtr();
}
else if (strstr(type_name, "char"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
- return ast_context->UnsignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
+ return ast->UnsignedCharTy.getAsOpaquePtr();
}
else if (strstr(type_name, "int"))
{
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
- return ast_context->UnsignedIntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
- return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
+ return ast->UnsignedIntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
+ return ast->UnsignedInt128Ty.getAsOpaquePtr();
}
}
// We weren't able to match up a type name, just search by size
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
- return ast_context->UnsignedCharTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedShortTy))
- return ast_context->UnsignedShortTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedIntTy))
- return ast_context->UnsignedIntTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongTy))
- return ast_context->UnsignedLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedLongLongTy))
- return ast_context->UnsignedLongLongTy.getAsOpaquePtr();
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedInt128Ty))
- return ast_context->UnsignedInt128Ty.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
+ return ast->UnsignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
+ return ast->UnsignedShortTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
+ return ast->UnsignedIntTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
+ return ast->UnsignedLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
+ return ast->UnsignedLongLongTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
+ return ast->UnsignedInt128Ty.getAsOpaquePtr();
break;
case DW_ATE_unsigned_char:
- if (QualTypeMatchesBitSize (bit_size, ast_context, ast_context->UnsignedCharTy))
- return ast_context->UnsignedCharTy.getAsOpaquePtr();
+ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
+ return ast->UnsignedCharTy.getAsOpaquePtr();
break;
case DW_ATE_imaginary_float:
@@ -710,9 +847,9 @@ ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name
}
clang_type_t
-ClangASTContext::GetBuiltInType_void(ASTContext *ast_context)
+ClangASTContext::GetBuiltInType_void(ASTContext *ast)
{
- return ast_context->VoidTy.getAsOpaquePtr();
+ return ast->VoidTy.getAsOpaquePtr();
}
clang_type_t
@@ -757,9 +894,9 @@ ClangASTContext::GetVoidPtrType (bool is_const)
}
clang_type_t
-ClangASTContext::GetVoidPtrType (ASTContext *ast_context, bool is_const)
+ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
{
- QualType void_ptr_type(ast_context->VoidPtrTy);
+ QualType void_ptr_type(ast->VoidPtrTy);
if (is_const)
void_ptr_type.addConst();
@@ -798,11 +935,11 @@ ClangASTContext::CopyDecl (ASTContext *dst_ast,
}
bool
-ClangASTContext::AreTypesSame(ASTContext *ast_context,
+ClangASTContext::AreTypesSame(ASTContext *ast,
clang_type_t type1,
clang_type_t type2)
{
- return ast_context->hasSameType(QualType::getFromOpaquePtr(type1),
+ return ast->hasSameType(QualType::getFromOpaquePtr(type1),
QualType::getFromOpaquePtr(type2));
}
@@ -844,16 +981,39 @@ ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
return NULL;
}
+
+clang_type_t
+ClangASTContext::GetTypeForDecl (TagDecl *decl)
+{
+ // No need to call the getASTContext() accessor (which can create the AST
+ // if it isn't created yet, because we can't have created a decl in this
+ // AST if our AST didn't already exist...
+ if (m_ast_ap.get())
+ return m_ast_ap->getTagDeclType(decl).getAsOpaquePtr();
+ return NULL;
+}
+
+clang_type_t
+ClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
+{
+ // No need to call the getASTContext() accessor (which can create the AST
+ // if it isn't created yet, because we can't have created a decl in this
+ // AST if our AST didn't already exist...
+ if (m_ast_ap.get())
+ return m_ast_ap->getObjCInterfaceType(decl).getAsOpaquePtr();
+ return NULL;
+}
+
#pragma mark Structure, Unions, Classes
clang_type_t
ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl_ctx, LanguageType language)
{
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
if (decl_ctx == NULL)
- decl_ctx = ast_context->getTranslationUnitDecl();
+ decl_ctx = ast->getTranslationUnitDecl();
if (language == eLanguageTypeObjC)
@@ -868,13 +1028,78 @@ ClangASTContext::CreateRecordType (const char *name, int kind, DeclContext *decl
// the CXXRecordDecl class since we often don't know from debug information
// if something is struct or a class, so we default to always use the more
// complete definition just in case.
- CXXRecordDecl *decl = CXXRecordDecl::Create(*ast_context,
+ CXXRecordDecl *decl = CXXRecordDecl::Create(*ast,
(TagDecl::TagKind)kind,
decl_ctx,
SourceLocation(),
- name && name[0] ? &ast_context->Idents.get(name) : NULL);
+ name && name[0] ? &ast->Idents.get(name) : NULL);
+
+ return ast->getTagDeclType(decl).getAsOpaquePtr();
+}
+
+bool
+ClangASTContext::SetHasExternalStorage (clang_type_t clang_type, bool has_extern)
+{
+ if (clang_type == NULL)
+ return false;
+
+ QualType qual_type (QualType::getFromOpaquePtr(clang_type));
+
+ const clang::Type::TypeClass type_class = qual_type->getTypeClass();
+ switch (type_class)
+ {
+ case clang::Type::Record:
+ {
+ CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
+ if (cxx_record_decl)
+ {
+ cxx_record_decl->setHasExternalLexicalStorage (has_extern);
+ //cxx_record_decl->setHasExternalVisibleStorage (has_extern);
+ return true;
+ }
+ }
+ break;
+
+ case clang::Type::Enum:
+ {
+ EnumDecl *enum_decl = cast<EnumType>(qual_type)->getDecl();
+ if (enum_decl)
+ {
+ enum_decl->setHasExternalLexicalStorage (has_extern);
+ //enum_decl->setHasExternalVisibleStorage (has_extern);
+ return true;
+ }
+ }
+ break;
+
+ case clang::Type::ObjCObject:
+ case clang::Type::ObjCInterface:
+ {
+ ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
+ assert (objc_class_type);
+ if (objc_class_type)
+ {
+ ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
+
+ if (class_interface_decl)
+ {
+ if (has_extern)
+ class_interface_decl->setExternallyCompleted();
+ class_interface_decl->setHasExternalLexicalStorage (has_extern);
+ //class_interface_decl->setHasExternalVisibleStorage (has_extern);
+ return true;
+ }
+ }
+ }
+ break;
- return ast_context->getTagDeclType(decl).getAsOpaquePtr();
+ case clang::Type::Typedef:
+ return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
+
+ default:
+ break;
+ }
+ return false;
}
static bool
@@ -1092,10 +1317,11 @@ IsOperator (const char *name, OverloadedOperatorKind &op_kind)
return true;
}
+
CXXMethodDecl *
ClangASTContext::AddMethodToCXXRecordType
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t record_opaque_type,
const char *name,
clang_type_t method_opaque_type,
@@ -1109,30 +1335,15 @@ ClangASTContext::AddMethodToCXXRecordType
if (!record_opaque_type || !method_opaque_type || !name)
return NULL;
- assert(ast_context);
+ assert(ast);
- IdentifierTable *identifier_table = &ast_context->Idents;
+ IdentifierTable *identifier_table = &ast->Idents;
assert(identifier_table);
QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
- clang::Type *clang_type(record_qual_type.getTypePtr());
-
- if (clang_type == NULL)
- return NULL;
-
- RecordType *record_clang_type(dyn_cast<RecordType>(clang_type));
-
- if (record_clang_type == NULL)
- return NULL;
-
- RecordDecl *record_decl = record_clang_type->getDecl();
-
- if (record_decl == NULL)
- return NULL;
-
- CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
+ CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
if (cxx_record_decl == NULL)
return NULL;
@@ -1159,19 +1370,19 @@ ClangASTContext::AddMethodToCXXRecordType
if (name[0] == '~')
{
- cxx_method_decl = CXXDestructorDecl::Create (*ast_context,
+ cxx_method_decl = CXXDestructorDecl::Create (*ast,
cxx_record_decl,
- DeclarationNameInfo (ast_context->DeclarationNames.getCXXDestructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
+ DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
method_qual_type,
NULL,
is_inline,
is_implicitly_declared);
}
- else if (decl_name == record_decl->getDeclName())
+ else if (decl_name == cxx_record_decl->getDeclName())
{
- cxx_method_decl = CXXConstructorDecl::Create (*ast_context,
+ cxx_method_decl = CXXConstructorDecl::Create (*ast,
cxx_record_decl,
- DeclarationNameInfo (ast_context->DeclarationNames.getCXXConstructorName (ast_context->getCanonicalType (record_qual_type)), SourceLocation()),
+ DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
method_qual_type,
NULL, // TypeSourceInfo *
is_explicit,
@@ -1186,9 +1397,9 @@ ClangASTContext::AddMethodToCXXRecordType
{
if (op_kind != NUM_OVERLOADED_OPERATORS)
{
- cxx_method_decl = CXXMethodDecl::Create (*ast_context,
+ cxx_method_decl = CXXMethodDecl::Create (*ast,
cxx_record_decl,
- DeclarationNameInfo (ast_context->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
+ DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
method_qual_type,
NULL, // TypeSourceInfo *
is_static,
@@ -1198,9 +1409,9 @@ ClangASTContext::AddMethodToCXXRecordType
else if (num_params == 0)
{
// Conversion operators don't take params...
- cxx_method_decl = CXXConversionDecl::Create (*ast_context,
+ cxx_method_decl = CXXConversionDecl::Create (*ast,
cxx_record_decl,
- DeclarationNameInfo (ast_context->DeclarationNames.getCXXConversionFunctionName (ast_context->getCanonicalType (function_Type->getResultType())), SourceLocation()),
+ DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
method_qual_type,
NULL, // TypeSourceInfo *
is_inline,
@@ -1210,7 +1421,7 @@ ClangASTContext::AddMethodToCXXRecordType
if (cxx_method_decl == NULL)
{
- cxx_method_decl = CXXMethodDecl::Create (*ast_context,
+ cxx_method_decl = CXXMethodDecl::Create (*ast,
cxx_record_decl,
DeclarationNameInfo (decl_name, SourceLocation()),
method_qual_type,
@@ -1234,7 +1445,7 @@ ClangASTContext::AddMethodToCXXRecordType
param_index < num_params;
++param_index)
{
- params[param_index] = ParmVarDecl::Create (*ast_context,
+ params[param_index] = ParmVarDecl::Create (*ast,
cxx_method_decl,
SourceLocation(),
NULL, // anonymous
@@ -1255,7 +1466,7 @@ ClangASTContext::AddMethodToCXXRecordType
bool
ClangASTContext::AddFieldToRecordType
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t record_clang_type,
const char *name,
clang_type_t field_type,
@@ -1266,9 +1477,9 @@ ClangASTContext::AddFieldToRecordType
if (record_clang_type == NULL || field_type == NULL)
return false;
- IdentifierTable *identifier_table = &ast_context->Idents;
+ IdentifierTable *identifier_table = &ast->Idents;
- assert (ast_context != NULL);
+ assert (ast != NULL);
assert (identifier_table != NULL);
QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
@@ -1285,10 +1496,10 @@ ClangASTContext::AddFieldToRecordType
clang::Expr *bit_width = NULL;
if (bitfield_bit_size != 0)
{
- APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
- bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
+ APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
+ bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
}
- FieldDecl *field = FieldDecl::Create (*ast_context,
+ FieldDecl *field = FieldDecl::Create (*ast,
record_decl,
SourceLocation(),
name ? &identifier_table->get(name) : NULL, // Identifier
@@ -1310,7 +1521,7 @@ ClangASTContext::AddFieldToRecordType
if (objc_class_type)
{
bool is_synthesized = false;
- ClangASTContext::AddObjCClassIVar (ast_context,
+ ClangASTContext::AddObjCClassIVar (ast,
record_clang_type,
name,
field_type,
@@ -1332,12 +1543,12 @@ ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
bool
ClangASTContext::FieldIsBitfield
(
- ASTContext *ast_context,
+ ASTContext *ast,
FieldDecl* field,
uint32_t& bitfield_bit_size
)
{
- if (ast_context == NULL || field == NULL)
+ if (ast == NULL || field == NULL)
return false;
if (field->isBitField())
@@ -1346,7 +1557,7 @@ ClangASTContext::FieldIsBitfield
if (bit_width_expr)
{
llvm::APSInt bit_width_apsint;
- if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast_context))
+ if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
{
bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
return true;
@@ -1383,30 +1594,27 @@ ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
}
void
-ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_qual_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
+ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
{
- if (clang_qual_type)
+ if (clang_type)
{
- QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
- clang::Type *clang_type = qual_type.getTypePtr();
- if (clang_type)
+ QualType qual_type(QualType::getFromOpaquePtr(clang_type));
+
+ RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
+ if (record_type)
{
- RecordType *record_type = dyn_cast<RecordType>(clang_type);
- if (record_type)
+ RecordDecl *record_decl = record_type->getDecl();
+ if (record_decl)
{
- RecordDecl *record_decl = record_type->getDecl();
- if (record_decl)
+ uint32_t field_idx;
+ RecordDecl::field_iterator field, field_end;
+ for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
+ field != field_end;
+ ++field, ++field_idx)
{
- uint32_t field_idx;
- RecordDecl::field_iterator field, field_end;
- for (field = record_decl->field_begin(), field_end = record_decl->field_end(), field_idx = 0;
- field != field_end;
- ++field, ++field_idx)
- {
- // If no accessibility was assigned, assign the correct one
- if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
- field->setAccess ((AccessSpecifier)default_accessibility);
- }
+ // If no accessibility was assigned, assign the correct one
+ if (field_idx < num_assigned_accessibilities && assigned_accessibilities[field_idx] == clang::AS_none)
+ field->setAccess ((AccessSpecifier)default_accessibility);
}
}
}
@@ -1442,19 +1650,11 @@ ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXB
{
if (class_clang_type)
{
- clang::Type *clang_type = QualType::getFromOpaquePtr(class_clang_type).getTypePtr();
- if (clang_type)
+ CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
+ if (cxx_record_decl)
{
- RecordType *record_type = dyn_cast<RecordType>(clang_type);
- if (record_type)
- {
- CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_type->getDecl());
- if (cxx_record_decl)
- {
- cxx_record_decl->setBases(base_classes, num_base_classes);
- return true;
- }
- }
+ cxx_record_decl->setBases(base_classes, num_base_classes);
+ return true;
}
}
return false;
@@ -1470,26 +1670,26 @@ ClangASTContext::CreateObjCClass
bool isInternal
)
{
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
assert (name && name[0]);
if (decl_ctx == NULL)
- decl_ctx = ast_context->getTranslationUnitDecl();
+ decl_ctx = ast->getTranslationUnitDecl();
// NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
// we will need to update this code. I was told to currently always use
// the CXXRecordDecl class since we often don't know from debug information
// if something is struct or a class, so we default to always use the more
// complete definition just in case.
- ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast_context,
+ ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
decl_ctx,
SourceLocation(),
- &ast_context->Idents.get(name),
+ &ast->Idents.get(name),
SourceLocation(),
isForwardDecl,
isInternal);
- return ast_context->getObjCInterfaceType(decl).getAsOpaquePtr();
+ return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
}
bool
@@ -1524,7 +1724,7 @@ ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t
bool
ClangASTContext::AddObjCClassIVar
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t class_opaque_type,
const char *name,
clang_type_t ivar_opaque_type,
@@ -1536,9 +1736,9 @@ ClangASTContext::AddObjCClassIVar
if (class_opaque_type == NULL || ivar_opaque_type == NULL)
return false;
- IdentifierTable *identifier_table = &ast_context->Idents;
+ IdentifierTable *identifier_table = &ast->Idents;
- assert (ast_context != NULL);
+ assert (ast != NULL);
assert (identifier_table != NULL);
QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
@@ -1557,11 +1757,11 @@ ClangASTContext::AddObjCClassIVar
clang::Expr *bit_width = NULL;
if (bitfield_bit_size != 0)
{
- APInt bitfield_bit_size_apint(ast_context->getTypeSize(ast_context->IntTy), bitfield_bit_size);
- bit_width = new (*ast_context)IntegerLiteral (*ast_context, bitfield_bit_size_apint, ast_context->IntTy, SourceLocation());
+ APInt bitfield_bit_size_apint(ast->getTypeSize(ast->IntTy), bitfield_bit_size);
+ bit_width = new (*ast)IntegerLiteral (*ast, bitfield_bit_size_apint, ast->IntTy, SourceLocation());
}
- ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast_context,
+ ObjCIvarDecl *field = ObjCIvarDecl::Create (*ast,
class_interface_decl,
SourceLocation(),
&identifier_table->get(name), // Identifier
@@ -1618,7 +1818,7 @@ ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool
ObjCMethodDecl *
ClangASTContext::AddMethodToObjCObjectType
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t class_opaque_type,
const char *name, // the full symbol name as seen in the symbol table ("-[NString stringWithCString:]")
clang_type_t method_opaque_type,
@@ -1628,9 +1828,9 @@ ClangASTContext::AddMethodToObjCObjectType
if (class_opaque_type == NULL || method_opaque_type == NULL)
return NULL;
- IdentifierTable *identifier_table = &ast_context->Idents;
+ IdentifierTable *identifier_table = &ast->Idents;
- assert (ast_context != NULL);
+ assert (ast != NULL);
assert (identifier_table != NULL);
QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
@@ -1680,7 +1880,7 @@ ClangASTContext::AddMethodToObjCObjectType
if (selector_idents.size() == 0)
return 0;
- clang::Selector method_selector = ast_context->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
+ clang::Selector method_selector = ast->Selectors.getSelector (num_selectors_with_args ? selector_idents.size() : 0,
selector_idents.data());
QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
@@ -1704,7 +1904,7 @@ ClangASTContext::AddMethodToObjCObjectType
const unsigned num_args = method_function_prototype->getNumArgs();
- ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast_context,
+ ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
SourceLocation(), // beginLoc,
SourceLocation(), // endLoc,
method_selector,
@@ -1728,7 +1928,7 @@ ClangASTContext::AddMethodToObjCObjectType
for (int param_index = 0; param_index < num_args; ++param_index)
{
- params.push_back (ParmVarDecl::Create (*ast_context,
+ params.push_back (ParmVarDecl::Create (*ast,
objc_method_decl,
SourceLocation(),
NULL, // anonymous
@@ -1739,7 +1939,7 @@ ClangASTContext::AddMethodToObjCObjectType
NULL));
}
- objc_method_decl->setMethodParams(*ast_context, params.data(), params.size(), num_args);
+ objc_method_decl->setMethodParams(*ast, params.data(), params.size(), num_args);
}
class_interface_decl->addDecl (objc_method_decl);
@@ -1753,7 +1953,7 @@ uint32_t
ClangASTContext::GetTypeInfo
(
clang_type_t clang_type,
- clang::ASTContext *ast_context,
+ clang::ASTContext *ast,
clang_type_t *pointee_or_element_clang_type
)
{
@@ -1773,8 +1973,8 @@ ClangASTContext::GetTypeInfo
{
case clang::BuiltinType::ObjCId:
case clang::BuiltinType::ObjCClass:
- if (ast_context && pointee_or_element_clang_type)
- *pointee_or_element_clang_type = ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
+ if (ast && pointee_or_element_clang_type)
+ *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
default:
@@ -1846,7 +2046,7 @@ ClangASTContext::GetTypeInfo
case clang::Type::Typedef:
return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
- ast_context,
+ ast,
pointee_or_element_clang_type);
case clang::Type::TypeOfExpr: return 0;
@@ -1893,13 +2093,13 @@ ClangASTContext::IsAggregateType (clang_type_t clang_type)
}
uint32_t
-ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_base_classes)
+ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
{
- if (clang_qual_type == NULL)
+ if (clang_type == NULL)
return 0;
uint32_t num_children = 0;
- QualType qual_type(QualType::getFromOpaquePtr(clang_qual_type));
+ QualType qual_type(QualType::getFromOpaquePtr(clang_type));
const clang::Type::TypeClass type_class = qual_type->getTypeClass();
switch (type_class)
{
@@ -1919,7 +2119,7 @@ ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_b
case clang::Type::Complex: return 0;
case clang::Type::Record:
- if (ClangASTType::IsDefined (clang_qual_type))
+ if (ClangASTContext::GetCompleteType (ast, clang_type))
{
const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
const RecordDecl *record_decl = record_type->getDecl();
@@ -1994,7 +2194,8 @@ ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_b
{
ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
QualType pointee_type = pointer_type->getPointeeType();
- uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
+ uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
+ pointee_type.getAsOpaquePtr(),
omit_empty_base_classes);
// If this type points to a simple type, then it has 1 child
if (num_pointee_children == 0)
@@ -2012,7 +2213,8 @@ ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_b
{
PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
QualType pointee_type (pointer_type->getPointeeType());
- uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
+ uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
+ pointee_type.getAsOpaquePtr(),
omit_empty_base_classes);
if (num_pointee_children == 0)
{
@@ -2030,7 +2232,8 @@ ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_b
{
ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
QualType pointee_type = reference_type->getPointeeType();
- uint32_t num_pointee_children = ClangASTContext::GetNumChildren (pointee_type.getAsOpaquePtr(),
+ uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
+ pointee_type.getAsOpaquePtr(),
omit_empty_base_classes);
// If this type points to a simple type, then it has 1 child
if (num_pointee_children == 0)
@@ -2042,7 +2245,9 @@ ClangASTContext::GetNumChildren (clang_type_t clang_qual_type, bool omit_empty_b
case clang::Type::Typedef:
- num_children = ClangASTContext::GetNumChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), omit_empty_base_classes);
+ num_children = ClangASTContext::GetNumChildren (ast,
+ cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
+ omit_empty_base_classes);
break;
default:
@@ -2178,7 +2383,7 @@ ClangASTContext::GetChildClangTypeAtIndex
clang_type_t
ClangASTContext::GetChildClangTypeAtIndex
(
- ASTContext *ast_context,
+ ASTContext *ast,
const char *parent_name,
clang_type_t parent_clang_type,
uint32_t idx,
@@ -2195,7 +2400,7 @@ ClangASTContext::GetChildClangTypeAtIndex
if (parent_clang_type == NULL)
return NULL;
- if (idx < ClangASTContext::GetNumChildren (parent_clang_type, omit_empty_base_classes))
+ if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
{
uint32_t bit_offset;
child_bitfield_bit_size = 0;
@@ -2211,21 +2416,21 @@ ClangASTContext::GetChildClangTypeAtIndex
case clang::BuiltinType::ObjCId:
case clang::BuiltinType::ObjCClass:
child_name = "isa";
- child_byte_size = ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / CHAR_BIT;
- return ast_context->ObjCBuiltinClassTy.getAsOpaquePtr();
+ child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
+ return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
default:
break;
}
break;
-
case clang::Type::Record:
+ if (ClangASTContext::GetCompleteType (ast, parent_clang_type))
{
const RecordType *record_type = cast<RecordType>(parent_qual_type.getTypePtr());
const RecordDecl *record_decl = record_type->getDecl();
assert(record_decl);
- const ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
+ const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
uint32_t child_idx = 0;
const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
@@ -2265,7 +2470,7 @@ ClangASTContext::GetChildClangTypeAtIndex
child_name.assign(base_class_type_name.c_str());
- uint64_t clang_type_info_bit_size = ast_context->getTypeSize(base_class->getType());
+ uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
// Base classes biut sizes should be a multiple of 8 bits in size
assert (clang_type_info_bit_size % 8 == 0);
@@ -2291,7 +2496,7 @@ ClangASTContext::GetChildClangTypeAtIndex
// Figure out the type byte size (field_type_info.first) and
// alignment (field_type_info.second) from the AST context.
- std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(field->getType());
+ std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(field->getType());
assert(field_idx < record_layout.getFieldCount());
child_byte_size = field_type_info.first / 8;
@@ -2299,7 +2504,7 @@ ClangASTContext::GetChildClangTypeAtIndex
// Figure out the field offset within the current struct/union/class type
bit_offset = record_layout.getFieldOffset (field_idx);
child_byte_offset = bit_offset / 8;
- if (ClangASTContext::FieldIsBitfield (ast_context, *field, child_bitfield_bit_size))
+ if (ClangASTContext::FieldIsBitfield (ast, *field, child_bitfield_bit_size))
child_bitfield_bit_offset = bit_offset % 8;
return field->getType().getAsOpaquePtr();
@@ -2321,22 +2526,22 @@ ClangASTContext::GetChildClangTypeAtIndex
if (class_interface_decl)
{
- const ASTRecordLayout &interface_layout = ast_context->getASTObjCInterfaceLayout(class_interface_decl);
+ const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
if (superclass_interface_decl)
{
if (omit_empty_base_classes)
{
- if (ClangASTContext::GetNumChildren(ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
+ if (ClangASTContext::GetNumChildren(ast, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
{
if (idx == 0)
{
- QualType ivar_qual_type(ast_context->getObjCInterfaceType(superclass_interface_decl));
+ QualType ivar_qual_type(ast->getObjCInterfaceType(superclass_interface_decl));
child_name.assign(superclass_interface_decl->getNameAsString().c_str());
- std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
+ std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
child_byte_size = ivar_type_info.first / 8;
child_byte_offset = 0;
@@ -2368,7 +2573,7 @@ ClangASTContext::GetChildClangTypeAtIndex
child_name.assign(ivar_decl->getNameAsString().c_str());
- std::pair<uint64_t, unsigned> ivar_type_info = ast_context->getTypeInfo(ivar_qual_type.getTypePtr());
+ std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
child_byte_size = ivar_type_info.first / 8;
@@ -2393,7 +2598,7 @@ ClangASTContext::GetChildClangTypeAtIndex
if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetChildClangTypeAtIndex (ast_context,
+ return GetChildClangTypeAtIndex (ast,
parent_name,
pointer_type->getPointeeType().getAsOpaquePtr(),
idx,
@@ -2417,7 +2622,7 @@ ClangASTContext::GetChildClangTypeAtIndex
// We have a pointer to an simple type
if (idx == 0)
{
- std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
+ std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
assert(clang_type_info.first % 8 == 0);
child_byte_size = clang_type_info.first / 8;
child_byte_offset = 0;
@@ -2434,16 +2639,19 @@ ClangASTContext::GetChildClangTypeAtIndex
if (idx < element_count)
{
- std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
+ if (GetCompleteQualType (ast, array->getElementType()))
+ {
+ std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
- char element_name[64];
- ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
+ char element_name[64];
+ ::snprintf (element_name, sizeof (element_name), "[%u]", idx);
- child_name.assign(element_name);
- assert(field_type_info.first % 8 == 0);
- child_byte_size = field_type_info.first / 8;
- child_byte_offset = idx * child_byte_size;
- return array->getElementType().getAsOpaquePtr();
+ child_name.assign(element_name);
+ assert(field_type_info.first % 8 == 0);
+ child_byte_size = field_type_info.first / 8;
+ child_byte_offset = idx * child_byte_size;
+ return array->getElementType().getAsOpaquePtr();
+ }
}
}
break;
@@ -2459,7 +2667,7 @@ ClangASTContext::GetChildClangTypeAtIndex
if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetChildClangTypeAtIndex (ast_context,
+ return GetChildClangTypeAtIndex (ast,
parent_name,
pointer_type->getPointeeType().getAsOpaquePtr(),
idx,
@@ -2483,7 +2691,7 @@ ClangASTContext::GetChildClangTypeAtIndex
// We have a pointer to an simple type
if (idx == 0)
{
- std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
+ std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
assert(clang_type_info.first % 8 == 0);
child_byte_size = clang_type_info.first / 8;
child_byte_offset = 0;
@@ -2501,7 +2709,7 @@ ClangASTContext::GetChildClangTypeAtIndex
clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
{
- return GetChildClangTypeAtIndex (ast_context,
+ return GetChildClangTypeAtIndex (ast,
parent_name,
pointee_clang_type,
idx,
@@ -2525,7 +2733,7 @@ ClangASTContext::GetChildClangTypeAtIndex
// We have a pointer to an simple type
if (idx == 0)
{
- std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
+ std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
assert(clang_type_info.first % 8 == 0);
child_byte_size = clang_type_info.first / 8;
child_byte_offset = 0;
@@ -2536,7 +2744,7 @@ ClangASTContext::GetChildClangTypeAtIndex
break;
case clang::Type::Typedef:
- return GetChildClangTypeAtIndex (ast_context,
+ return GetChildClangTypeAtIndex (ast,
parent_name,
cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
idx,
@@ -2560,7 +2768,7 @@ ClangASTContext::GetChildClangTypeAtIndex
static inline bool
BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
{
- return ClangASTContext::RecordHasFields(cast<CXXRecordDecl>(b->getType()->getAs<RecordType>()->getDecl())) == false;
+ return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
}
static uint32_t
@@ -2734,7 +2942,7 @@ GetIndexForRecordChild
size_t
ClangASTContext::GetIndexOfChildMemberWithName
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t clang_type,
const char *name,
bool omit_empty_base_classes,
@@ -2748,6 +2956,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
switch (type_class)
{
case clang::Type::Record:
+ if (ClangASTContext::GetCompleteType (ast, clang_type))
{
const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
const RecordDecl *record_decl = record_type->getDecl();
@@ -2780,7 +2989,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
//const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
// Didn't find things easily, lets let clang do its thang...
- IdentifierInfo & ident_ref = ast_context->Idents.get(name, name + strlen (name));
+ IdentifierInfo & ident_ref = ast->Idents.get(name, name + strlen (name));
DeclarationName decl_name(&ident_ref);
CXXBasePaths paths;
@@ -2872,8 +3081,8 @@ ClangASTContext::GetIndexOfChildMemberWithName
// an ivar in our superclass...
child_indexes.push_back (0);
- if (GetIndexOfChildMemberWithName (ast_context,
- ast_context->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
+ if (GetIndexOfChildMemberWithName (ast,
+ ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
name,
omit_empty_base_classes,
child_indexes))
@@ -2895,7 +3104,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
case clang::Type::ObjCObjectPointer:
{
- return GetIndexOfChildMemberWithName (ast_context,
+ return GetIndexOfChildMemberWithName (ast,
cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes,
@@ -2911,7 +3120,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
//
// if (idx < element_count)
// {
-// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
+// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
//
// char element_name[32];
// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
@@ -2932,7 +3141,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
//
// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
// {
-// return GetIndexOfChildWithName (ast_context,
+// return GetIndexOfChildWithName (ast,
// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
// name);
// }
@@ -2947,7 +3156,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetIndexOfChildMemberWithName (ast_context,
+ return GetIndexOfChildMemberWithName (ast,
reference_type->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes,
@@ -2963,7 +3172,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetIndexOfChildMemberWithName (ast_context,
+ return GetIndexOfChildMemberWithName (ast,
pointer_type->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes,
@@ -2980,7 +3189,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
// // We have a pointer to an simple type
// if (idx == 0)
// {
-// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
+// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
// assert(clang_type_info.first % 8 == 0);
// child_byte_size = clang_type_info.first / 8;
// child_byte_offset = 0;
@@ -2991,7 +3200,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
break;
case clang::Type::Typedef:
- return GetIndexOfChildMemberWithName (ast_context,
+ return GetIndexOfChildMemberWithName (ast,
cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
name,
omit_empty_base_classes,
@@ -3012,7 +3221,7 @@ ClangASTContext::GetIndexOfChildMemberWithName
uint32_t
ClangASTContext::GetIndexOfChildWithName
(
- ASTContext *ast_context,
+ ASTContext *ast,
clang_type_t clang_type,
const char *name,
bool omit_empty_base_classes
@@ -3027,6 +3236,7 @@ ClangASTContext::GetIndexOfChildWithName
switch (type_class)
{
case clang::Type::Record:
+ if (ClangASTContext::GetCompleteType (ast, clang_type))
{
const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
const RecordDecl *record_decl = record_type->getDecl();
@@ -3110,7 +3320,7 @@ ClangASTContext::GetIndexOfChildWithName
case clang::Type::ObjCObjectPointer:
{
- return GetIndexOfChildWithName (ast_context,
+ return GetIndexOfChildWithName (ast,
cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes);
@@ -3124,7 +3334,7 @@ ClangASTContext::GetIndexOfChildWithName
//
// if (idx < element_count)
// {
-// std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(array->getElementType());
+// std::pair<uint64_t, unsigned> field_type_info = ast->getTypeInfo(array->getElementType());
//
// char element_name[32];
// ::snprintf (element_name, sizeof (element_name), "%s[%u]", parent_name ? parent_name : "", idx);
@@ -3145,7 +3355,7 @@ ClangASTContext::GetIndexOfChildWithName
//
// if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
// {
-// return GetIndexOfChildWithName (ast_context,
+// return GetIndexOfChildWithName (ast,
// mem_ptr_type->getPointeeType().getAsOpaquePtr(),
// name);
// }
@@ -3160,7 +3370,7 @@ ClangASTContext::GetIndexOfChildWithName
if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetIndexOfChildWithName (ast_context,
+ return GetIndexOfChildWithName (ast,
reference_type->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes);
@@ -3175,7 +3385,7 @@ ClangASTContext::GetIndexOfChildWithName
if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
{
- return GetIndexOfChildWithName (ast_context,
+ return GetIndexOfChildWithName (ast,
pointer_type->getPointeeType().getAsOpaquePtr(),
name,
omit_empty_base_classes);
@@ -3191,7 +3401,7 @@ ClangASTContext::GetIndexOfChildWithName
// // We have a pointer to an simple type
// if (idx == 0)
// {
-// std::pair<uint64_t, unsigned> clang_type_info = ast_context->getTypeInfo(pointee_type);
+// std::pair<uint64_t, unsigned> clang_type_info = ast->getTypeInfo(pointee_type);
// assert(clang_type_info.first % 8 == 0);
// child_byte_size = clang_type_info.first / 8;
// child_byte_offset = 0;
@@ -3202,7 +3412,7 @@ ClangASTContext::GetIndexOfChildWithName
break;
case clang::Type::Typedef:
- return GetIndexOfChildWithName (ast_context,
+ return GetIndexOfChildWithName (ast,
cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
name,
omit_empty_base_classes);
@@ -3293,10 +3503,10 @@ ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, const Declarat
// like maybe filling in the SourceLocation with it...
if (name)
{
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
if (decl_ctx == NULL)
- decl_ctx = ast_context->getTranslationUnitDecl();
- return NamespaceDecl::Create(*ast_context, decl_ctx, SourceLocation(), &ast_context->Idents.get(name));
+ decl_ctx = ast->getTranslationUnitDecl();
+ return NamespaceDecl::Create(*ast, decl_ctx, SourceLocation(), &ast->Idents.get(name));
}
return NULL;
}
@@ -3309,15 +3519,15 @@ ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t funct
{
if (name)
{
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
if (name && name[0])
{
- return FunctionDecl::Create(*ast_context,
- ast_context->getTranslationUnitDecl(),
+ return FunctionDecl::Create(*ast,
+ ast->getTranslationUnitDecl(),
SourceLocation(),
- DeclarationName (&ast_context->Idents.get(name)),
+ DeclarationName (&ast->Idents.get(name)),
QualType::getFromOpaquePtr(function_clang_type),
NULL,
(FunctionDecl::StorageClass)storage,
@@ -3326,8 +3536,8 @@ ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t funct
}
else
{
- return FunctionDecl::Create(*ast_context,
- ast_context->getTranslationUnitDecl(),
+ return FunctionDecl::Create(*ast,
+ ast->getTranslationUnitDecl(),
SourceLocation(),
DeclarationName (),
QualType::getFromOpaquePtr(function_clang_type),
@@ -3341,20 +3551,20 @@ ClangASTContext::CreateFunctionDeclaration (const char *name, clang_type_t funct
}
clang_type_t
-ClangASTContext::CreateFunctionType (ASTContext *ast_context,
+ClangASTContext::CreateFunctionType (ASTContext *ast,
clang_type_t result_type,
clang_type_t *args,
unsigned num_args,
bool is_variadic,
unsigned type_quals)
{
- assert (ast_context != NULL);
+ assert (ast != NULL);
std::vector<QualType> qual_type_args;
for (unsigned i=0; i<num_args; ++i)
qual_type_args.push_back (QualType::getFromOpaquePtr(args[i]));
// TODO: Detect calling convention in DWARF?
- return ast_context->getFunctionType(QualType::getFromOpaquePtr(result_type),
+ return ast->getFunctionType(QualType::getFromOpaquePtr(result_type),
qual_type_args.empty() ? NULL : &qual_type_args.front(),
qual_type_args.size(),
is_variadic,
@@ -3369,12 +3579,12 @@ ClangASTContext::CreateFunctionType (ASTContext *ast_context,
ParmVarDecl *
ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
{
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
- return ParmVarDecl::Create(*ast_context,
- ast_context->getTranslationUnitDecl(),
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
+ return ParmVarDecl::Create(*ast,
+ ast->getTranslationUnitDecl(),
SourceLocation(),
- name && name[0] ? &ast_context->Idents.get(name) : NULL,
+ name && name[0] ? &ast->Idents.get(name) : NULL,
QualType::getFromOpaquePtr(param_type),
NULL,
(VarDecl::StorageClass)storage,
@@ -3397,10 +3607,10 @@ ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_coun
{
if (element_type)
{
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
llvm::APInt ap_element_count (64, element_count);
- return ast_context->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
+ return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
ap_element_count,
ArrayType::Normal,
0).getAsOpaquePtr(); // ElemQuals
@@ -3473,17 +3683,17 @@ ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
unsigned NumPositiveBits = 1;
unsigned NumNegativeBits = 0;
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
QualType promotion_qual_type;
// If the enum integer type is less than an integer in bit width,
// then we must promote it to an integer size.
- if (ast_context->getTypeSize(enum_decl->getIntegerType()) < ast_context->getTypeSize(ast_context->IntTy))
+ if (ast->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
{
if (enum_decl->getIntegerType()->isSignedIntegerType())
- promotion_qual_type = ast_context->IntTy;
+ promotion_qual_type = ast->IntTy;
else
- promotion_qual_type = ast_context->UnsignedIntTy;
+ promotion_qual_type = ast->UnsignedIntTy;
}
else
promotion_qual_type = enum_decl->getIntegerType();
@@ -3510,17 +3720,17 @@ ClangASTContext::CreateEnumerationType
{
// TODO: Do something intelligent with the Declaration object passed in
// like maybe filling in the SourceLocation with it...
- ASTContext *ast_context = getASTContext();
- assert (ast_context != NULL);
+ ASTContext *ast = getASTContext();
+ assert (ast != NULL);
// TODO: ask about these...
// const bool IsScoped = false;
// const bool IsFixed = false;
- EnumDecl *enum_decl = EnumDecl::Create (*ast_context,
+ EnumDecl *enum_decl = EnumDecl::Create (*ast,
decl_ctx,
SourceLocation(),
- name && name[0] ? &ast_context->Idents.get(name) : NULL,
+ name && name[0] ? &ast->Idents.get(name) : NULL,
SourceLocation(),
NULL,
false, // IsScoped
@@ -3530,7 +3740,7 @@ ClangASTContext::CreateEnumerationType
{
// TODO: check if we should be setting the promotion type too?
enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
- return ast_context->getTagDeclType(enum_decl).getAsOpaquePtr();
+ return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
}
return NULL;
}
@@ -3568,10 +3778,10 @@ ClangASTContext::AddEnumerationValueToEnumerationType
{
// TODO: Do something intelligent with the Declaration object passed in
// like maybe filling in the SourceLocation with it...
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
IdentifierTable *identifier_table = getIdentifierTable();
- assert (ast_context != NULL);
+ assert (ast != NULL);
assert (identifier_table != NULL);
QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
@@ -3585,14 +3795,14 @@ ClangASTContext::AddEnumerationValueToEnumerationType
llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
enum_llvm_apsint = enum_value;
EnumConstantDecl *enumerator_decl =
- EnumConstantDecl::Create(*ast_context,
- enum_type->getDecl(),
- SourceLocation(),
- name ? &identifier_table->get(name) : NULL, // Identifier
- QualType::getFromOpaquePtr(enumerator_clang_type),
- NULL,
- enum_llvm_apsint);
-
+ EnumConstantDecl::Create (*ast,
+ enum_type->getDecl(),
+ SourceLocation(),
+ name ? &identifier_table->get(name) : NULL, // Identifier
+ QualType::getFromOpaquePtr(enumerator_clang_type),
+ NULL,
+ enum_llvm_apsint);
+
if (enumerator_decl)
{
enum_type->getDecl()->addDecl(enumerator_decl);
@@ -3663,8 +3873,8 @@ ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang
size_t
ClangASTContext::GetPointerBitSize ()
{
- ASTContext *ast_context = getASTContext();
- return ast_context->getTypeSize(ast_context->VoidPtrTy);
+ ASTContext *ast = getASTContext();
+ return ast->getTypeSize(ast->VoidPtrTy);
}
bool
@@ -3997,20 +4207,20 @@ ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, D
if (clang_type)
{
QualType qual_type (QualType::getFromOpaquePtr(clang_type));
- ASTContext *ast_context = getASTContext();
+ ASTContext *ast = getASTContext();
IdentifierTable *identifier_table = getIdentifierTable();
- assert (ast_context != NULL);
+ assert (ast != NULL);
assert (identifier_table != NULL);
if (decl_ctx == NULL)
- decl_ctx = ast_context->getTranslationUnitDecl();
- TypedefDecl *decl = TypedefDecl::Create(*ast_context,
- decl_ctx,
- SourceLocation(),
- name ? &identifier_table->get(name) : NULL, // Identifier
- ast_context->CreateTypeSourceInfo(qual_type));
+ decl_ctx = ast->getTranslationUnitDecl();
+ TypedefDecl *decl = TypedefDecl::Create (*ast,
+ decl_ctx,
+ SourceLocation(),
+ name ? &identifier_table->get(name) : NULL, // Identifier
+ ast->CreateTypeSourceInfo(qual_type));
// Get a uniqued QualType for the typedef decl type
- return ast_context->getTypedefType (decl).getAsOpaquePtr();
+ return ast->getTypedefType (decl).getAsOpaquePtr();
}
return NULL;
}
@@ -4044,7 +4254,7 @@ ClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
// so we can support remote targets. The code below also requires a patch to
// llvm::APInt.
//bool
-//ClangASTContext::ConvertFloatValueToString (ASTContext *ast_context, clang_type_t clang_type, const uint8_t* bytes, size_t byte_size, int apint_byte_order, std::string &float_str)
+//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)
//{
// uint32_t count = 0;
// bool is_complex = false;
@@ -4079,7 +4289,7 @@ ClangASTContext::GetTypeName (clang_type_t opaque_qual_type)
//}
size_t
-ClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
+ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
{
if (clang_type)
{
@@ -4093,9 +4303,9 @@ ClangASTContext::ConvertStringToFloatValue (ASTContext *ast_context, clang_type_
return false;
StringRef s_sref(s);
- APFloat ap_float(ast_context->getFloatTypeSemantics(qual_type), s_sref);
+ APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
- const uint64_t bit_size = ast_context->getTypeSize (qual_type);
+ const uint64_t bit_size = ast->getTypeSize (qual_type);
const uint64_t byte_size = bit_size / 8;
if (dst_size >= byte_size)
{
@@ -4126,3 +4336,21 @@ ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
return qual_type.getQualifiers().getCVRQualifiers();
}
+
+bool
+ClangASTContext::GetCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
+{
+ if (clang_type == NULL)
+ return false;
+
+ clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
+ return GetCompleteQualType (ast, qual_type);
+}
+
+
+bool
+ClangASTContext::GetCompleteType (clang_type_t clang_type)
+{
+ return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
+}
+
OpenPOWER on IntegriCloud