[Lldb-commits] [lldb] r167220 [3/3] - in /lldb/branches/windows: ./ include/lldb/ include/lldb/API/ include/lldb/Core/ scripts/ source/Expression/ source/Plugins/SymbolFile/DWARF/ source/Symbol/ source/Target/ tools/driver/

Carlo Kok ck at remobjects.com
Thu Nov 1 00:39:11 PDT 2012


Removed: lldb/branches/windows/source/Symbol/ClangASTContext.cpp.orig
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/windows/source/Symbol/ClangASTContext.cpp.orig?rev=167219&view=auto
==============================================================================
--- lldb/branches/windows/source/Symbol/ClangASTContext.cpp.orig (original)
+++ lldb/branches/windows/source/Symbol/ClangASTContext.cpp.orig (removed)
@@ -1,6449 +0,0 @@
-//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Symbol/ClangASTContext.h"
-
-// C Includes
-// C++ Includes
-#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
-
-#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
-#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"
-#include "clang/AST/DeclObjC.h"
-#include "clang/AST/DeclTemplate.h"
-#include "clang/AST/RecordLayout.h"
-#include "clang/AST/Type.h"
-#include "clang/Basic/Builtins.h"
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Basic/FileSystemOptions.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Basic/TargetInfo.h"
-#include "clang/Basic/TargetOptions.h"
-#include "clang/Frontend/FrontendOptions.h"
-#include "clang/Frontend/LangStandard.h"
-#include "clang/Basic/Version.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/ArchSpec.h"
-#include "lldb/Core/dwarf.h"
-#include "lldb/Core/Flags.h"
-#include "lldb/Core/Log.h"
-#include "lldb/Core/RegularExpression.h"
-#include "lldb/Expression/ASTDumper.h"
-#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
-#include "lldb/Symbol/VerifyDecl.h"
-#include "lldb/Target/ExecutionContext.h"
-#include "lldb/Target/Process.h"
-#include "lldb/Target/ObjCLanguageRuntime.h"
-
-
-#include <stdio.h>
-
-using namespace lldb;
-using namespace lldb_private;
-using namespace llvm;
-using namespace clang;
-
-
-static bool
-GetCompleteQualType (clang::ASTContext *ast, clang::QualType qual_type, bool allow_completion = true)
-{
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    case clang::Type::ConstantArray:
-        {
-            const clang::ArrayType *array_type = dyn_cast<clang::ArrayType>(qual_type.getTypePtr());
-            
-            if (array_type)
-                return GetCompleteQualType (ast, array_type->getElementType(), allow_completion);
-        }
-        break;
-            
-    case clang::Type::Record:
-    case clang::Type::Enum:
-        {
-            const 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->isCompleteDefinition())
-                        return true;
-                    
-                    if (!allow_completion)
-                        return false;
-
-                    if (tag_decl->hasExternalLexicalStorage())
-                    {
-                        if (ast)
-                        {
-                            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:
-        {
-            const 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...
-                if (class_interface_decl)
-                {
-                    if (class_interface_decl->getDefinition())
-                        return true;
-                    
-                    if (!allow_completion)
-                        return false;
-
-                    if (class_interface_decl->hasExternalLexicalStorage())
-                    {
-                        if (ast)
-                        {
-                            ExternalASTSource *external_ast_source = ast->getExternalSource();
-                            if (external_ast_source)
-                            {
-                                external_ast_source->CompleteType (class_interface_decl);
-                                return !objc_class_type->isIncompleteType();
-                            }
-                        }
-                    }
-                    return false;
-                }
-            }
-        }
-        break;
-
-    case clang::Type::Typedef:
-        return GetCompleteQualType (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType(), allow_completion);
-    
-    case clang::Type::Elaborated:
-        return GetCompleteQualType (ast, cast<ElaboratedType>(qual_type)->getNamedType(), allow_completion);
-
-    default:
-        break;
-    }
-
-    return true;
-}
-
-static AccessSpecifier
-ConvertAccessTypeToAccessSpecifier (AccessType access)
-{
-    switch (access)
-    {
-    default:               break;
-    case eAccessNone:      return AS_none;
-    case eAccessPublic:    return AS_public;
-    case eAccessPrivate:   return AS_private;
-    case eAccessProtected: return AS_protected;
-    }
-    return AS_none;
-}
-
-static ObjCIvarDecl::AccessControl
-ConvertAccessTypeToObjCIvarAccessControl (AccessType access)
-{
-    switch (access)
-    {
-    default:               break;
-    case eAccessNone:      return ObjCIvarDecl::None;
-    case eAccessPublic:    return ObjCIvarDecl::Public;
-    case eAccessPrivate:   return ObjCIvarDecl::Private;
-    case eAccessProtected: return ObjCIvarDecl::Protected;
-    case eAccessPackage:   return ObjCIvarDecl::Package;
-    }
-    return ObjCIvarDecl::None;
-}
-
-
-static void
-ParseLangArgs
-(
-    LangOptions &Opts,
-    InputKind IK
-)
-{
-    // FIXME: Cleanup per-file based stuff.
-
-    // Set some properties which depend soley on the input kind; it would be nice
-    // to move these to the language standard, and have the driver resolve the
-    // input kind + language standard.
-    if (IK == IK_Asm) {
-        Opts.AsmPreprocessor = 1;
-    } else if (IK == IK_ObjC ||
-               IK == IK_ObjCXX ||
-               IK == IK_PreprocessedObjC ||
-               IK == IK_PreprocessedObjCXX) {
-        Opts.ObjC1 = Opts.ObjC2 = 1;
-    }
-
-    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
-
-    if (LangStd == LangStandard::lang_unspecified) {
-        // Based on the base language, pick one.
-        switch (IK) {
-            case IK_None:
-            case IK_AST:
-            case IK_LLVM_IR:
-                assert (!"Invalid input kind!");
-            case IK_OpenCL:
-                LangStd = LangStandard::lang_opencl;
-                break;
-            case IK_CUDA:
-                LangStd = LangStandard::lang_cuda;
-                break;
-            case IK_Asm:
-            case IK_C:
-            case IK_PreprocessedC:
-            case IK_ObjC:
-            case IK_PreprocessedObjC:
-                LangStd = LangStandard::lang_gnu99;
-                break;
-            case IK_CXX:
-            case IK_PreprocessedCXX:
-            case IK_ObjCXX:
-            case IK_PreprocessedObjCXX:
-                LangStd = LangStandard::lang_gnucxx98;
-                break;
-        }
-    }
-
-    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
-    Opts.BCPLComment = Std.hasBCPLComments();
-    Opts.C99 = Std.isC99();
-    Opts.CPlusPlus = Std.isCPlusPlus();
-    Opts.CPlusPlus0x = Std.isCPlusPlus0x();
-    Opts.Digraphs = Std.hasDigraphs();
-    Opts.GNUMode = Std.isGNUMode();
-    Opts.GNUInline = !Std.isC99();
-    Opts.HexFloats = Std.hasHexFloats();
-    Opts.ImplicitInt = Std.hasImplicitInt();
-
-    // OpenCL has some additional defaults.
-    if (LangStd == LangStandard::lang_opencl) {
-        Opts.OpenCL = 1;
-        Opts.AltiVec = 1;
-        Opts.CXXOperatorNames = 1;
-        Opts.LaxVectorConversions = 1;
-    }
-
-    // OpenCL and C++ both have bool, true, false keywords.
-    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
-
-//    if (Opts.CPlusPlus)
-//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
-//
-//    if (Args.hasArg(OPT_fobjc_gc_only))
-//        Opts.setGCMode(LangOptions::GCOnly);
-//    else if (Args.hasArg(OPT_fobjc_gc))
-//        Opts.setGCMode(LangOptions::HybridGC);
-//
-//    if (Args.hasArg(OPT_print_ivar_layout))
-//        Opts.ObjCGCBitmapPrint = 1;
-//
-//    if (Args.hasArg(OPT_faltivec))
-//        Opts.AltiVec = 1;
-//
-//    if (Args.hasArg(OPT_pthread))
-//        Opts.POSIXThreads = 1;
-//
-//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
-//                                          "default");
-//    if (Vis == "default")
-        Opts.setVisibilityMode(DefaultVisibility);
-//    else if (Vis == "hidden")
-//        Opts.setVisibilityMode(LangOptions::Hidden);
-//    else if (Vis == "protected")
-//        Opts.setVisibilityMode(LangOptions::Protected);
-//    else
-//        Diags.Report(diag::err_drv_invalid_value)
-//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
-
-//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
-
-    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
-    // is specified, or -std is set to a conforming mode.
-    Opts.Trigraphs = !Opts.GNUMode;
-//    if (Args.hasArg(OPT_trigraphs))
-//        Opts.Trigraphs = 1;
-//
-//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
-//                                     OPT_fno_dollars_in_identifiers,
-//                                     !Opts.AsmPreprocessor);
-//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
-//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
-//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
-//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
-//        Opts.LaxVectorConversions = 0;
-//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
-//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
-//    Opts.Blocks = Args.hasArg(OPT_fblocks);
-//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
-//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
-//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
-//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
-//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
-//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
-//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
-//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
-//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
-//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
-//                                                 Diags);
-//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
-//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
-//                                                   OPT_fconstant_string_class);
-//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
-//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
-//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
-//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
-//    Opts.Static = Args.hasArg(OPT_static_define);
-    Opts.OptimizeSize = 0;
-
-    // FIXME: Eliminate this dependency.
-//    unsigned Opt =
-//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
-//    Opts.Optimize = Opt != 0;
-    unsigned Opt = 0;
-
-    // This is the __NO_INLINE__ define, which just depends on things like the
-    // optimization level and -fno-inline, not actually whether the backend has
-    // inlining enabled.
-    //
-    // FIXME: This is affected by other options (-fno-inline).
-<<<<<<< .working
-#if (CLANG_VERSION_MAJOR <= 3 && CLANG_VERSION_MINOR < 2)
-    Opts.NoInline = !Opt;
-=======
-    Opts.NoInlineDefine = !Opt;
->>>>>>> .merge-right.r164814
-#endif
-
-//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
-//    switch (SSP) {
-//        default:
-//            Diags.Report(diag::err_drv_invalid_value)
-//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
-//            break;
-//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
-//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
-//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
-//    }
-}
-
-
-ClangASTContext::ClangASTContext (const char *target_triple) :   
-    m_target_triple(),
-    m_ast_ap(),
-    m_language_options_ap(),
-    m_source_manager_ap(),
-    m_diagnostics_engine_ap(),
-    m_target_options_ap(),
-    m_target_info_ap(),
-    m_identifier_table_ap(),
-    m_selector_table_ap(),
-    m_builtins_ap(),
-    m_callback_tag_decl (NULL),
-    m_callback_objc_decl (NULL),
-    m_callback_baton (NULL)
-
-{
-    if (target_triple && target_triple[0])
-        SetTargetTriple (target_triple);
-}
-
-//----------------------------------------------------------------------
-// Destructor
-//----------------------------------------------------------------------
-ClangASTContext::~ClangASTContext()
-{
-    m_builtins_ap.reset();
-    m_selector_table_ap.reset();
-    m_identifier_table_ap.reset();
-    m_target_info_ap.reset();
-    m_target_options_ap.reset();
-    m_diagnostics_engine_ap.reset();
-    m_source_manager_ap.reset();
-    m_language_options_ap.reset();
-    m_ast_ap.reset();
-}
-
-
-void
-ClangASTContext::Clear()
-{
-    m_ast_ap.reset();
-    m_language_options_ap.reset();
-    m_source_manager_ap.reset();
-    m_diagnostics_engine_ap.reset();
-    m_target_options_ap.reset();
-    m_target_info_ap.reset();
-    m_identifier_table_ap.reset();
-    m_selector_table_ap.reset();
-    m_builtins_ap.reset();
-}
-
-const char *
-ClangASTContext::GetTargetTriple ()
-{
-    return m_target_triple.c_str();
-}
-
-void
-ClangASTContext::SetTargetTriple (const char *target_triple)
-{
-    Clear();
-    m_target_triple.assign(target_triple);
-}
-
-void
-ClangASTContext::SetArchitecture (const ArchSpec &arch)
-{
-    SetTargetTriple(arch.GetTriple().str().c_str());
-}
-
-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_ap.get() == NULL)
-    {
-        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
-                                       *getSourceManager(),
-                                       getTargetInfo(),
-                                       *getIdentifierTable(),
-                                       *getSelectorTable(),
-                                       *getBuiltinContext(),
-                                       0));
-        
-        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(getDiagnosticConsumer(), false);
-    }
-    return m_ast_ap.get();
-}
-
-Builtin::Context *
-ClangASTContext::getBuiltinContext()
-{
-    if (m_builtins_ap.get() == NULL)
-        m_builtins_ap.reset (new Builtin::Context());
-    return m_builtins_ap.get();
-}
-
-IdentifierTable *
-ClangASTContext::getIdentifierTable()
-{
-    if (m_identifier_table_ap.get() == NULL)
-        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
-    return m_identifier_table_ap.get();
-}
-
-LangOptions *
-ClangASTContext::getLanguageOptions()
-{
-    if (m_language_options_ap.get() == NULL)
-    {
-        m_language_options_ap.reset(new LangOptions());
-        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
-//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
-    }
-    return m_language_options_ap.get();
-}
-
-SelectorTable *
-ClangASTContext::getSelectorTable()
-{
-    if (m_selector_table_ap.get() == NULL)
-        m_selector_table_ap.reset (new SelectorTable());
-    return m_selector_table_ap.get();
-}
-
-clang::FileManager *
-ClangASTContext::getFileManager()
-{
-    if (m_file_manager_ap.get() == NULL)
-    {
-        clang::FileSystemOptions file_system_options;
-        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
-    }
-    return m_file_manager_ap.get();
-}
-
-clang::SourceManager *
-ClangASTContext::getSourceManager()
-{
-    if (m_source_manager_ap.get() == NULL)
-        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
-    return m_source_manager_ap.get();
-}
-
-clang::DiagnosticsEngine *
-ClangASTContext::getDiagnosticsEngine()
-{
-    if (m_diagnostics_engine_ap.get() == NULL)
-    {
-        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
-        m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp));
-    }
-    return m_diagnostics_engine_ap.get();
-}
-
-class NullDiagnosticConsumer : public DiagnosticConsumer
-{
-public:
-    NullDiagnosticConsumer ()
-    {
-        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
-    }
-    
-    void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
-    {
-        if (m_log)
-        {
-            llvm::SmallVector<char, 32> diag_str(10);
-            info.FormatDiagnostic(diag_str);
-            diag_str.push_back('\0');
-            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
-        }
-    }
-    
-    DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
-    {
-        return new NullDiagnosticConsumer ();
-    }
-private:
-    LogSP m_log;
-};
-
-DiagnosticConsumer *
-ClangASTContext::getDiagnosticConsumer()
-{
-    if (m_diagnostic_consumer_ap.get() == NULL)
-        m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
-    
-    return m_diagnostic_consumer_ap.get();
-}
-
-TargetOptions *
-ClangASTContext::getTargetOptions()
-{
-    if (m_target_options_ap.get() == NULL && !m_target_triple.empty())
-    {
-        m_target_options_ap.reset (new TargetOptions());
-        if (m_target_options_ap.get())
-            m_target_options_ap->Triple = m_target_triple;
-    }
-    return m_target_options_ap.get();
-}
-
-
-TargetInfo *
-ClangASTContext::getTargetInfo()
-{
-    // target_triple should be something like "x86_64-apple-macosx"
-    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
-        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), *getTargetOptions()));
-    return m_target_info_ap.get();
-}
-
-#pragma mark Basic Types
-
-static inline bool
-QualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
-{
-    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
-    if (qual_type_bit_size == bit_size)
-        return true;
-    return false;
-}
-
-clang_type_t
-ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
-{
-    ASTContext *ast = getASTContext();
-
-    assert (ast != NULL);
-
-    return GetBuiltinTypeForEncodingAndBitSize (ast, encoding, bit_size);
-}
-
-clang_type_t
-ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
-{
-    if (!ast)
-        return NULL;
-    
-    switch (encoding)
-    {
-    case eEncodingInvalid:
-        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
-            return ast->VoidPtrTy.getAsOpaquePtr();
-        break;
-        
-    case eEncodingUint:
-        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, 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, 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:
-        // Sanity check that bit_size is a multiple of 8's.
-        if (bit_size && !(bit_size & 0x7u))
-            return ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8).getAsOpaquePtr();
-        break;
-    default:
-        break;
-    }
-    
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
-{
-    ASTContext *ast = getASTContext();
-    
-#define streq(a,b) strcmp(a,b) == 0
-    assert (ast != NULL);
-    if (ast)
-    {
-        switch (dw_ate)
-        {
-            default:
-                break;
-                
-            case DW_ATE_address:
-                if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
-                    return ast->VoidPtrTy.getAsOpaquePtr();
-                break;
-                
-            case DW_ATE_boolean:
-                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:
-                // This has been seen to mean DW_AT_complex_integer
-                if (type_name)
-                {
-                    if (::strstr(type_name, "complex"))
-                    {
-                        clang_type_t complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
-                        return ast->getComplexType (QualType::getFromOpaquePtr(complex_int_clang_type)).getAsOpaquePtr();
-                    }
-                }
-                break;
-                
-            case DW_ATE_complex_float:
-                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->getComplexType (QualType::getFromOpaquePtr(complex_float_clang_type)).getAsOpaquePtr();
-                }
-                break;
-                
-            case DW_ATE_float:
-                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:
-                if (type_name)
-                {
-                    if (streq(type_name, "wchar_t") &&
-                        QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
-                        return ast->WCharTy.getAsOpaquePtr();
-                    if (streq(type_name, "void") &&
-                        QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
-                        return ast->VoidTy.getAsOpaquePtr();
-                    if (strstr(type_name, "long long") &&
-                        QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
-                        return ast->LongLongTy.getAsOpaquePtr();
-                    if (strstr(type_name, "long") &&
-                        QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
-                        return ast->LongTy.getAsOpaquePtr();
-                    if (strstr(type_name, "short") &&
-                        QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
-                        return ast->ShortTy.getAsOpaquePtr();
-                    if (strstr(type_name, "char"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
-                            return ast->CharTy.getAsOpaquePtr();
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
-                            return ast->SignedCharTy.getAsOpaquePtr();
-                    }
-                    if (strstr(type_name, "int"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
-                            return ast->IntTy.getAsOpaquePtr();
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
-                            return ast->Int128Ty.getAsOpaquePtr();
-                    }
-                }
-                // We weren't able to match up a type name, just search by size
-                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:
-                if (type_name)
-                {
-                    if (streq(type_name, "signed char"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
-                            return ast->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:
-                if (type_name)
-                {
-                    if (strstr(type_name, "long long"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
-                            return ast->UnsignedLongLongTy.getAsOpaquePtr();
-                    }
-                    else if (strstr(type_name, "long"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
-                            return ast->UnsignedLongTy.getAsOpaquePtr();
-                    }
-                    else if (strstr(type_name, "short"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
-                            return ast->UnsignedShortTy.getAsOpaquePtr();
-                    }
-                    else if (strstr(type_name, "char"))
-                    {
-                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
-                            return ast->UnsignedCharTy.getAsOpaquePtr();
-                    }
-                    else if (strstr(type_name, "int"))
-                    {
-                        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, 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, ast->UnsignedCharTy))
-                    return ast->UnsignedCharTy.getAsOpaquePtr();
-                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
-                    return ast->UnsignedShortTy.getAsOpaquePtr();
-                break;
-                
-            case DW_ATE_imaginary_float:
-                break;
-                
-            case DW_ATE_UTF:
-                if (type_name)
-                {
-                    if (streq(type_name, "char16_t"))
-                    {
-                        return ast->Char16Ty.getAsOpaquePtr();
-                    }
-                    else if (streq(type_name, "char32_t"))
-                    {
-                        return ast->Char32Ty.getAsOpaquePtr();
-                    }
-                }
-                break;
-        }
-    }
-    // This assert should fire for anything that we don't catch above so we know
-    // to fix any issues we run into.
-    if (type_name)
-    {
-        Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type '%s' encoded with DW_ATE = 0x%x, bit_size = %u\n", type_name, dw_ate, bit_size);
-    }
-    else
-    {
-        Host::SystemLog (Host::eSystemLogError, "error: need to add support for DW_TAG_base_type encoded with DW_ATE = 0x%x, bit_size = %u\n", dw_ate, bit_size);
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetBuiltInType_void(ASTContext *ast)
-{
-    return ast->VoidTy.getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetBuiltInType_bool()
-{
-    return getASTContext()->BoolTy.getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetBuiltInType_objc_id()
-{
-    return getASTContext()->getObjCIdType().getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetBuiltInType_objc_Class()
-{
-    return getASTContext()->getObjCClassType().getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetBuiltInType_objc_selector()
-{
-    return getASTContext()->getObjCSelType().getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
-{
-    return ast->UnknownAnyTy.getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetCStringType (bool is_const)
-{
-    QualType char_type(getASTContext()->CharTy);
-    
-    if (is_const)
-        char_type.addConst();
-    
-    return getASTContext()->getPointerType(char_type).getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetVoidType()
-{
-    return GetVoidType(getASTContext());
-}
-
-clang_type_t
-ClangASTContext::GetVoidType(ASTContext *ast)
-{
-    return ast->VoidTy.getAsOpaquePtr();
-}
-
-clang_type_t
-ClangASTContext::GetVoidPtrType (bool is_const)
-{
-    return GetVoidPtrType(getASTContext(), is_const);
-}
-
-clang_type_t
-ClangASTContext::GetVoidPtrType (ASTContext *ast, bool is_const)
-{
-    QualType void_ptr_type(ast->VoidPtrTy);
-    
-    if (is_const)
-        void_ptr_type.addConst();
-    
-    return void_ptr_type.getAsOpaquePtr();
-}
-
-clang::DeclContext *
-ClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
-{
-    return ast->getTranslationUnitDecl();
-}
-
-clang_type_t
-ClangASTContext::CopyType (ASTContext *dst_ast, 
-                           ASTContext *src_ast,
-                           clang_type_t clang_type)
-{
-    FileSystemOptions file_system_options;
-    FileManager file_manager (file_system_options);
-    ASTImporter importer(*dst_ast, file_manager,
-                         *src_ast, file_manager,
-                         false);
-    
-    QualType src (QualType::getFromOpaquePtr(clang_type));
-    QualType dst (importer.Import(src));
-    
-    return dst.getAsOpaquePtr();
-}
-
-
-clang::Decl *
-ClangASTContext::CopyDecl (ASTContext *dst_ast, 
-                           ASTContext *src_ast,
-                           clang::Decl *source_decl)
-{    
-    FileSystemOptions file_system_options;
-    FileManager file_manager (file_system_options);
-    ASTImporter importer(*dst_ast, file_manager,
-                         *src_ast, file_manager,
-                         false);
-    
-    return importer.Import(source_decl);
-}
-
-bool
-ClangASTContext::AreTypesSame (ASTContext *ast,
-                               clang_type_t type1,
-                               clang_type_t type2,
-                               bool ignore_qualifiers)
-{
-    if (type1 == type2)
-        return true;
-
-    QualType type1_qual = QualType::getFromOpaquePtr(type1);
-    QualType type2_qual = QualType::getFromOpaquePtr(type2);
-    
-    if (ignore_qualifiers)
-    {
-        type1_qual = type1_qual.getUnqualifiedType();
-        type2_qual = type2_qual.getUnqualifiedType();
-    }
-    
-    return ast->hasSameType (type1_qual,
-                             type2_qual);
-}
-
-#pragma mark CVR modifiers
-
-clang_type_t
-ClangASTContext::AddConstModifier (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType result(QualType::getFromOpaquePtr(clang_type));
-        result.addConst();
-        return result.getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::AddRestrictModifier (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType result(QualType::getFromOpaquePtr(clang_type));
-        result.getQualifiers().setRestrict (true);
-        return result.getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::AddVolatileModifier (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType result(QualType::getFromOpaquePtr(clang_type));
-        result.getQualifiers().setVolatile (true);
-        return result.getAsOpaquePtr();
-    }
-    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 (DeclContext *decl_ctx, AccessType access_type, const char *name, int kind, LanguageType language, uint64_t metadata)
-{
-    ASTContext *ast = getASTContext();
-    assert (ast != NULL);
-     
-    if (decl_ctx == NULL)
-        decl_ctx = ast->getTranslationUnitDecl();
-
-
-    if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
-    {
-        bool isForwardDecl = true;
-        bool isInternal = false;
-        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
-    }
-
-    // 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.
-    CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
-                                                 (TagDecl::TagKind)kind,
-                                                 decl_ctx,
-                                                 SourceLocation(),
-                                                 SourceLocation(),
-                                                 name && name[0] ? &ast->Idents.get(name) : NULL);
-    
-    if (decl)
-        SetMetadata(ast, (uintptr_t)decl, metadata);
-    
-    if (decl_ctx)
-    {
-        if (access_type != eAccessNone)
-            decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
-        decl_ctx->addDecl (decl);
-    }
-    return ast->getTagDeclType(decl).getAsOpaquePtr();
-}
-
-static TemplateParameterList *
-CreateTemplateParameterList (ASTContext *ast, 
-                             const ClangASTContext::TemplateParameterInfos &template_param_infos,
-                             llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
-{
-    const bool parameter_pack = false;
-    const bool is_typename = false;
-    const unsigned depth = 0;
-    const size_t num_template_params = template_param_infos.GetSize();
-    for (size_t i=0; i<num_template_params; ++i)
-    {
-        const char *name = template_param_infos.names[i];
-<<<<<<< .working
-        if (template_param_infos.args[i].getAsIntegral().getBoolValue())
-=======
-        if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
->>>>>>> .merge-right.r164814
-        {
-            template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
-                                                                             ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
-                                                                             SourceLocation(), 
-                                                                             SourceLocation(), 
-                                                                             depth, 
-                                                                             i,
-                                                                             &ast->Idents.get(name), 
-                                                                             template_param_infos.args[i].getIntegralType(), 
-                                                                             parameter_pack, 
-                                                                             NULL));
-            
-        }
-        else
-        {
-            template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast, 
-                                                                          ast->getTranslationUnitDecl(), // Is this the right decl context?
-                                                                          SourceLocation(),
-                                                                          SourceLocation(),
-                                                                          depth, 
-                                                                          i,
-                                                                          &ast->Idents.get(name), 
-                                                                          is_typename,
-                                                                          parameter_pack));
-        }
-    }
-
-    TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
-                                                                                SourceLocation(),
-                                                                                SourceLocation(),
-                                                                                &template_param_decls.front(),
-                                                                                template_param_decls.size(),
-                                                                                SourceLocation());
-    return template_param_list;
-}
-
-clang::FunctionTemplateDecl *
-ClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
-                                             clang::FunctionDecl *func_decl,
-                                             const char *name, 
-                                             const TemplateParameterInfos &template_param_infos)
-{
-//    /// \brief Create a function template node.
-    ASTContext *ast = getASTContext();
-    
-    llvm::SmallVector<NamedDecl *, 8> template_param_decls;
-
-    TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
-                                                                              template_param_infos, 
-                                                                              template_param_decls);
-    FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
-                                                                         decl_ctx,
-                                                                         func_decl->getLocation(),
-                                                                         func_decl->getDeclName(),
-                                                                         template_param_list,
-                                                                         func_decl);
-    
-    for (size_t i=0, template_param_decl_count = template_param_decls.size();
-         i < template_param_decl_count;
-         ++i)
-    {
-        // TODO: verify which decl context we should put template_param_decls into..
-        template_param_decls[i]->setDeclContext (func_decl); 
-    }
-
-    return func_tmpl_decl;
-}
-
-void
-ClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl, 
-                                                           clang::FunctionTemplateDecl *func_tmpl_decl,
-                                                           const TemplateParameterInfos &infos)
-{
-    TemplateArgumentList template_args (TemplateArgumentList::OnStack,
-                                        infos.args.data(), 
-                                        infos.args.size());
-
-    func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
-                                                  &template_args,
-                                                  NULL);
-}
-
-
-ClassTemplateDecl *
-ClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
-                                          lldb::AccessType access_type,
-                                          const char *class_name, 
-                                          int kind, 
-                                          const TemplateParameterInfos &template_param_infos)
-{
-    ASTContext *ast = getASTContext();
-    
-    ClassTemplateDecl *class_template_decl = NULL;
-    if (decl_ctx == NULL)
-        decl_ctx = ast->getTranslationUnitDecl();
-    
-    IdentifierInfo &identifier_info = ast->Idents.get(class_name);
-    DeclarationName decl_name (&identifier_info);
-
-    clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
-    for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos) 
-    {
-        class_template_decl = dyn_cast<clang::ClassTemplateDecl>(*pos);
-        if (class_template_decl)
-            return class_template_decl;
-    }
-
-    llvm::SmallVector<NamedDecl *, 8> template_param_decls;
-
-    TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
-                                                                              template_param_infos, 
-                                                                              template_param_decls);
-
-    CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
-                                                              (TagDecl::TagKind)kind,
-                                                              decl_ctx,  // What decl context do we use here? TU? The actual decl context?
-                                                              SourceLocation(),
-                                                              SourceLocation(),
-                                                              &identifier_info);
-
-    for (size_t i=0, template_param_decl_count = template_param_decls.size();
-         i < template_param_decl_count;
-         ++i)
-    {
-        template_param_decls[i]->setDeclContext (template_cxx_decl);
-    }
-
-    // With templated classes, we say that a class is templated with
-    // specializations, but that the bare class has no functions.
-    template_cxx_decl->startDefinition();
-    template_cxx_decl->completeDefinition();
-    
-    class_template_decl = ClassTemplateDecl::Create (*ast,
-                                                     decl_ctx,  // What decl context do we use here? TU? The actual decl context?
-                                                     SourceLocation(),
-                                                     decl_name,
-                                                     template_param_list,
-                                                     template_cxx_decl,
-                                                     NULL);
-    
-    if (class_template_decl)
-    {
-        if (access_type != eAccessNone)
-            class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
-        
-        //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
-        //    CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
-        
-        decl_ctx->addDecl (class_template_decl);
-        
-#ifdef LLDB_CONFIGURATION_DEBUG
-        VerifyDecl(class_template_decl);
-#endif
-    }
-
-    return class_template_decl;
-}
-
-
-ClassTemplateSpecializationDecl *
-ClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
-                                                        ClassTemplateDecl *class_template_decl,
-                                                        int kind,
-                                                        const TemplateParameterInfos &template_param_infos)
-{
-    ASTContext *ast = getASTContext();
-    ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast, 
-                                                                                                                   (TagDecl::TagKind)kind,
-                                                                                                                   decl_ctx,
-                                                                                                                   SourceLocation(), 
-                                                                                                                   SourceLocation(),
-                                                                                                                   class_template_decl,
-                                                                                                                   &template_param_infos.args.front(),
-                                                                                                                   template_param_infos.args.size(),
-                                                                                                                   NULL);
-    
-    return class_template_specialization_decl;
-}
-
-lldb::clang_type_t
-ClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
-{
-    if (class_template_specialization_decl)
-    {
-        ASTContext *ast = getASTContext();
-        if (ast)
-            return ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-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:
-        {
-            const 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)
-                {
-                    class_interface_decl->setHasExternalLexicalStorage (has_extern);
-                    class_interface_decl->setHasExternalVisibleStorage (has_extern);
-                    return true;
-                }
-            }
-        }
-        break;
-
-    case clang::Type::Typedef:
-        return ClangASTContext::SetHasExternalStorage (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), has_extern);
-    
-    case clang::Type::Elaborated:
-        return ClangASTContext::SetHasExternalStorage (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), has_extern);
-
-    default:
-        break;
-    }
-    return false;
-}
-
-static bool
-IsOperator (const char *name, OverloadedOperatorKind &op_kind)
-{
-    if (name == NULL || name[0] == '\0')
-        return false;
-    
-#define OPERATOR_PREFIX "operator"
-#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
-    
-    const char *post_op_name = NULL;
-
-    bool no_space = true;
-    
-    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
-        return false;
-    
-    post_op_name = name + OPERATOR_PREFIX_LENGTH;
-    
-    if (post_op_name[0] == ' ')
-    {
-        post_op_name++;
-        no_space = false;
-    }
-    
-#undef OPERATOR_PREFIX
-#undef OPERATOR_PREFIX_LENGTH
-    
-    // This is an operator, set the overloaded operator kind to invalid
-    // in case this is a conversion operator...
-    op_kind = NUM_OVERLOADED_OPERATORS;
-
-    switch (post_op_name[0])
-    {
-    default:
-        if (no_space)
-            return false;
-        break;
-    case 'n':
-        if (no_space)
-            return false;
-        if  (strcmp (post_op_name, "new") == 0)  
-            op_kind = OO_New;
-        else if (strcmp (post_op_name, "new[]") == 0)  
-            op_kind = OO_Array_New;
-        break;
-
-    case 'd':
-        if (no_space)
-            return false;
-        if (strcmp (post_op_name, "delete") == 0)
-            op_kind = OO_Delete;
-        else if (strcmp (post_op_name, "delete[]") == 0)  
-            op_kind = OO_Array_Delete;
-        break;
-    
-    case '+':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Plus;
-        else if (post_op_name[2] == '\0')
-        {
-            if (post_op_name[1] == '=')
-                op_kind = OO_PlusEqual;
-            else if (post_op_name[1] == '+')
-                op_kind = OO_PlusPlus;
-        }
-        break;
-
-    case '-':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Minus;
-        else if (post_op_name[2] == '\0')
-        {
-            switch (post_op_name[1])
-            {
-            case '=': op_kind = OO_MinusEqual; break;
-            case '-': op_kind = OO_MinusMinus; break;
-            case '>': op_kind = OO_Arrow; break;
-            }
-        }
-        else if (post_op_name[3] == '\0')
-        {
-            if (post_op_name[2] == '*')
-                op_kind = OO_ArrowStar; break;
-        }
-        break;
-        
-    case '*':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Star;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_StarEqual;
-        break;
-    
-    case '/':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Slash;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_SlashEqual;
-        break;
-    
-    case '%':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Percent;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_PercentEqual;
-        break;
-
-
-    case '^':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Caret;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_CaretEqual;
-        break;
-
-    case '&':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Amp;
-        else if (post_op_name[2] == '\0')
-        {
-            switch (post_op_name[1])
-            {
-            case '=': op_kind = OO_AmpEqual; break;
-            case '&': op_kind = OO_AmpAmp; break;
-            }   
-        }
-        break;
-
-    case '|':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Pipe;
-        else if (post_op_name[2] == '\0')
-        {
-            switch (post_op_name[1])
-            {
-            case '=': op_kind = OO_PipeEqual; break;
-            case '|': op_kind = OO_PipePipe; break;
-            }   
-        }
-        break;
-    
-    case '~':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Tilde;
-        break;
-    
-    case '!':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Exclaim;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_ExclaimEqual;
-        break;
-
-    case '=':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Equal;
-        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
-            op_kind = OO_EqualEqual;
-        break;
-    
-    case '<':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Less;
-        else if (post_op_name[2] == '\0')
-        {
-            switch (post_op_name[1])
-            {
-            case '<': op_kind = OO_LessLess; break;
-            case '=': op_kind = OO_LessEqual; break;
-            }   
-        }
-        else if (post_op_name[3] == '\0')
-        {
-            if (post_op_name[2] == '=')
-                op_kind = OO_LessLessEqual;
-        }
-        break;
-
-    case '>':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Greater;
-        else if (post_op_name[2] == '\0')
-        {
-            switch (post_op_name[1])
-            {
-            case '>': op_kind = OO_GreaterGreater; break;
-            case '=': op_kind = OO_GreaterEqual; break;
-            }   
-        }
-        else if (post_op_name[1] == '>' && 
-                 post_op_name[2] == '=' && 
-                 post_op_name[3] == '\0')
-        {
-                op_kind = OO_GreaterGreaterEqual;
-        }
-        break;
-        
-    case ',':
-        if (post_op_name[1] == '\0')
-            op_kind = OO_Comma;
-        break;
-    
-    case '(':
-        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
-            op_kind = OO_Call;
-        break;
-    
-    case '[':
-        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
-            op_kind = OO_Subscript;
-        break;
-    }
-
-    return true;
-}
-
-static inline bool
-check_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
-{
-    // Special-case call since it can take any number of operands
-    if(op_kind == OO_Call)
-        return true;
-    
-    // The parameter count doens't include "this"
-    if (num_params == 0)
-        return unary;
-    if (num_params == 1)
-        return binary;
-    else 
-    return false;
-}
-
-bool
-ClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
-{
-    switch (op_kind)
-    {
-    default:
-        break;
-    // C++ standard allows any number of arguments to new/delete
-    case OO_New:
-    case OO_Array_New:
-    case OO_Delete:
-    case OO_Array_Delete:
-        return true;
-    }
-    
-#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
-    switch (op_kind)
-    {
-#include "clang/Basic/OperatorKinds.def"
-        default: break;
-    }
-    return false;
-}
-
-CXXMethodDecl *
-ClangASTContext::AddMethodToCXXRecordType
-(
-    ASTContext *ast,
-    clang_type_t record_opaque_type,
-    const char *name,
-    clang_type_t method_opaque_type,
-    lldb::AccessType access,
-    bool is_virtual,
-    bool is_static,
-    bool is_inline,
-    bool is_explicit,
-    bool is_attr_used,
-    bool is_artificial
-)
-{
-    if (!record_opaque_type || !method_opaque_type || !name)
-        return NULL;
-    
-    assert(ast);
-    
-    IdentifierTable *identifier_table = &ast->Idents;
-    
-    assert(identifier_table);
-    
-    QualType record_qual_type(QualType::getFromOpaquePtr(record_opaque_type));
-
-    CXXRecordDecl *cxx_record_decl = record_qual_type->getAsCXXRecordDecl();
-    
-    if (cxx_record_decl == NULL)
-        return NULL;
-    
-    QualType method_qual_type (QualType::getFromOpaquePtr (method_opaque_type));
-    
-    CXXMethodDecl *cxx_method_decl = NULL;
-    
-    DeclarationName decl_name (&identifier_table->get(name));
-
-    const clang::FunctionType *function_Type = dyn_cast<FunctionType>(method_qual_type.getTypePtr());
-    
-    if (function_Type == NULL)
-        return NULL;
-
-    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(function_Type));
-    
-    if (!method_function_prototype)
-        return NULL;
-    
-    unsigned int num_params = method_function_prototype->getNumArgs();
-    
-    CXXDestructorDecl *cxx_dtor_decl(NULL);
-    CXXConstructorDecl *cxx_ctor_decl(NULL);
-    
-    if (name[0] == '~')
-    {
-        cxx_dtor_decl = CXXDestructorDecl::Create (*ast,
-                                                   cxx_record_decl,
-                                                   SourceLocation(),
-                                                   DeclarationNameInfo (ast->DeclarationNames.getCXXDestructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
-                                                   method_qual_type,
-                                                   NULL,
-                                                   is_inline,
-                                                   is_artificial);
-        cxx_method_decl = cxx_dtor_decl;
-    }
-    else if (decl_name == cxx_record_decl->getDeclName())
-    {
-       cxx_ctor_decl = CXXConstructorDecl::Create (*ast,
-                                                   cxx_record_decl,
-                                                   SourceLocation(),
-                                                   DeclarationNameInfo (ast->DeclarationNames.getCXXConstructorName (ast->getCanonicalType (record_qual_type)), SourceLocation()),
-                                                   method_qual_type,
-                                                   NULL, // TypeSourceInfo *
-                                                   is_explicit, 
-                                                   is_inline,
-                                                   is_artificial,
-                                                   false /*is_constexpr*/);
-        cxx_method_decl = cxx_ctor_decl;
-    }
-    else
-    {   
-    
-        OverloadedOperatorKind op_kind = NUM_OVERLOADED_OPERATORS;
-        if (IsOperator (name, op_kind))
-        {
-            if (op_kind != NUM_OVERLOADED_OPERATORS)
-            {
-                // Check the number of operator parameters. Sometimes we have 
-                // seen bad DWARF that doesn't correctly describe operators and
-                // if we try to create a methed and add it to the class, clang
-                // will assert and crash, so we need to make sure things are
-                // acceptable.
-                if (!ClangASTContext::CheckOverloadedOperatorKindParameterCount (op_kind, num_params))
-                    return NULL;
-                cxx_method_decl = CXXMethodDecl::Create (*ast,
-                                                         cxx_record_decl,
-                                                         SourceLocation(),
-                                                         DeclarationNameInfo (ast->DeclarationNames.getCXXOperatorName (op_kind), SourceLocation()),
-                                                         method_qual_type,
-                                                         NULL, // TypeSourceInfo *
-                                                         is_static,
-                                                         SC_None,
-                                                         is_inline,
-                                                         false /*is_constexpr*/,
-                                                         SourceLocation());
-            }
-            else if (num_params == 0)
-            {
-                // Conversion operators don't take params...
-                cxx_method_decl = CXXConversionDecl::Create (*ast,
-                                                             cxx_record_decl,
-                                                             SourceLocation(),
-                                                             DeclarationNameInfo (ast->DeclarationNames.getCXXConversionFunctionName (ast->getCanonicalType (function_Type->getResultType())), SourceLocation()),
-                                                             method_qual_type,
-                                                             NULL, // TypeSourceInfo *
-                                                             is_inline,
-                                                             is_explicit,
-                                                             false /*is_constexpr*/,
-                                                             SourceLocation());
-            }
-        }
-        
-        if (cxx_method_decl == NULL)
-        {
-            cxx_method_decl = CXXMethodDecl::Create (*ast,
-                                                     cxx_record_decl,
-                                                     SourceLocation(),
-                                                     DeclarationNameInfo (decl_name, SourceLocation()),
-                                                     method_qual_type,
-                                                     NULL, // TypeSourceInfo *
-                                                     is_static,
-                                                     SC_None,
-                                                     is_inline,
-                                                     false /*is_constexpr*/,
-                                                     SourceLocation());
-        }
-    }
-
-    AccessSpecifier access_specifier = ConvertAccessTypeToAccessSpecifier (access);
-    
-    cxx_method_decl->setAccess (access_specifier);
-    cxx_method_decl->setVirtualAsWritten (is_virtual);
-    
-    if (is_attr_used)
-        cxx_method_decl->addAttr(::new (*ast) UsedAttr(SourceRange(), *ast));
-    
-    // Populate the method decl with parameter decls
-    
-    llvm::SmallVector<ParmVarDecl *, 12> params;
-    
-    for (int param_index = 0;
-         param_index < num_params;
-         ++param_index)
-    {
-        params.push_back (ParmVarDecl::Create (*ast,
-                                               cxx_method_decl,
-                                               SourceLocation(),
-                                               SourceLocation(),
-                                               NULL, // anonymous
-                                               method_function_prototype->getArgType(param_index), 
-                                               NULL,
-                                               SC_None,
-                                               SC_None,
-                                               NULL));
-    }
-    
-    cxx_method_decl->setParams (ArrayRef<ParmVarDecl*>(params));
-    
-    cxx_record_decl->addDecl (cxx_method_decl);
-    
-    // Sometimes the debug info will mention a constructor (default/copy/move), 
-    // destructor, or assignment operator (copy/move) but there won't be any
-    // version of this in the code. So we check if the function was artificially
-    // generated and if it is trivial and this lets the compiler/backend know
-    // that it can inline the IR for these when it needs to and we can avoid a
-    // "missing function" error when running expressions.
-    
-    if (is_artificial)
-    {
-        if (cxx_ctor_decl && 
-            ((cxx_ctor_decl->isDefaultConstructor() && cxx_record_decl->hasTrivialDefaultConstructor ()) ||
-             (cxx_ctor_decl->isCopyConstructor()    && cxx_record_decl->hasTrivialCopyConstructor    ()) ||
-             (cxx_ctor_decl->isMoveConstructor()    && cxx_record_decl->hasTrivialMoveConstructor    ()) ))
-        {
-            cxx_ctor_decl->setDefaulted();
-            cxx_ctor_decl->setTrivial(true);
-        }
-        else if (cxx_dtor_decl)
-        {
-            if (cxx_record_decl->hasTrivialDestructor())
-            {
-                cxx_dtor_decl->setDefaulted();
-                cxx_dtor_decl->setTrivial(true);
-            }
-        }
-        else if ((cxx_method_decl->isCopyAssignmentOperator() && cxx_record_decl->hasTrivialCopyAssignment()) ||
-                 (cxx_method_decl->isMoveAssignmentOperator() && cxx_record_decl->hasTrivialMoveAssignment()))
-        {
-            cxx_method_decl->setDefaulted();
-            cxx_method_decl->setTrivial(true);
-        }
-    }
-    
-#ifdef LLDB_CONFIGURATION_DEBUG
-    VerifyDecl(cxx_method_decl);
-#endif
-
-//    printf ("decl->isPolymorphic()             = %i\n", cxx_record_decl->isPolymorphic());
-//    printf ("decl->isAggregate()               = %i\n", cxx_record_decl->isAggregate());
-//    printf ("decl->isPOD()                     = %i\n", cxx_record_decl->isPOD());
-//    printf ("decl->isEmpty()                   = %i\n", cxx_record_decl->isEmpty());
-//    printf ("decl->isAbstract()                = %i\n", cxx_record_decl->isAbstract());
-//    printf ("decl->hasTrivialConstructor()     = %i\n", cxx_record_decl->hasTrivialConstructor());
-//    printf ("decl->hasTrivialCopyConstructor() = %i\n", cxx_record_decl->hasTrivialCopyConstructor());
-//    printf ("decl->hasTrivialCopyAssignment()  = %i\n", cxx_record_decl->hasTrivialCopyAssignment());
-//    printf ("decl->hasTrivialDestructor()      = %i\n", cxx_record_decl->hasTrivialDestructor());
-    return cxx_method_decl;
-}
-
-clang::FieldDecl *
-ClangASTContext::AddFieldToRecordType 
-(
-    ASTContext *ast,
-    clang_type_t record_clang_type, 
-    const char *name, 
-    clang_type_t field_type, 
-    AccessType access, 
-    uint32_t bitfield_bit_size
-)
-{
-    if (record_clang_type == NULL || field_type == NULL)
-        return NULL;
-
-    FieldDecl *field = NULL;
-    IdentifierTable *identifier_table = &ast->Idents;
-
-    assert (ast != NULL);
-    assert (identifier_table != NULL);
-
-    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
-
-    const clang::Type *clang_type = record_qual_type.getTypePtr();
-    if (clang_type)
-    {
-        const RecordType *record_type = dyn_cast<RecordType>(clang_type);
-
-        if (record_type)
-        {
-            RecordDecl *record_decl = record_type->getDecl();
-
-            clang::Expr *bit_width = NULL;
-            if (bitfield_bit_size != 0)
-            {
-                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());
-            }
-            field = FieldDecl::Create (*ast,
-<<<<<<< .working
-                                                  record_decl,
-                                                  SourceLocation(),
-                                                  SourceLocation(),
-                                                  name ? &identifier_table->get(name) : NULL, // Identifier
-                                                  QualType::getFromOpaquePtr(field_type), // Field type
-                                                  NULL,       // TInfo *
-                                                  bit_width,  // BitWidth
-                                                  false,      // Mutable
-                                                  ICIS_NoInit); // HasInit
-=======
-                                       record_decl,
-                                       SourceLocation(),
-                                       SourceLocation(),
-                                       name ? &identifier_table->get(name) : NULL, // Identifier
-                                       QualType::getFromOpaquePtr(field_type), // Field type
-                                       NULL,            // TInfo *
-                                       bit_width,       // BitWidth
-                                       false,           // Mutable
-                                       ICIS_NoInit);    // HasInit
->>>>>>> .merge-right.r164814
-            
-            if (!name) {
-                // Determine whether this field corresponds to an anonymous
-                // struct or union.
-                if (const TagType *TagT = field->getType()->getAs<TagType>()) {
-                  if (RecordDecl *Rec = dyn_cast<RecordDecl>(TagT->getDecl()))
-                    if (!Rec->getDeclName()) {
-                      Rec->setAnonymousStructOrUnion(true);
-                      field->setImplicit();
-
-                    }
-                }
-            }
-
-            field->setAccess (ConvertAccessTypeToAccessSpecifier (access));
-
-            if (field)
-            {
-                record_decl->addDecl(field);
-                
-#ifdef LLDB_CONFIGURATION_DEBUG
-                VerifyDecl(field);
-#endif
-            }
-        }
-        else
-        {
-            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(clang_type);
-            if (objc_class_type)
-            {
-                bool is_synthesized = false;
-                field = ClangASTContext::AddObjCClassIVar (ast,
-                                                   record_clang_type,
-                                                   name,
-                                                   field_type,
-                                                   access,
-                                                   bitfield_bit_size,
-                                                   is_synthesized);
-            }
-        }
-    }
-    return field;
-}
-
-static clang::AccessSpecifier UnifyAccessSpecifiers (clang::AccessSpecifier lhs,
-                                                     clang::AccessSpecifier rhs)
-{
-    clang::AccessSpecifier ret = lhs;
-    
-    // Make the access equal to the stricter of the field and the nested field's access
-    switch (ret)
-    {
-        case clang::AS_none:
-            break;
-        case clang::AS_private:
-            break;
-        case clang::AS_protected:
-            if (rhs == AS_private)
-                ret = AS_private;
-            break;
-        case clang::AS_public:
-            ret = rhs;
-            break;
-    }
-    
-    return ret;
-}
-
-void
-ClangASTContext::BuildIndirectFields (clang::ASTContext *ast,
-                                      lldb::clang_type_t record_clang_type)
-{
-    QualType record_qual_type(QualType::getFromOpaquePtr(record_clang_type));
-
-    const RecordType *record_type = record_qual_type->getAs<RecordType>();
-    
-    if (!record_type)
-        return;
-    
-    RecordDecl *record_decl = record_type->getDecl();
-    
-    if (!record_decl)
-        return;
-    
-    typedef llvm::SmallVector <IndirectFieldDecl *, 1> IndirectFieldVector;
-    
-    IndirectFieldVector indirect_fields;
-    
-    for (RecordDecl::field_iterator fi = record_decl->field_begin(), fe = record_decl->field_end();
-         fi != fe;
-         ++fi)
-    {
-        if (fi->isAnonymousStructOrUnion())
-        {
-            QualType field_qual_type = fi->getType();
-            
-            const RecordType *field_record_type = field_qual_type->getAs<RecordType>();
-            
-            if (!field_record_type)
-                continue;
-            
-            RecordDecl *field_record_decl = field_record_type->getDecl();
-            
-            if (!field_record_decl)
-                continue;
-            
-            for (RecordDecl::decl_iterator di = field_record_decl->decls_begin(), de = field_record_decl->decls_end();
-                 di != de;
-                 ++di)
-            {
-                if (FieldDecl *nested_field_decl = dyn_cast<FieldDecl>(*di))
-                {
-                    NamedDecl **chain = new (*ast) NamedDecl*[2];
-                    chain[0] = *fi;
-                    chain[1] = nested_field_decl;
-                    IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
-                                                                                  record_decl,
-                                                                                  SourceLocation(),
-                                                                                  nested_field_decl->getIdentifier(),
-                                                                                  nested_field_decl->getType(),
-                                                                                  chain,
-                                                                                  2);
-                    
-                    indirect_field->setAccess(UnifyAccessSpecifiers(fi->getAccess(),
-                                                                    nested_field_decl->getAccess()));
-                    
-                    indirect_fields.push_back(indirect_field);
-                }
-                else if (IndirectFieldDecl *nested_indirect_field_decl = dyn_cast<IndirectFieldDecl>(*di))
-                {
-                    int nested_chain_size = nested_indirect_field_decl->getChainingSize();
-                    NamedDecl **chain = new (*ast) NamedDecl*[nested_chain_size + 1];
-                    chain[0] = *fi;
-                    
-                    int chain_index = 1;
-                    for (IndirectFieldDecl::chain_iterator nci = nested_indirect_field_decl->chain_begin(),
-                         nce = nested_indirect_field_decl->chain_end();
-                         nci < nce;
-                         ++nci)
-                    {
-                        chain[chain_index] = *nci;
-                        chain_index++;
-                    }
-                    
-                    IndirectFieldDecl *indirect_field = IndirectFieldDecl::Create(*ast,
-                                                                                  record_decl,
-                                                                                  SourceLocation(),
-                                                                                  nested_indirect_field_decl->getIdentifier(),
-                                                                                  nested_indirect_field_decl->getType(),
-                                                                                  chain,
-                                                                                  nested_chain_size + 1);
-                                        
-                    indirect_field->setAccess(UnifyAccessSpecifiers(fi->getAccess(),
-                                                                    nested_indirect_field_decl->getAccess()));
-                    
-                    indirect_fields.push_back(indirect_field);
-                }
-            }
-        }
-    }
-    
-    for (IndirectFieldVector::iterator ifi = indirect_fields.begin(), ife = indirect_fields.end();
-         ifi < ife;
-         ++ifi)
-    {
-        record_decl->addDecl(*ifi);
-    }
-}
-
-bool
-ClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
-{
-    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
-}
-
-bool
-ClangASTContext::FieldIsBitfield
-(
-    ASTContext *ast,
-    FieldDecl* field,
-    uint32_t& bitfield_bit_size
-)
-{
-    if (ast == NULL || field == NULL)
-        return false;
-
-    if (field->isBitField())
-    {
-        Expr* bit_width_expr = field->getBitWidth();
-        if (bit_width_expr)
-        {
-            llvm::APSInt bit_width_apsint;
-            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
-            {
-                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
-                return true;
-            }
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::RecordHasFields (const RecordDecl *record_decl)
-{
-    if (record_decl == NULL)
-        return false;
-
-    if (!record_decl->field_empty())
-        return true;
-
-    // No fields, lets check this is a CXX record and check the base classes
-    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-    if (cxx_record_decl)
-    {
-        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-             base_class != base_class_end;
-             ++base_class)
-        {
-            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-            if (RecordHasFields(base_class_decl))
-                return true;
-        }
-    }
-    return false;
-}
-
-void
-ClangASTContext::SetDefaultAccessForRecordFields (clang_type_t clang_type, int default_accessibility, int *assigned_accessibilities, size_t num_assigned_accessibilities)
-{
-    if (clang_type)
-    {
-        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-
-        const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
-        if (record_type)
-        {
-            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)
-                {
-                    // 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);
-                }
-            }
-        }
-    }
-}
-
-#pragma mark C++ Base Classes
-
-CXXBaseSpecifier *
-ClangASTContext::CreateBaseClassSpecifier (clang_type_t base_class_type, AccessType access, bool is_virtual, bool base_of_class)
-{
-    if (base_class_type)
-        return new CXXBaseSpecifier (SourceRange(), 
-                                     is_virtual, 
-                                     base_of_class, 
-                                     ConvertAccessTypeToAccessSpecifier (access), 
-                                     getASTContext()->CreateTypeSourceInfo (QualType::getFromOpaquePtr(base_class_type)),
-                                     SourceLocation());
-    return NULL;
-}
-
-void
-ClangASTContext::DeleteBaseClassSpecifiers (CXXBaseSpecifier **base_classes, unsigned num_base_classes)
-{
-    for (unsigned i=0; i<num_base_classes; ++i)
-    {
-        delete base_classes[i];
-        base_classes[i] = NULL;
-    }
-}
-
-bool
-ClangASTContext::SetBaseClassesForClassType (clang_type_t class_clang_type, CXXBaseSpecifier const * const *base_classes, unsigned num_base_classes)
-{
-    if (class_clang_type)
-    {
-        CXXRecordDecl *cxx_record_decl = QualType::getFromOpaquePtr(class_clang_type)->getAsCXXRecordDecl();
-        if (cxx_record_decl)
-        {
-            cxx_record_decl->setBases(base_classes, num_base_classes);
-            return true;
-        }
-    }
-    return false;
-}
-#pragma mark Objective C Classes
-
-clang_type_t
-ClangASTContext::CreateObjCClass
-(
-    const char *name, 
-    DeclContext *decl_ctx, 
-    bool isForwardDecl, 
-    bool isInternal,
-    uint64_t metadata
-)
-{
-    ASTContext *ast = getASTContext();
-    assert (ast != NULL);
-    assert (name && name[0]);
-    if (decl_ctx == NULL)
-        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,
-                                                         decl_ctx,
-                                                         SourceLocation(),
-                                                         &ast->Idents.get(name),
-                                                         NULL,
-                                                         SourceLocation(),
-                                                         /*isForwardDecl,*/
-                                                         isInternal);
-    
-    if (decl)
-        SetMetadata(ast, (uintptr_t)decl, metadata);
-    
-    return ast->getObjCInterfaceType(decl).getAsOpaquePtr();
-}
-
-bool
-ClangASTContext::SetObjCSuperClass (clang_type_t class_opaque_type, clang_type_t super_opaque_type)
-{
-    if (class_opaque_type && super_opaque_type)
-    {
-        QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
-        QualType super_qual_type(QualType::getFromOpaquePtr(super_opaque_type));
-        const clang::Type *class_type = class_qual_type.getTypePtr();
-        const clang::Type *super_type = super_qual_type.getTypePtr();
-        if (class_type && super_type)
-        {
-            const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
-            const ObjCObjectType *objc_super_type = dyn_cast<ObjCObjectType>(super_type);
-            if (objc_class_type && objc_super_type)
-            {
-                ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                ObjCInterfaceDecl *super_interface_decl = objc_super_type->getInterface();
-                if (class_interface_decl && super_interface_decl)
-                {
-                    class_interface_decl->setSuperClass(super_interface_decl);
-                    return true;
-                }
-            }
-        }
-    }
-    return false;
-}
-
-
-FieldDecl *
-ClangASTContext::AddObjCClassIVar 
-(
-    ASTContext *ast,
-    clang_type_t class_opaque_type, 
-    const char *name, 
-    clang_type_t ivar_opaque_type, 
-    AccessType access, 
-    uint32_t bitfield_bit_size, 
-    bool is_synthesized
-)
-{
-    if (class_opaque_type == NULL || ivar_opaque_type == NULL)
-        return NULL;
-
-    ObjCIvarDecl *field = NULL;
-    
-    IdentifierTable *identifier_table = &ast->Idents;
-
-    assert (ast != NULL);
-    assert (identifier_table != NULL);
-
-    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
-
-    const clang::Type *class_type = class_qual_type.getTypePtr();
-    if (class_type)
-    {
-        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
-
-        if (objc_class_type)
-        {
-            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-            
-            if (class_interface_decl)
-            {
-                clang::Expr *bit_width = NULL;
-                if (bitfield_bit_size != 0)
-                {
-                    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());
-                }
-                
-                field = ObjCIvarDecl::Create (*ast,
-                                              class_interface_decl,
-                                              SourceLocation(),
-                                              SourceLocation(),
-                                              &identifier_table->get(name), // Identifier
-                                              QualType::getFromOpaquePtr(ivar_opaque_type), // Field type
-                                              NULL, // TypeSourceInfo *
-                                              ConvertAccessTypeToObjCIvarAccessControl (access),
-                                              bit_width,
-                                              is_synthesized);
-                
-                if (field)
-                {
-                    class_interface_decl->addDecl(field);
-                    
-#ifdef LLDB_CONFIGURATION_DEBUG
-                    VerifyDecl(field);
-#endif
-                    
-                    return field;
-                }
-            }
-        }
-    }
-    return NULL;
-}
-
-bool
-ClangASTContext::AddObjCClassProperty 
-(
-    ASTContext *ast,
-    clang_type_t class_opaque_type, 
-    const char *property_name,
-    clang_type_t property_opaque_type,  
-    ObjCIvarDecl *ivar_decl,
-    const char *property_setter_name,
-    const char *property_getter_name,
-    uint32_t property_attributes,
-    uint64_t metadata
-)
-{
-    if (class_opaque_type == NULL || property_name == NULL || property_name[0] == '\0')
-        return false;
-
-    IdentifierTable *identifier_table = &ast->Idents;
-
-    assert (ast != NULL);
-    assert (identifier_table != NULL);
-
-    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
-    const clang::Type *class_type = class_qual_type.getTypePtr();
-    if (class_type)
-    {
-        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
-
-        if (objc_class_type)
-        {
-            ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-            
-            clang_type_t property_opaque_type_to_access = NULL;
-            
-            if (property_opaque_type)
-                property_opaque_type_to_access = property_opaque_type;
-            else if (ivar_decl)
-                property_opaque_type_to_access = ivar_decl->getType().getAsOpaquePtr();
-                        
-            if (class_interface_decl && property_opaque_type_to_access)
-            {
-                clang::TypeSourceInfo *prop_type_source;
-                if (ivar_decl)
-                    prop_type_source = ast->CreateTypeSourceInfo (ivar_decl->getType());
-                else
-                    prop_type_source = ast->CreateTypeSourceInfo (QualType::getFromOpaquePtr(property_opaque_type));
-                
-                ObjCPropertyDecl *property_decl = ObjCPropertyDecl::Create(*ast, 
-                                                                           class_interface_decl, 
-                                                                           SourceLocation(), // Source Location
-                                                                           &identifier_table->get(property_name),
-                                                                           SourceLocation(), //Source Location for AT
-                                                                           SourceLocation(), //Source location for (
-                                                                           prop_type_source
-                                                                           );
-                
-                if (property_decl)
-                {
-                    SetMetadata(ast, (uintptr_t)property_decl, metadata);
-                    
-                    class_interface_decl->addDecl (property_decl);
-                    
-                    Selector setter_sel, getter_sel;
-                    
-                    if (property_setter_name != NULL)
-                    {
-                        std::string property_setter_no_colon(property_setter_name, strlen(property_setter_name) - 1);
-                        clang::IdentifierInfo *setter_ident = &identifier_table->get(property_setter_no_colon.c_str());
-                        setter_sel = ast->Selectors.getSelector(1, &setter_ident);
-                    }
-                    else if (!(property_attributes & DW_APPLE_PROPERTY_readonly))
-                    {
-                        std::string setter_sel_string("set");
-                        setter_sel_string.push_back(::toupper(property_name[0]));
-                        setter_sel_string.append(&property_name[1]);
-                        clang::IdentifierInfo *setter_ident = &identifier_table->get(setter_sel_string.c_str());
-                        setter_sel = ast->Selectors.getSelector(1, &setter_ident);
-                    }
-                    property_decl->setSetterName(setter_sel);
-                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_setter);
-                    
-                    if (property_getter_name != NULL)
-                    {
-                        clang::IdentifierInfo *getter_ident = &identifier_table->get(property_getter_name);
-                        getter_sel = ast->Selectors.getSelector(0, &getter_ident);
-                    }
-                    else
-                    {
-                        clang::IdentifierInfo *getter_ident = &identifier_table->get(property_name);
-                        getter_sel = ast->Selectors.getSelector(0, &getter_ident);
-                    }
-                    property_decl->setGetterName(getter_sel);
-                    property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_getter);
-                        
-                    if (ivar_decl)
-                        property_decl->setPropertyIvarDecl (ivar_decl);
-                        
-                    if (property_attributes & DW_APPLE_PROPERTY_readonly) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readonly);
-                    if (property_attributes & DW_APPLE_PROPERTY_readwrite) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_readwrite);
-                    if (property_attributes & DW_APPLE_PROPERTY_assign) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_assign);
-                    if (property_attributes & DW_APPLE_PROPERTY_retain) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_retain);
-                    if (property_attributes & DW_APPLE_PROPERTY_copy) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_copy);
-                    if (property_attributes & DW_APPLE_PROPERTY_nonatomic) 
-                        property_decl->setPropertyAttributes (clang::ObjCPropertyDecl::OBJC_PR_nonatomic);
-                        
-                    if (!getter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(getter_sel))
-                    {
-                        QualType result_type = QualType::getFromOpaquePtr(property_opaque_type_to_access);
-                        
-                        const bool isInstance = true;
-                        const bool isVariadic = false;
-                        const bool isSynthesized = false;
-                        const bool isImplicitlyDeclared = true;
-                        const bool isDefined = false;
-                        const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
-                        const bool HasRelatedResultType = false;
-                        
-                        ObjCMethodDecl *getter = ObjCMethodDecl::Create(*ast, 
-                                                                        SourceLocation(), 
-                                                                        SourceLocation(), 
-                                                                        getter_sel, 
-                                                                        result_type,
-                                                                        NULL, 
-                                                                        class_interface_decl,
-                                                                        isInstance,
-                                                                        isVariadic,
-                                                                        isSynthesized,
-                                                                        isImplicitlyDeclared,
-                                                                        isDefined,
-                                                                        impControl,
-                                                                        HasRelatedResultType);
-                        
-                        if (getter)
-                            SetMetadata(ast, (uintptr_t)getter, metadata);
-                                                
-                        getter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(), ArrayRef<SourceLocation>());
-                        
-                        class_interface_decl->addDecl(getter);
-                    }
-                    
-                    if (!setter_sel.isNull() && !class_interface_decl->lookupInstanceMethod(setter_sel))
-                    {
-                        QualType result_type = ast->VoidTy;
-                        
-                        const bool isInstance = true;
-                        const bool isVariadic = false;
-                        const bool isSynthesized = false;
-                        const bool isImplicitlyDeclared = true;
-                        const bool isDefined = false;
-                        const ObjCMethodDecl::ImplementationControl impControl = ObjCMethodDecl::None;
-                        const bool HasRelatedResultType = false;
-                        
-                        ObjCMethodDecl *setter = ObjCMethodDecl::Create(*ast, 
-                                                                        SourceLocation(), 
-                                                                        SourceLocation(), 
-                                                                        setter_sel, 
-                                                                        result_type,
-                                                                        NULL, 
-                                                                        class_interface_decl,
-                                                                        isInstance,
-                                                                        isVariadic,
-                                                                        isSynthesized,
-                                                                        isImplicitlyDeclared,
-                                                                        isDefined,
-                                                                        impControl,
-                                                                        HasRelatedResultType);
-                        
-                        if (setter)
-                            SetMetadata(ast, (uintptr_t)setter, metadata);
-                        
-                        llvm::SmallVector<ParmVarDecl *, 1> params;
-
-                        params.push_back (ParmVarDecl::Create (*ast,
-                                                               setter,
-                                                               SourceLocation(),
-                                                               SourceLocation(),
-                                                               NULL, // anonymous
-                                                               QualType::getFromOpaquePtr(property_opaque_type_to_access), 
-                                                               NULL,
-                                                               SC_Auto, 
-                                                               SC_Auto,
-                                                               NULL));
-                        
-                        setter->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
-                        
-                        class_interface_decl->addDecl(setter);
-                    }
-
-                    return true;
-                }
-            }
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::ObjCTypeHasIVars (clang_type_t class_opaque_type, bool check_superclass)
-{
-    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
-
-    const clang::Type *class_type = class_qual_type.getTypePtr();
-    if (class_type)
-    {
-        const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
-
-        if (objc_class_type)
-            return ObjCDeclHasIVars (objc_class_type->getInterface(), check_superclass);
-    }
-    return false;            
-}
-
-bool
-ClangASTContext::ObjCDeclHasIVars (ObjCInterfaceDecl *class_interface_decl, bool check_superclass)
-{
-    while (class_interface_decl)
-    {
-        if (class_interface_decl->ivar_size() > 0)
-            return true;
-        
-        if (check_superclass)
-            class_interface_decl = class_interface_decl->getSuperClass();
-        else
-            break;
-    }
-    return false;            
-}
-
-ObjCMethodDecl *
-ClangASTContext::AddMethodToObjCObjectType
-(
-    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,
-    lldb::AccessType access
-)
-{
-    if (class_opaque_type == NULL || method_opaque_type == NULL)
-        return NULL;
-
-    IdentifierTable *identifier_table = &ast->Idents;
-
-    assert (ast != NULL);
-    assert (identifier_table != NULL);
-
-    QualType class_qual_type(QualType::getFromOpaquePtr(class_opaque_type));
-
-    const clang::Type *class_type = class_qual_type.getTypePtr();
-    if (class_type == NULL)
-        return NULL;
-
-    const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(class_type);
-
-    if (objc_class_type == NULL)
-        return NULL;
-
-    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-            
-    if (class_interface_decl == NULL)
-        return NULL;
-    
-    const char *selector_start = ::strchr (name, ' ');
-    if (selector_start == NULL)
-        return NULL;
-    
-    selector_start++;
-    if (!(::isalpha (selector_start[0]) || selector_start[0] == '_'))
-        return NULL;
-    llvm::SmallVector<IdentifierInfo *, 12> selector_idents;
-
-    size_t len = 0;
-    const char *start;
-    //printf ("name = '%s'\n", name);
-
-    unsigned num_selectors_with_args = 0;
-    for (start = selector_start;
-         start && *start != '\0' && *start != ']';
-         start += len)
-    {
-        len = ::strcspn(start, ":]");
-        bool has_arg = (start[len] == ':');
-        if (has_arg)
-            ++num_selectors_with_args;
-        selector_idents.push_back (&identifier_table->get (StringRef (start, len)));
-        if (has_arg)
-            len += 1;
-    }
-
-    
-    if (selector_idents.size() == 0)
-        return 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));
-
-    // Populate the method decl with parameter decls
-    const clang::Type *method_type(method_qual_type.getTypePtr());
-    
-    if (method_type == NULL)
-        return NULL;
-    
-    const FunctionProtoType *method_function_prototype (dyn_cast<FunctionProtoType>(method_type));
-    
-    if (!method_function_prototype)
-        return NULL;
-    
-
-    bool is_variadic = false;
-    bool is_synthesized = false;
-    bool is_defined = false;
-    ObjCMethodDecl::ImplementationControl imp_control = ObjCMethodDecl::None;
-
-    const unsigned num_args = method_function_prototype->getNumArgs();
-
-    ObjCMethodDecl *objc_method_decl = ObjCMethodDecl::Create (*ast,
-                                                               SourceLocation(), // beginLoc,
-                                                               SourceLocation(), // endLoc, 
-                                                               method_selector,
-                                                               method_function_prototype->getResultType(),
-                                                               NULL, // TypeSourceInfo *ResultTInfo,
-                                                               GetDeclContextForType (class_opaque_type),
-                                                               name[0] == '-',
-                                                               is_variadic,
-                                                               is_synthesized,
-                                                               true, // is_implicitly_declared
-                                                               is_defined,
-                                                               imp_control,
-                                                               false /*has_related_result_type*/);
-
-
-    if (objc_method_decl == NULL)
-        return NULL;
-
-    if (num_args > 0)
-    {
-        llvm::SmallVector<ParmVarDecl *, 12> params;
-            
-        for (int param_index = 0; param_index < num_args; ++param_index)
-        {
-            params.push_back (ParmVarDecl::Create (*ast,
-                                                   objc_method_decl,
-                                                   SourceLocation(),
-                                                   SourceLocation(),
-                                                   NULL, // anonymous
-                                                   method_function_prototype->getArgType(param_index), 
-                                                   NULL,
-                                                   SC_Auto, 
-                                                   SC_Auto,
-                                                   NULL));
-        }
-        
-        objc_method_decl->setMethodParams(*ast, ArrayRef<ParmVarDecl*>(params), ArrayRef<SourceLocation>());
-    }
-    
-    class_interface_decl->addDecl (objc_method_decl);
-
-#ifdef LLDB_CONFIGURATION_DEBUG
-    VerifyDecl(objc_method_decl);
-#endif
-
-    return objc_method_decl;
-}
-
-size_t
-ClangASTContext::GetNumTemplateArguments (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-            case clang::Type::Record:
-                if (GetCompleteQualType (ast, qual_type))
-                {
-                    const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                    if (cxx_record_decl)
-                    {
-                        const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
-                        if (template_decl)
-                            return template_decl->getTemplateArgs().size();
-                    }
-                }
-                break;
-                
-            case clang::Type::Typedef:                         
-                return ClangASTContext::GetNumTemplateArguments (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-            default:
-                break;
-        }
-    }
-    return 0;
-}
-
-clang_type_t
-ClangASTContext::GetTemplateArgument (clang::ASTContext *ast, clang_type_t clang_type, size_t arg_idx, lldb::TemplateArgumentKind &kind)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-            case clang::Type::Record:
-                if (GetCompleteQualType (ast, qual_type))
-                {
-                    const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                    if (cxx_record_decl)
-                    {
-                        const ClassTemplateSpecializationDecl *template_decl = dyn_cast<ClassTemplateSpecializationDecl>(cxx_record_decl);
-                        if (template_decl && arg_idx < template_decl->getTemplateArgs().size())
-                        {
-                            const TemplateArgument &template_arg = template_decl->getTemplateArgs()[arg_idx];
-                            switch (template_arg.getKind())
-                            {
-                                case clang::TemplateArgument::Null:
-                                    kind = eTemplateArgumentKindNull;
-                                    return NULL;
-
-                                case clang::TemplateArgument::Type:
-                                    kind = eTemplateArgumentKindType;
-                                    return template_arg.getAsType().getAsOpaquePtr();
-
-                                case clang::TemplateArgument::Declaration:
-                                    kind = eTemplateArgumentKindDeclaration;
-                                    return NULL;
-
-                                case clang::TemplateArgument::Integral:
-                                    kind = eTemplateArgumentKindIntegral;
-                                    return template_arg.getIntegralType().getAsOpaquePtr();
-
-                                case clang::TemplateArgument::Template:
-                                    kind = eTemplateArgumentKindTemplate;
-                                    return NULL;
-
-                                case clang::TemplateArgument::TemplateExpansion:
-                                    kind = eTemplateArgumentKindTemplateExpansion;
-                                    return NULL;
-
-                                case clang::TemplateArgument::Expression:
-                                    kind = eTemplateArgumentKindExpression;
-                                    return NULL;
-
-                                case clang::TemplateArgument::Pack:
-                                    kind = eTemplateArgumentKindPack;
-                                    return NULL;
-
-                                default:
-                                    assert (!"Unhandled TemplateArgument::ArgKind");
-                                    kind = eTemplateArgumentKindNull;
-                                    return NULL;
-                            }
-                        }
-                    }
-                }
-                break;
-                
-            case clang::Type::Typedef:                         
-                return ClangASTContext::GetTemplateArgument (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), arg_idx, kind);
-            default:
-                break;
-        }
-    }
-    kind = eTemplateArgumentKindNull;
-    return NULL;
-}
-
-uint32_t
-ClangASTContext::GetTypeInfo 
-(
-    clang_type_t clang_type, 
-    clang::ASTContext *ast, 
-    clang_type_t *pointee_or_element_clang_type
-)
-{
-    if (clang_type == NULL)
-        return 0;
-        
-    if (pointee_or_element_clang_type)
-        *pointee_or_element_clang_type = NULL;
-    
-    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    case clang::Type::Builtin:
-        switch (cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        case clang::BuiltinType::ObjCId:
-        case clang::BuiltinType::ObjCClass:
-            if (ast && pointee_or_element_clang_type)
-                *pointee_or_element_clang_type = ast->ObjCBuiltinClassTy.getAsOpaquePtr();
-            return eTypeIsBuiltIn | eTypeIsPointer | eTypeHasValue;
-                break;
-        case clang::BuiltinType::Bool:
-        case clang::BuiltinType::Char_U:
-        case clang::BuiltinType::UChar:
-        case clang::BuiltinType::WChar_U:
-        case clang::BuiltinType::Char16:
-        case clang::BuiltinType::Char32:
-        case clang::BuiltinType::UShort:
-        case clang::BuiltinType::UInt:
-        case clang::BuiltinType::ULong:
-        case clang::BuiltinType::ULongLong:
-        case clang::BuiltinType::UInt128:
-        case clang::BuiltinType::Char_S:
-        case clang::BuiltinType::SChar:
-        case clang::BuiltinType::WChar_S:
-        case clang::BuiltinType::Short:
-        case clang::BuiltinType::Int:
-        case clang::BuiltinType::Long:
-        case clang::BuiltinType::LongLong:
-        case clang::BuiltinType::Int128:
-        case clang::BuiltinType::Float:
-        case clang::BuiltinType::Double:
-        case clang::BuiltinType::LongDouble:
-                return eTypeIsBuiltIn | eTypeHasValue | eTypeIsScalar;
-        default: 
-            break;
-        }
-        return eTypeIsBuiltIn | eTypeHasValue;
-
-    case clang::Type::BlockPointer:                     
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
-        return eTypeIsPointer | eTypeHasChildren | eTypeIsBlock;
-
-    case clang::Type::Complex:                          return eTypeIsBuiltIn | eTypeHasValue;
-
-    case clang::Type::ConstantArray:
-    case clang::Type::DependentSizedArray:
-    case clang::Type::IncompleteArray:
-    case clang::Type::VariableArray:                    
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
-        return eTypeHasChildren | eTypeIsArray;
-
-    case clang::Type::DependentName:                    return 0;
-    case clang::Type::DependentSizedExtVector:          return eTypeHasChildren | eTypeIsVector;
-    case clang::Type::DependentTemplateSpecialization:  return eTypeIsTemplate;
-    case clang::Type::Decltype:                         return 0;
-
-    case clang::Type::Enum:
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = cast<EnumType>(qual_type)->getDecl()->getIntegerType().getAsOpaquePtr();
-        return eTypeIsEnumeration | eTypeHasValue;
-
-    case clang::Type::Elaborated:
-        return ClangASTContext::GetTypeInfo (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                             ast, 
-                                             pointee_or_element_clang_type);
-    case clang::Type::ExtVector:                        return eTypeHasChildren | eTypeIsVector;
-    case clang::Type::FunctionProto:                    return eTypeIsFuncPrototype | eTypeHasValue;
-    case clang::Type::FunctionNoProto:                  return eTypeIsFuncPrototype | eTypeHasValue;
-    case clang::Type::InjectedClassName:                return 0;
-
-    case clang::Type::LValueReference:                  
-    case clang::Type::RValueReference:                  
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = cast<ReferenceType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr();
-        return eTypeHasChildren | eTypeIsReference | eTypeHasValue;
-
-    case clang::Type::MemberPointer:                    return eTypeIsPointer   | eTypeIsMember | eTypeHasValue;
-
-    case clang::Type::ObjCObjectPointer:
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
-        return eTypeHasChildren | eTypeIsObjC | eTypeIsClass | eTypeIsPointer | eTypeHasValue;
-
-    case clang::Type::ObjCObject:                       return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
-    case clang::Type::ObjCInterface:                    return eTypeHasChildren | eTypeIsObjC | eTypeIsClass;
-
-    case clang::Type::Pointer:                      	
-        if (pointee_or_element_clang_type)
-            *pointee_or_element_clang_type = qual_type->getPointeeType().getAsOpaquePtr();
-        return eTypeHasChildren | eTypeIsPointer | eTypeHasValue;
-
-    case clang::Type::Record:
-        if (qual_type->getAsCXXRecordDecl())
-            return eTypeHasChildren | eTypeIsClass | eTypeIsCPlusPlus;
-        else
-            return eTypeHasChildren | eTypeIsStructUnion;
-        break;
-    case clang::Type::SubstTemplateTypeParm:            return eTypeIsTemplate;
-    case clang::Type::TemplateTypeParm:                 return eTypeIsTemplate;
-    case clang::Type::TemplateSpecialization:           return eTypeIsTemplate;
-
-    case clang::Type::Typedef:                         
-        return eTypeIsTypedef | ClangASTContext::GetTypeInfo (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                                  ast, 
-                                                                  pointee_or_element_clang_type);
-
-    case clang::Type::TypeOfExpr:                       return 0;
-    case clang::Type::TypeOf:                           return 0;
-    case clang::Type::UnresolvedUsing:                  return 0;
-    case clang::Type::Vector:                           return eTypeHasChildren | eTypeIsVector;
-    default:                                            return 0;
-    }
-    return 0;
-}
-
-
-#pragma mark Aggregate Types
-
-bool
-ClangASTContext::IsAggregateType (clang_type_t clang_type)
-{
-    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::IncompleteArray:
-    case clang::Type::VariableArray:
-    case clang::Type::ConstantArray:
-    case clang::Type::ExtVector:
-    case clang::Type::Vector:
-    case clang::Type::Record:
-    case clang::Type::ObjCObject:
-    case clang::Type::ObjCInterface:
-        return true;
-    case clang::Type::Elaborated:
-        return ClangASTContext::IsAggregateType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-    case clang::Type::Typedef:
-        return ClangASTContext::IsAggregateType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-
-    default:
-        break;
-    }
-    // The clang type does have a value
-    return false;
-}
-
-uint32_t
-ClangASTContext::GetNumChildren (clang::ASTContext *ast, clang_type_t clang_type, bool omit_empty_base_classes)
-{
-    if (clang_type == NULL)
-        return 0;
-
-    uint32_t num_children = 0;
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    case clang::Type::Builtin:
-        switch (cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        case clang::BuiltinType::ObjCId:    // child is Class
-        case clang::BuiltinType::ObjCClass: // child is Class
-            num_children = 1;
-            break;
-
-        default:
-            break;
-        }
-        break;
-
-    case clang::Type::Complex: return 0;
-
-    case clang::Type::Record:
-        if (GetCompleteQualType (ast, qual_type))
-        {
-            const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
-            const RecordDecl *record_decl = record_type->getDecl();
-            assert(record_decl);
-            const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-            if (cxx_record_decl)
-            {
-                if (omit_empty_base_classes)
-                {
-                    // Check each base classes to see if it or any of its
-                    // base classes contain any fields. This can help
-                    // limit the noise in variable views by not having to
-                    // show base classes that contain no members.
-                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                         base_class != base_class_end;
-                         ++base_class)
-                    {
-                        const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-
-                        // Skip empty base classes
-                        if (RecordHasFields(base_class_decl) == false)
-                            continue;
-
-                        num_children++;
-                    }
-                }
-                else
-                {
-                    // Include all base classes
-                    num_children += cxx_record_decl->getNumBases();
-                }
-
-            }
-            RecordDecl::field_iterator field, field_end;
-            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
-                ++num_children;
-        }
-        break;
-
-    case clang::Type::ObjCObject:
-    case clang::Type::ObjCInterface:
-        if (GetCompleteQualType (ast, qual_type))
-        {
-            const 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)
-                {
-            
-                    ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
-                    if (superclass_interface_decl)
-                    {
-                        if (omit_empty_base_classes)
-                        {
-                            if (ClangASTContext::ObjCDeclHasIVars (superclass_interface_decl, true))
-                                ++num_children;
-                        }
-                        else
-                            ++num_children;
-                    }
-                    
-                    num_children += class_interface_decl->ivar_size();
-                }
-            }
-        }
-        break;
-        
-    case clang::Type::ObjCObjectPointer:
-        {
-            const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(qual_type.getTypePtr());
-            QualType pointee_type = pointer_type->getPointeeType();
-            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)
-                num_children = 1;
-            else
-                num_children = num_pointee_children;
-        }
-        break;
-
-    case clang::Type::ConstantArray:
-        num_children = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
-        break;
-
-    case clang::Type::Pointer:
-        {
-            const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
-            QualType pointee_type (pointer_type->getPointeeType());
-            uint32_t num_pointee_children = ClangASTContext::GetNumChildren (ast,
-                                                                             pointee_type.getAsOpaquePtr(), 
-                                                                             omit_empty_base_classes);
-            if (num_pointee_children == 0)
-            {
-                // We have a pointer to a pointee type that claims it has no children.
-                // We will want to look at
-                num_children = ClangASTContext::GetNumPointeeChildren (pointee_type.getAsOpaquePtr());
-            }
-            else
-                num_children = num_pointee_children;
-        }
-        break;
-
-    case clang::Type::LValueReference:
-    case clang::Type::RValueReference:
-        {
-            const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
-            QualType pointee_type = reference_type->getPointeeType();
-            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)
-                num_children = 1;
-            else
-                num_children = num_pointee_children;
-        }
-        break;
-
-
-    case clang::Type::Typedef:
-        num_children = ClangASTContext::GetNumChildren (ast,
-                                                        cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), 
-                                                        omit_empty_base_classes);
-        break;
-        
-    case clang::Type::Elaborated:
-        num_children = ClangASTContext::GetNumChildren (ast, 
-                                                        cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                        omit_empty_base_classes);
-        break;
-
-    default:
-        break;
-    }
-    return num_children;
-}
-
-uint32_t
-ClangASTContext::GetNumDirectBaseClasses (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    uint32_t count = 0;
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                if (cxx_record_decl)
-                    count = cxx_record_decl->getNumBases();
-            }
-            break;
-            
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
-                if (objc_class_type)
-                {
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                    
-                    if (class_interface_decl && class_interface_decl->getSuperClass())
-                        count = 1;
-                }
-            }
-            break;
-            
-            
-        case clang::Type::Typedef:
-            count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-            break;
-            
-        case clang::Type::Elaborated:
-            count = ClangASTContext::GetNumDirectBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-            break;
-            
-        default:
-            break;
-    }
-    return count;
-}
-
-uint32_t 
-ClangASTContext::GetNumVirtualBaseClasses (clang::ASTContext *ast, 
-                                           clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    uint32_t count = 0;
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                if (cxx_record_decl)
-                    count = cxx_record_decl->getNumVBases();
-            }
-            break;
-            
-        case clang::Type::Typedef:
-            count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-            break;
-            
-        case clang::Type::Elaborated:
-            count = ClangASTContext::GetNumVirtualBaseClasses (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-            break;
-            
-        default:
-            break;
-    }
-    return count;
-}
-
-uint32_t 
-ClangASTContext::GetNumFields (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    uint32_t count = 0;
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const RecordType *record_type = dyn_cast<RecordType>(qual_type.getTypePtr());
-                if (record_type)
-                {
-                    RecordDecl *record_decl = record_type->getDecl();
-                    if (record_decl)
-                    {
-                        uint32_t field_idx = 0;
-                        RecordDecl::field_iterator field, field_end;
-                        for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field)
-                            ++field_idx;
-                        count = field_idx;
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::Typedef:
-            count = ClangASTContext::GetNumFields (ast, cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-            break;
-            
-        case clang::Type::Elaborated:
-            count = ClangASTContext::GetNumFields (ast, cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-            break;
-            
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
-                if (objc_class_type)
-                {
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                    
-                    if (class_interface_decl)
-                        count = class_interface_decl->ivar_size();
-                }
-            }
-            break;
-
-        default:
-            break;
-    }
-    return count;
-}
-
-clang_type_t
-ClangASTContext::GetDirectBaseClassAtIndex (clang::ASTContext *ast, 
-                                            clang_type_t clang_type,
-                                            uint32_t idx, 
-                                            uint32_t *bit_offset_ptr)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                if (cxx_record_decl)
-                {
-                    uint32_t curr_idx = 0;
-                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                         base_class != base_class_end;
-                         ++base_class, ++curr_idx)
-                    {
-                        if (curr_idx == idx)
-                        {
-                            if (bit_offset_ptr)
-                            {
-                                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
-                                const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-//                                if (base_class->isVirtual())
-//                                    *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
-//                                else
-                                    *bit_offset_ptr = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
-                            }
-                            return base_class->getType().getAsOpaquePtr();
-                        }
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (idx == 0 && GetCompleteQualType (ast, qual_type))
-            {
-                const ObjCObjectType *objc_class_type = qual_type->getAsObjCQualifiedInterfaceType();
-                if (objc_class_type)
-                {
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                    
-                    if (class_interface_decl)
-                    {
-                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
-                        if (superclass_interface_decl)
-                        {
-                            if (bit_offset_ptr)
-                                *bit_offset_ptr = 0;
-                            return ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr();
-                        }
-                    }
-                }
-            }
-            break;
-            
-            
-        case clang::Type::Typedef:
-            return ClangASTContext::GetDirectBaseClassAtIndex (ast, 
-                                                               cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                               idx,
-                                                               bit_offset_ptr);
-            
-        case clang::Type::Elaborated:
-            return  ClangASTContext::GetDirectBaseClassAtIndex (ast, 
-                                                                cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                                idx,
-                                                                bit_offset_ptr);
-            
-        default:
-            break;
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetVirtualBaseClassAtIndex (clang::ASTContext *ast, 
-                                             clang_type_t clang_type,
-                                             uint32_t idx, 
-                                             uint32_t *bit_offset_ptr)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-                if (cxx_record_decl)
-                {
-                    uint32_t curr_idx = 0;
-                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                    for (base_class = cxx_record_decl->vbases_begin(), base_class_end = cxx_record_decl->vbases_end();
-                         base_class != base_class_end;
-                         ++base_class, ++curr_idx)
-                    {
-                        if (curr_idx == idx)
-                        {
-                            if (bit_offset_ptr)
-                            {
-                                const ASTRecordLayout &record_layout = ast->getASTRecordLayout(cxx_record_decl);
-                                const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-                                *bit_offset_ptr = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
-
-                            }
-                            return base_class->getType().getAsOpaquePtr();
-                        }
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::Typedef:
-            return ClangASTContext::GetVirtualBaseClassAtIndex (ast, 
-                                                                cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                                idx,
-                                                                bit_offset_ptr);
-            
-        case clang::Type::Elaborated:
-            return  ClangASTContext::GetVirtualBaseClassAtIndex (ast, 
-                                                                 cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                                 idx,
-                                                                 bit_offset_ptr);
-            
-        default:
-            break;
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetFieldAtIndex (clang::ASTContext *ast, 
-                                  clang_type_t clang_type,
-                                  uint32_t idx, 
-                                  std::string& name,
-                                  uint64_t *bit_offset_ptr,
-                                  uint32_t *bitfield_bit_size_ptr,
-                                  bool *is_bitfield_ptr)
-{
-    if (clang_type == NULL)
-        return 0;
-    
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
-                const RecordDecl *record_decl = record_type->getDecl();
-                uint32_t field_idx = 0;
-                RecordDecl::field_iterator field, field_end;
-                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx)
-                {
-                    if (idx == field_idx)
-                    {
-                        // Print the member type if requested
-                        // Print the member name and equal sign
-                        name.assign(field->getNameAsString());
-                        
-                        // Figure out the type byte size (field_type_info.first) and
-                        // alignment (field_type_info.second) from the AST context.
-                        if (bit_offset_ptr)
-                        {
-                            const ASTRecordLayout &record_layout = ast->getASTRecordLayout(record_decl);
-                            *bit_offset_ptr = record_layout.getFieldOffset (field_idx);
-                        }
-                        
-                        const bool is_bitfield = field->isBitField();
-                        
-                        if (bitfield_bit_size_ptr)
-                        {
-                            *bitfield_bit_size_ptr = 0;
-
-                            if (is_bitfield && ast)
-                            {
-                                Expr *bitfield_bit_size_expr = field->getBitWidth();
-                                llvm::APSInt bitfield_apsint;
-                                if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
-                                {
-                                    *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
-                                }
-                            }
-                        }
-                        if (is_bitfield_ptr)
-                            *is_bitfield_ptr = is_bitfield;
-
-                        return field->getType().getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const 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 (idx < (class_interface_decl->ivar_size()))
-                        {
-                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
-                            uint32_t ivar_idx = 0;
-
-                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++ivar_idx)
-                            {
-                                if (ivar_idx == idx)
-                                {
-                                    const ObjCIvarDecl* ivar_decl = *ivar_pos;
-                                    
-                                    QualType ivar_qual_type(ivar_decl->getType());
-                                    
-                                    name.assign(ivar_decl->getNameAsString());
-
-                                    if (bit_offset_ptr)
-                                    {
-                                        const ASTRecordLayout &interface_layout = ast->getASTObjCInterfaceLayout(class_interface_decl);
-                                        *bit_offset_ptr = interface_layout.getFieldOffset (ivar_idx);
-                                    }
-                                    
-                                    const bool is_bitfield = ivar_pos->isBitField();
-                                    
-                                    if (bitfield_bit_size_ptr)
-                                    {
-                                        *bitfield_bit_size_ptr = 0;
-                                        
-                                        if (is_bitfield && ast)
-                                        {
-                                            Expr *bitfield_bit_size_expr = ivar_pos->getBitWidth();
-                                            llvm::APSInt bitfield_apsint;
-                                            if (bitfield_bit_size_expr && bitfield_bit_size_expr->EvaluateAsInt(bitfield_apsint, *ast))
-                                            {
-                                                *bitfield_bit_size_ptr = bitfield_apsint.getLimitedValue();
-                                            }
-                                        }
-                                    }
-                                    if (is_bitfield_ptr)
-                                        *is_bitfield_ptr = is_bitfield;
-                                    
-                                    return ivar_qual_type.getAsOpaquePtr();
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            break;
-            
-            
-        case clang::Type::Typedef:
-            return ClangASTContext::GetFieldAtIndex (ast, 
-                                                     cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                     idx,
-                                                     name,
-                                                     bit_offset_ptr,
-                                                     bitfield_bit_size_ptr,
-                                                     is_bitfield_ptr);
-            
-        case clang::Type::Elaborated:
-            return  ClangASTContext::GetFieldAtIndex (ast, 
-                                                      cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                      idx,
-                                                      name,
-                                                      bit_offset_ptr,
-                                                      bitfield_bit_size_ptr,
-                                                      is_bitfield_ptr);
-            
-        default:
-            break;
-    }
-    return NULL;
-}
-
-
-// If a pointer to a pointee type (the clang_type arg) says that it has no 
-// children, then we either need to trust it, or override it and return a 
-// different result. For example, an "int *" has one child that is an integer, 
-// but a function pointer doesn't have any children. Likewise if a Record type
-// claims it has no children, then there really is nothing to show.
-uint32_t
-ClangASTContext::GetNumPointeeChildren (clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return 0;
-
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    case clang::Type::Builtin:                  
-        switch (cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        case clang::BuiltinType::UnknownAny:
-        case clang::BuiltinType::Void:
-        case clang::BuiltinType::NullPtr:  
-            return 0;
-        case clang::BuiltinType::Bool:
-        case clang::BuiltinType::Char_U:
-        case clang::BuiltinType::UChar:
-        case clang::BuiltinType::WChar_U:
-        case clang::BuiltinType::Char16:
-        case clang::BuiltinType::Char32:
-        case clang::BuiltinType::UShort:
-        case clang::BuiltinType::UInt:
-        case clang::BuiltinType::ULong:
-        case clang::BuiltinType::ULongLong:
-        case clang::BuiltinType::UInt128:
-        case clang::BuiltinType::Char_S:
-        case clang::BuiltinType::SChar:
-        case clang::BuiltinType::WChar_S:
-        case clang::BuiltinType::Short:
-        case clang::BuiltinType::Int:
-        case clang::BuiltinType::Long:
-        case clang::BuiltinType::LongLong:
-        case clang::BuiltinType::Int128:
-        case clang::BuiltinType::Float:
-        case clang::BuiltinType::Double:
-        case clang::BuiltinType::LongDouble:
-        case clang::BuiltinType::Dependent:
-        case clang::BuiltinType::Overload:
-        case clang::BuiltinType::ObjCId:
-        case clang::BuiltinType::ObjCClass:
-        case clang::BuiltinType::ObjCSel:
-        case clang::BuiltinType::BoundMember:
-        case clang::BuiltinType::Half:          
-        case clang::BuiltinType::ARCUnbridgedCast:          
-        case clang::BuiltinType::PseudoObject:
-        case clang::BuiltinType::BuiltinFn:
-            return 1;
-        }
-        break;
-
-    case clang::Type::Complex:                  return 1;
-    case clang::Type::Pointer:                  return 1;
-    case clang::Type::BlockPointer:             return 0;   // If block pointers don't have debug info, then no children for them
-    case clang::Type::LValueReference:          return 1;
-    case clang::Type::RValueReference:          return 1;
-    case clang::Type::MemberPointer:            return 0;
-    case clang::Type::ConstantArray:            return 0;
-    case clang::Type::IncompleteArray:          return 0;
-    case clang::Type::VariableArray:            return 0;
-    case clang::Type::DependentSizedArray:      return 0;
-    case clang::Type::DependentSizedExtVector:  return 0;
-    case clang::Type::Vector:                   return 0;
-    case clang::Type::ExtVector:                return 0;
-    case clang::Type::FunctionProto:            return 0;   // When we function pointers, they have no children...
-    case clang::Type::FunctionNoProto:          return 0;   // When we function pointers, they have no children...
-    case clang::Type::UnresolvedUsing:          return 0;
-    case clang::Type::Paren:                    return 0;
-    case clang::Type::Typedef:                  return ClangASTContext::GetNumPointeeChildren (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-    case clang::Type::Elaborated:               return ClangASTContext::GetNumPointeeChildren (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-    case clang::Type::TypeOfExpr:               return 0;
-    case clang::Type::TypeOf:                   return 0;
-    case clang::Type::Decltype:                 return 0;
-    case clang::Type::Record:                   return 0;
-    case clang::Type::Enum:                     return 1;
-    case clang::Type::TemplateTypeParm:         return 1;
-    case clang::Type::SubstTemplateTypeParm:    return 1;
-    case clang::Type::TemplateSpecialization:   return 1;
-    case clang::Type::InjectedClassName:        return 0;
-    case clang::Type::DependentName:            return 1;
-    case clang::Type::DependentTemplateSpecialization:  return 1;
-    case clang::Type::ObjCObject:               return 0;
-    case clang::Type::ObjCInterface:            return 0;
-    case clang::Type::ObjCObjectPointer:        return 1;
-    default: 
-        break;
-    }
-    return 0;
-}
-
-clang_type_t
-ClangASTContext::GetChildClangTypeAtIndex
-(
-    ExecutionContext *exe_ctx,
-    const char *parent_name,
-    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
-)
-{
-    if (parent_clang_type)
-
-        return GetChildClangTypeAtIndex (exe_ctx,
-                                         getASTContext(),
-                                         parent_name,
-                                         parent_clang_type,
-                                         idx,
-                                         transparent_pointers,
-                                         omit_empty_base_classes,
-                                         ignore_array_bounds,
-                                         child_name,
-                                         child_byte_size,
-                                         child_byte_offset,
-                                         child_bitfield_bit_size,
-                                         child_bitfield_bit_offset,
-                                         child_is_base_class, 
-                                         child_is_deref_of_parent);
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetChildClangTypeAtIndex
-(
-    ExecutionContext *exe_ctx,
-    ASTContext *ast,
-    const char *parent_name,
-    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
-)
-{
-    if (parent_clang_type == NULL)
-        return NULL;
-
-    if (idx < ClangASTContext::GetNumChildren (ast, parent_clang_type, omit_empty_base_classes))
-    {
-        uint32_t bit_offset;
-        child_bitfield_bit_size = 0;
-        child_bitfield_bit_offset = 0;
-        child_is_base_class = false;
-        QualType parent_qual_type(QualType::getFromOpaquePtr(parent_clang_type));
-        const clang::Type::TypeClass parent_type_class = parent_qual_type->getTypeClass();
-        switch (parent_type_class)
-        {
-        case clang::Type::Builtin:
-            switch (cast<clang::BuiltinType>(parent_qual_type)->getKind())
-            {
-            case clang::BuiltinType::ObjCId:
-            case clang::BuiltinType::ObjCClass:
-                child_name = "isa";
-                child_byte_size = ast->getTypeSize(ast->ObjCBuiltinClassTy) / CHAR_BIT;
-                return ast->ObjCBuiltinClassTy.getAsOpaquePtr();
-                
-            default:
-                break;
-            }
-            break;
-
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, parent_qual_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->getASTRecordLayout(record_decl);
-                uint32_t child_idx = 0;
-
-                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-                if (cxx_record_decl)
-                {
-                    // We might have base classes to print out first
-                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                         base_class != base_class_end;
-                         ++base_class)
-                    {
-                        const CXXRecordDecl *base_class_decl = NULL;
-
-                        // Skip empty base classes
-                        if (omit_empty_base_classes)
-                        {
-                            base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-                            if (RecordHasFields(base_class_decl) == false)
-                                continue;
-                        }
-
-                        if (idx == child_idx)
-                        {
-                            if (base_class_decl == NULL)
-                                base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-
-
-                            if (base_class->isVirtual())
-                                bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
-                            else
-                                bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
-
-                            // Base classes should be a multiple of 8 bits in size
-                            child_byte_offset = bit_offset/8;
-                            
-                            child_name = ClangASTType::GetTypeNameForQualType(ast, base_class->getType());
-
-                            uint64_t clang_type_info_bit_size = ast->getTypeSize(base_class->getType());
-
-                            // Base classes bit sizes should be a multiple of 8 bits in size
-                            assert (clang_type_info_bit_size % 8 == 0);
-                            child_byte_size = clang_type_info_bit_size / 8;
-                            child_is_base_class = true;
-                            return base_class->getType().getAsOpaquePtr();
-                        }
-                        // We don't increment the child index in the for loop since we might
-                        // be skipping empty base classes
-                        ++child_idx;
-                    }
-                }
-                // Make sure index is in range...
-                uint32_t field_idx = 0;
-                RecordDecl::field_iterator field, field_end;
-                for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
-                {
-                    if (idx == child_idx)
-                    {
-                        // Print the member type if requested
-                        // Print the member name and equal sign
-                        child_name.assign(field->getNameAsString().c_str());
-
-                        // 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->getTypeInfo(field->getType());
-                        assert(field_idx < record_layout.getFieldCount());
-
-                        child_byte_size = field_type_info.first / 8;
-
-                        // 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, *field, child_bitfield_bit_size))
-                            child_bitfield_bit_offset = bit_offset % 8;
-
-                        return field->getType().getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, parent_qual_type))
-            {
-                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(parent_qual_type.getTypePtr());
-                assert (objc_class_type);
-                if (objc_class_type)
-                {
-                    uint32_t child_idx = 0;
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                
-                    if (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, ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(), omit_empty_base_classes) > 0)
-                                {
-                                    if (idx == 0)
-                                    {
-                                        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->getTypeInfo(ivar_qual_type.getTypePtr());
-
-                                        child_byte_size = ivar_type_info.first / 8;
-                                        child_byte_offset = 0;
-                                        child_is_base_class = true;
-
-                                        return ivar_qual_type.getAsOpaquePtr();
-                                    }
-
-                                    ++child_idx;
-                                }
-                            }
-                            else
-                                ++child_idx;
-                        }
-    
-                        const uint32_t superclass_idx = child_idx;
-
-                        if (idx < (child_idx + class_interface_decl->ivar_size()))
-                        {
-                            ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
-                            
-                            for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
-                            {
-                                if (child_idx == idx)
-                                {
-                                    ObjCIvarDecl* ivar_decl = *ivar_pos;
-                                    
-                                    QualType ivar_qual_type(ivar_decl->getType());
-
-                                    child_name.assign(ivar_decl->getNameAsString().c_str());
-
-                                    std::pair<uint64_t, unsigned> ivar_type_info = ast->getTypeInfo(ivar_qual_type.getTypePtr());
-
-                                    child_byte_size = ivar_type_info.first / 8;
-
-                                    // Figure out the field offset within the current struct/union/class type
-                                    // For ObjC objects, we can't trust the bit offset we get from the Clang AST, since
-                                    // that doesn't account for the space taken up by unbacked properties, or from 
-                                    // the changing size of base classes that are newer than this class.
-                                    // So if we have a process around that we can ask about this object, do so.
-                                    child_byte_offset = LLDB_INVALID_IVAR_OFFSET;
-                                    Process *process = NULL;
-                                    if (exe_ctx)
-                                        process = exe_ctx->GetProcessPtr();
-                                    if (process)
-                                    {
-                                        ObjCLanguageRuntime *objc_runtime = process->GetObjCLanguageRuntime();
-                                        if (objc_runtime != NULL)
-                                        {
-                                            ClangASTType parent_ast_type (ast, parent_qual_type.getAsOpaquePtr());
-                                            child_byte_offset = objc_runtime->GetByteOffsetForIvar (parent_ast_type, ivar_decl->getNameAsString().c_str());
-                                        }
-                                    }
-                                    
-                                    // Setting this to UINT32_MAX to make sure we don't compute it twice...
-                                    bit_offset = UINT32_MAX;
-                                    
-                                    if (child_byte_offset == LLDB_INVALID_IVAR_OFFSET)
-                                    {
-                                        bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
-                                        child_byte_offset = bit_offset / 8;
-                                    }
-                                    
-                                    // Note, the ObjC Ivar Byte offset is just that, it doesn't account for the bit offset
-                                    // of a bitfield within its containing object.  So regardless of where we get the byte
-                                    // offset from, we still need to get the bit offset for bitfields from the layout.
-                                    
-                                    if (ClangASTContext::FieldIsBitfield (ast, ivar_decl, child_bitfield_bit_size))
-                                    {
-                                        if (bit_offset == UINT32_MAX)
-                                            bit_offset = interface_layout.getFieldOffset (child_idx - superclass_idx);
-                                            
-                                        child_bitfield_bit_offset = bit_offset % 8;
-                                    }
-                                    return ivar_qual_type.getAsOpaquePtr();
-                                }
-                                ++child_idx;
-                            }
-                        }
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::ObjCObjectPointer:
-            {
-                const ObjCObjectPointerType *pointer_type = cast<ObjCObjectPointerType>(parent_qual_type.getTypePtr());
-                QualType pointee_type = pointer_type->getPointeeType();
-
-                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    child_is_deref_of_parent = false;
-                    bool tmp_child_is_deref_of_parent = false;
-                    return GetChildClangTypeAtIndex (exe_ctx,
-                                                     ast,
-                                                     parent_name,
-                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
-                                                     idx,
-                                                     transparent_pointers,
-                                                     omit_empty_base_classes,
-                                                     ignore_array_bounds,
-                                                     child_name,
-                                                     child_byte_size,
-                                                     child_byte_offset,
-                                                     child_bitfield_bit_size,
-                                                     child_bitfield_bit_offset,
-                                                     child_is_base_class,
-                                                     tmp_child_is_deref_of_parent);
-                }
-                else
-                {
-                    child_is_deref_of_parent = true;
-                    if (parent_name)
-                    {
-                        child_name.assign(1, '*');
-                        child_name += parent_name;
-                    }
-
-                    // We have a pointer to an simple type
-                    if (idx == 0 && GetCompleteQualType(ast, 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;
-                        return pointee_type.getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::ConstantArray:
-            {
-                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
-                const uint64_t element_count = array->getSize().getLimitedValue();
-
-                if (ignore_array_bounds || idx < element_count)
-                {
-                    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);
-
-                        child_name.assign(element_name);
-                        assert(field_type_info.first % 8 == 0);
-                        child_byte_size = field_type_info.first / 8;
-                        child_byte_offset = (int32_t)idx * (int32_t)child_byte_size;
-                        return array->getElementType().getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::Pointer:
-            {
-                const PointerType *pointer_type = cast<PointerType>(parent_qual_type.getTypePtr());
-                QualType pointee_type = pointer_type->getPointeeType();
-                
-                // Don't dereference "void *" pointers
-                if (pointee_type->isVoidType())
-                    return NULL;
-
-                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    child_is_deref_of_parent = false;
-                    bool tmp_child_is_deref_of_parent = false;
-                    return GetChildClangTypeAtIndex (exe_ctx,
-                                                     ast,
-                                                     parent_name,
-                                                     pointer_type->getPointeeType().getAsOpaquePtr(),
-                                                     idx,
-                                                     transparent_pointers,
-                                                     omit_empty_base_classes,
-                                                     ignore_array_bounds,
-                                                     child_name,
-                                                     child_byte_size,
-                                                     child_byte_offset,
-                                                     child_bitfield_bit_size,
-                                                     child_bitfield_bit_offset,
-                                                     child_is_base_class,
-                                                     tmp_child_is_deref_of_parent);
-                }
-                else
-                {
-                    child_is_deref_of_parent = true;
-
-                    if (parent_name)
-                    {
-                        child_name.assign(1, '*');
-                        child_name += parent_name;
-                    }
-
-                    // We have a pointer to an simple type
-                    if (idx == 0)
-                    {
-                        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;
-                        return pointee_type.getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::LValueReference:
-        case clang::Type::RValueReference:
-            {
-                const ReferenceType *reference_type = cast<ReferenceType>(parent_qual_type.getTypePtr());
-                QualType pointee_type(reference_type->getPointeeType());
-                clang_type_t pointee_clang_type = pointee_type.getAsOpaquePtr();
-                if (transparent_pointers && ClangASTContext::IsAggregateType (pointee_clang_type))
-                {
-                    child_is_deref_of_parent = false;
-                    bool tmp_child_is_deref_of_parent = false;
-                    return GetChildClangTypeAtIndex (exe_ctx,
-                                                     ast,
-                                                     parent_name,
-                                                     pointee_clang_type,
-                                                     idx,
-                                                     transparent_pointers,
-                                                     omit_empty_base_classes,
-                                                     ignore_array_bounds,
-                                                     child_name,
-                                                     child_byte_size,
-                                                     child_byte_offset,
-                                                     child_bitfield_bit_size,
-                                                     child_bitfield_bit_offset,
-                                                     child_is_base_class,
-                                                     tmp_child_is_deref_of_parent);
-                }
-                else
-                {
-                    if (parent_name)
-                    {
-                        child_name.assign(1, '&');
-                        child_name += parent_name;
-                    }
-
-                    // We have a pointer to an simple type
-                    if (idx == 0)
-                    {
-                        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;
-                        return pointee_type.getAsOpaquePtr();
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::Typedef:
-            return GetChildClangTypeAtIndex (exe_ctx,
-                                             ast,
-                                             parent_name,
-                                             cast<TypedefType>(parent_qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                             idx,
-                                             transparent_pointers,
-                                             omit_empty_base_classes,
-                                             ignore_array_bounds,
-                                             child_name,
-                                             child_byte_size,
-                                             child_byte_offset,
-                                             child_bitfield_bit_size,
-                                             child_bitfield_bit_offset,
-                                             child_is_base_class,
-                                             child_is_deref_of_parent);
-            break;
-    
-        case clang::Type::Elaborated:
-            return GetChildClangTypeAtIndex (exe_ctx,
-                                             ast,
-                                             parent_name,
-                                             cast<ElaboratedType>(parent_qual_type)->getNamedType().getAsOpaquePtr(),
-                                             idx,
-                                             transparent_pointers,
-                                             omit_empty_base_classes,
-                                             ignore_array_bounds,
-                                             child_name,
-                                             child_byte_size,
-                                             child_byte_offset,
-                                             child_bitfield_bit_size,
-                                             child_bitfield_bit_offset,
-                                             child_is_base_class,
-                                             child_is_deref_of_parent); 
-
-        default:
-            break;
-        }
-    }
-    return NULL;
-}
-
-static inline bool
-BaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
-{
-    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
-}
-
-static uint32_t
-GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
-{
-    uint32_t num_bases = 0;
-    if (cxx_record_decl)
-    {
-        if (omit_empty_base_classes)
-        {
-            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                 base_class != base_class_end;
-                 ++base_class)
-            {
-                // Skip empty base classes
-                if (omit_empty_base_classes)
-                {
-                    if (BaseSpecifierIsEmpty (base_class))
-                        continue;
-                }
-                ++num_bases;
-            }
-        }
-        else
-            num_bases = cxx_record_decl->getNumBases();
-    }
-    return num_bases;
-}
-
-
-static uint32_t
-GetIndexForRecordBase
-(
-    const RecordDecl *record_decl,
-    const CXXBaseSpecifier *base_spec,
-    bool omit_empty_base_classes
-)
-{
-    uint32_t child_idx = 0;
-
-    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-
-//    const char *super_name = record_decl->getNameAsCString();
-//    const char *base_name = base_spec->getType()->getAs<RecordType>()->getDecl()->getNameAsCString();
-//    printf ("GetIndexForRecordChild (%s, %s)\n", super_name, base_name);
-//
-    if (cxx_record_decl)
-    {
-        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-             base_class != base_class_end;
-             ++base_class)
-        {
-            if (omit_empty_base_classes)
-            {
-                if (BaseSpecifierIsEmpty (base_class))
-                    continue;
-            }
-
-//            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n", super_name, base_name,
-//                    child_idx,
-//                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
-//
-//
-            if (base_class == base_spec)
-                return child_idx;
-            ++child_idx;
-        }
-    }
-
-    return UINT32_MAX;
-}
-
-
-static uint32_t
-GetIndexForRecordChild
-(
-    const RecordDecl *record_decl,
-    NamedDecl *canonical_decl,
-    bool omit_empty_base_classes
-)
-{
-    uint32_t child_idx = GetNumBaseClasses (dyn_cast<CXXRecordDecl>(record_decl), omit_empty_base_classes);
-
-//    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-//
-////    printf ("GetIndexForRecordChild (%s, %s)\n", record_decl->getNameAsCString(), canonical_decl->getNameAsCString());
-//    if (cxx_record_decl)
-//    {
-//        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-//        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-//             base_class != base_class_end;
-//             ++base_class)
-//        {
-//            if (omit_empty_base_classes)
-//            {
-//                if (BaseSpecifierIsEmpty (base_class))
-//                    continue;
-//            }
-//
-////            printf ("GetIndexForRecordChild (%s, %s) base[%u] = %s\n",
-////                    record_decl->getNameAsCString(),
-////                    canonical_decl->getNameAsCString(),
-////                    child_idx,
-////                    base_class->getType()->getAs<RecordType>()->getDecl()->getNameAsCString());
-//
-//
-//            CXXRecordDecl *curr_base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-//            if (curr_base_class_decl == canonical_decl)
-//            {
-//                return child_idx;
-//            }
-//            ++child_idx;
-//        }
-//    }
-//
-//    const uint32_t num_bases = child_idx;
-    RecordDecl::field_iterator field, field_end;
-    for (field = record_decl->field_begin(), field_end = record_decl->field_end();
-         field != field_end;
-         ++field, ++child_idx)
-    {
-//            printf ("GetIndexForRecordChild (%s, %s) field[%u] = %s\n",
-//                    record_decl->getNameAsCString(),
-//                    canonical_decl->getNameAsCString(),
-//                    child_idx - num_bases,
-//                    field->getNameAsCString());
-
-        if (field->getCanonicalDecl() == canonical_decl)
-            return child_idx;
-    }
-
-    return UINT32_MAX;
-}
-
-// Look for a child member (doesn't include base classes, but it does include
-// their members) in the type hierarchy. Returns an index path into "clang_type"
-// on how to reach the appropriate member.
-//
-//    class A
-//    {
-//    public:
-//        int m_a;
-//        int m_b;
-//    };
-//
-//    class B
-//    {
-//    };
-//
-//    class C :
-//        public B,
-//        public A
-//    {
-//    };
-//
-// If we have a clang type that describes "class C", and we wanted to looked
-// "m_b" in it:
-//
-// With omit_empty_base_classes == false we would get an integer array back with:
-// { 1,  1 }
-// The first index 1 is the child index for "class A" within class C
-// The second index 1 is the child index for "m_b" within class A
-//
-// With omit_empty_base_classes == true we would get an integer array back with:
-// { 0,  1 }
-// The first index 0 is the child index for "class A" within class C (since class B doesn't have any members it doesn't count)
-// The second index 1 is the child index for "m_b" within class A
-
-size_t
-ClangASTContext::GetIndexOfChildMemberWithName
-(
-    ASTContext *ast,
-    clang_type_t clang_type,
-    const char *name,
-    bool omit_empty_base_classes,
-    std::vector<uint32_t>& child_indexes
-)
-{
-    if (clang_type && name && name[0])
-    {
-        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
-                const RecordDecl *record_decl = record_type->getDecl();
-
-                assert(record_decl);
-                uint32_t child_idx = 0;
-
-                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-
-                // Try and find a field that matches NAME
-                RecordDecl::field_iterator field, field_end;
-                StringRef name_sref(name);
-                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
-                     field != field_end;
-                     ++field, ++child_idx)
-                {
-                    if (field->getName().equals (name_sref))
-                    {
-                        // We have to add on the number of base classes to this index!
-                        child_indexes.push_back (child_idx + GetNumBaseClasses (cxx_record_decl, omit_empty_base_classes));
-                        return child_indexes.size();
-                    }
-                }
-
-                if (cxx_record_decl)
-                {
-                    const RecordDecl *parent_record_decl = cxx_record_decl;
-
-                    //printf ("parent = %s\n", parent_record_decl->getNameAsCString());
-
-                    //const Decl *root_cdecl = cxx_record_decl->getCanonicalDecl();
-                    // Didn't find things easily, lets let clang do its thang...
-                    IdentifierInfo & ident_ref = ast->Idents.get(name_sref);
-                    DeclarationName decl_name(&ident_ref);
-
-                    CXXBasePaths paths;
-                    if (cxx_record_decl->lookupInBases(CXXRecordDecl::FindOrdinaryMember,
-                                                       decl_name.getAsOpaquePtr(),
-                                                       paths))
-                    {
-                        CXXBasePaths::const_paths_iterator path, path_end = paths.end();
-                        for (path = paths.begin(); path != path_end; ++path)
-                        {
-                            const size_t num_path_elements = path->size();
-                            for (size_t e=0; e<num_path_elements; ++e)
-                            {
-                                CXXBasePathElement elem = (*path)[e];
-
-                                child_idx = GetIndexForRecordBase (parent_record_decl, elem.Base, omit_empty_base_classes);
-                                if (child_idx == UINT32_MAX)
-                                {
-                                    child_indexes.clear();
-                                    return 0;
-                                }
-                                else
-                                {
-                                    child_indexes.push_back (child_idx);
-                                    parent_record_decl = cast<RecordDecl>(elem.Base->getType()->getAs<RecordType>()->getDecl());
-                                }
-                            }
-                            DeclContext::lookup_iterator named_decl_pos;
-                            for (named_decl_pos = path->Decls.first;
-                                 named_decl_pos != path->Decls.second && parent_record_decl;
-                                 ++named_decl_pos)
-                            {
-                                child_idx = GetIndexForRecordChild (parent_record_decl, *named_decl_pos, omit_empty_base_classes);
-                                if (child_idx == UINT32_MAX)
-                                {
-                                    child_indexes.clear();
-                                    return 0;
-                                }
-                                else
-                                {
-                                    child_indexes.push_back (child_idx);
-                                }
-                            }
-                        }
-                        return child_indexes.size();
-                    }
-                }
-
-            }
-            break;
-
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                StringRef name_sref(name);
-                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
-                assert (objc_class_type);
-                if (objc_class_type)
-                {
-                    uint32_t child_idx = 0;
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                
-                    if (class_interface_decl)
-                    {
-                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
-                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
-                        
-                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos, ++child_idx)
-                        {
-                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
-                            
-                            if (ivar_decl->getName().equals (name_sref))
-                            {
-                                if ((!omit_empty_base_classes && superclass_interface_decl) || 
-                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
-                                    ++child_idx;
-
-                                child_indexes.push_back (child_idx);
-                                return child_indexes.size();
-                            }
-                        }
-
-                        if (superclass_interface_decl)
-                        {
-                            // The super class index is always zero for ObjC classes,
-                            // so we push it onto the child indexes in case we find
-                            // an ivar in our superclass...
-                            child_indexes.push_back (0);
-                            
-                            if (GetIndexOfChildMemberWithName (ast,
-                                                               ast->getObjCInterfaceType(superclass_interface_decl).getAsOpaquePtr(),
-                                                               name,
-                                                               omit_empty_base_classes,
-                                                               child_indexes))
-                            {
-                                // We did find an ivar in a superclass so just
-                                // return the results!
-                                return child_indexes.size();
-                            }
-                            
-                            // We didn't find an ivar matching "name" in our 
-                            // superclass, pop the superclass zero index that
-                            // we pushed on above.
-                            child_indexes.pop_back();
-                        }
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::ObjCObjectPointer:
-            {
-                return GetIndexOfChildMemberWithName (ast,
-                                                      cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
-                                                      name,
-                                                      omit_empty_base_classes,
-                                                      child_indexes);
-            }
-            break;
-
-
-        case clang::Type::ConstantArray:
-            {
-//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
-//                const uint64_t element_count = array->getSize().getLimitedValue();
-//
-//                if (idx < element_count)
-//                {
-//                    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);
-//
-//                    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;
-
-//        case clang::Type::MemberPointerType:
-//            {
-//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
-//                QualType pointee_type = mem_ptr_type->getPointeeType();
-//
-//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-//                {
-//                    return GetIndexOfChildWithName (ast,
-//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
-//                                                    name);
-//                }
-//            }
-//            break;
-//
-        case clang::Type::LValueReference:
-        case clang::Type::RValueReference:
-            {
-                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
-                QualType pointee_type = reference_type->getPointeeType();
-
-                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    return GetIndexOfChildMemberWithName (ast,
-                                                          reference_type->getPointeeType().getAsOpaquePtr(),
-                                                          name,
-                                                          omit_empty_base_classes,
-                                                          child_indexes);
-                }
-            }
-            break;
-
-        case clang::Type::Pointer:
-            {
-                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
-                QualType pointee_type = pointer_type->getPointeeType();
-
-                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    return GetIndexOfChildMemberWithName (ast,
-                                                          pointer_type->getPointeeType().getAsOpaquePtr(),
-                                                          name,
-                                                          omit_empty_base_classes,
-                                                          child_indexes);
-                }
-                else
-                {
-//                    if (parent_name)
-//                    {
-//                        child_name.assign(1, '*');
-//                        child_name += parent_name;
-//                    }
-//
-//                    // We have a pointer to an simple type
-//                    if (idx == 0)
-//                    {
-//                        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;
-//                        return pointee_type.getAsOpaquePtr();
-//                    }
-                }
-            }
-            break;
-
-        case clang::Type::Typedef:
-            return GetIndexOfChildMemberWithName (ast,
-                                                  cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                  name,
-                                                  omit_empty_base_classes,
-                                                  child_indexes);
-
-        default:
-            break;
-        }
-    }
-    return 0;
-}
-
-
-// Get the index of the child of "clang_type" whose name matches. This function
-// doesn't descend into the children, but only looks one level deep and name
-// matches can include base class names.
-
-uint32_t
-ClangASTContext::GetIndexOfChildWithName
-(
-    ASTContext *ast,
-    clang_type_t clang_type,
-    const char *name,
-    bool omit_empty_base_classes
-)
-{
-    if (clang_type && name && name[0])
-    {
-        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-        
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-
-        switch (type_class)
-        {
-        case clang::Type::Record:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                const RecordType *record_type = cast<RecordType>(qual_type.getTypePtr());
-                const RecordDecl *record_decl = record_type->getDecl();
-
-                assert(record_decl);
-                uint32_t child_idx = 0;
-
-                const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
-
-                if (cxx_record_decl)
-                {
-                    CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                    for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                         base_class != base_class_end;
-                         ++base_class)
-                    {
-                        // Skip empty base classes
-                        CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
-                        if (omit_empty_base_classes && RecordHasFields(base_class_decl) == false)
-                            continue;
-
-                        std::string base_class_type_name (ClangASTType::GetTypeNameForQualType(ast, base_class->getType()));
-                        if (base_class_type_name.compare (name) == 0)
-                            return child_idx;
-                        ++child_idx;
-                    }
-                }
-
-                // Try and find a field that matches NAME
-                RecordDecl::field_iterator field, field_end;
-                StringRef name_sref(name);
-                for (field = record_decl->field_begin(), field_end = record_decl->field_end();
-                     field != field_end;
-                     ++field, ++child_idx)
-                {
-                    if (field->getName().equals (name_sref))
-                        return child_idx;
-                }
-
-            }
-            break;
-
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (GetCompleteQualType (ast, qual_type))
-            {
-                StringRef name_sref(name);
-                const ObjCObjectType *objc_class_type = dyn_cast<ObjCObjectType>(qual_type.getTypePtr());
-                assert (objc_class_type);
-                if (objc_class_type)
-                {
-                    uint32_t child_idx = 0;
-                    ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                
-                    if (class_interface_decl)
-                    {
-                        ObjCInterfaceDecl::ivar_iterator ivar_pos, ivar_end = class_interface_decl->ivar_end();
-                        ObjCInterfaceDecl *superclass_interface_decl = class_interface_decl->getSuperClass();
-                        
-                        for (ivar_pos = class_interface_decl->ivar_begin(); ivar_pos != ivar_end; ++ivar_pos)
-                        {
-                            const ObjCIvarDecl* ivar_decl = *ivar_pos;
-                            
-                            if (ivar_decl->getName().equals (name_sref))
-                            {
-                                if ((!omit_empty_base_classes && superclass_interface_decl) || 
-                                    ( omit_empty_base_classes && ObjCDeclHasIVars (superclass_interface_decl, true)))
-                                    ++child_idx;
-
-                                return child_idx;
-                            }
-                        }
-
-                        if (superclass_interface_decl)
-                        {
-                            if (superclass_interface_decl->getName().equals (name_sref))
-                                return 0;
-                        }
-                    }
-                }
-            }
-            break;
-            
-        case clang::Type::ObjCObjectPointer:
-            {
-                return GetIndexOfChildWithName (ast,
-                                                cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr(),
-                                                name,
-                                                omit_empty_base_classes);
-            }
-            break;
-
-        case clang::Type::ConstantArray:
-            {
-//                const ConstantArrayType *array = cast<ConstantArrayType>(parent_qual_type.getTypePtr());
-//                const uint64_t element_count = array->getSize().getLimitedValue();
-//
-//                if (idx < element_count)
-//                {
-//                    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);
-//
-//                    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;
-
-//        case clang::Type::MemberPointerType:
-//            {
-//                MemberPointerType *mem_ptr_type = cast<MemberPointerType>(qual_type.getTypePtr());
-//                QualType pointee_type = mem_ptr_type->getPointeeType();
-//
-//                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-//                {
-//                    return GetIndexOfChildWithName (ast,
-//                                                    mem_ptr_type->getPointeeType().getAsOpaquePtr(),
-//                                                    name);
-//                }
-//            }
-//            break;
-//
-        case clang::Type::LValueReference:
-        case clang::Type::RValueReference:
-            {
-                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
-                QualType pointee_type = reference_type->getPointeeType();
-
-                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    return GetIndexOfChildWithName (ast,
-                                                    reference_type->getPointeeType().getAsOpaquePtr(),
-                                                    name,
-                                                    omit_empty_base_classes);
-                }
-            }
-            break;
-
-        case clang::Type::Pointer:
-            {
-                const PointerType *pointer_type = cast<PointerType>(qual_type.getTypePtr());
-                QualType pointee_type = pointer_type->getPointeeType();
-
-                if (ClangASTContext::IsAggregateType (pointee_type.getAsOpaquePtr()))
-                {
-                    return GetIndexOfChildWithName (ast,
-                                                    pointer_type->getPointeeType().getAsOpaquePtr(),
-                                                    name,
-                                                    omit_empty_base_classes);
-                }
-                else
-                {
-//                    if (parent_name)
-//                    {
-//                        child_name.assign(1, '*');
-//                        child_name += parent_name;
-//                    }
-//
-//                    // We have a pointer to an simple type
-//                    if (idx == 0)
-//                    {
-//                        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;
-//                        return pointee_type.getAsOpaquePtr();
-//                    }
-                }
-            }
-            break;
-
-        case clang::Type::Typedef:
-            return GetIndexOfChildWithName (ast,
-                                            cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                            name,
-                                            omit_empty_base_classes);
-
-        default:
-            break;
-        }
-    }
-    return UINT32_MAX;
-}
-
-#pragma mark TagType
-
-bool
-ClangASTContext::SetTagTypeKind (clang_type_t tag_clang_type, int kind)
-{
-    if (tag_clang_type)
-    {
-        QualType tag_qual_type(QualType::getFromOpaquePtr(tag_clang_type));
-        const clang::Type *clang_type = tag_qual_type.getTypePtr();
-        if (clang_type)
-        {
-            const TagType *tag_type = dyn_cast<TagType>(clang_type);
-            if (tag_type)
-            {
-                TagDecl *tag_decl = dyn_cast<TagDecl>(tag_type->getDecl());
-                if (tag_decl)
-                {
-                    tag_decl->setTagKind ((TagDecl::TagKind)kind);
-                    return true;
-                }
-            }
-        }
-    }
-    return false;
-}
-
-
-#pragma mark DeclContext Functions
-
-DeclContext *
-ClangASTContext::GetDeclContextForType (clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return NULL;
-
-    QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    case clang::Type::UnaryTransform:           break;
-    case clang::Type::FunctionNoProto:          break;
-    case clang::Type::FunctionProto:            break;
-    case clang::Type::IncompleteArray:          break;
-    case clang::Type::VariableArray:            break;
-    case clang::Type::ConstantArray:            break;
-    case clang::Type::DependentSizedArray:      break;
-    case clang::Type::ExtVector:                break;
-    case clang::Type::DependentSizedExtVector:  break;
-    case clang::Type::Vector:                   break;
-    case clang::Type::Builtin:                  break;
-    case clang::Type::BlockPointer:             break;
-    case clang::Type::Pointer:                  break;
-    case clang::Type::LValueReference:          break;
-    case clang::Type::RValueReference:          break;
-    case clang::Type::MemberPointer:            break;
-    case clang::Type::Complex:                  break;
-    case clang::Type::ObjCObject:               break;
-    case clang::Type::ObjCInterface:            return cast<ObjCObjectType>(qual_type.getTypePtr())->getInterface();
-    case clang::Type::ObjCObjectPointer:        return ClangASTContext::GetDeclContextForType (cast<ObjCObjectPointerType>(qual_type.getTypePtr())->getPointeeType().getAsOpaquePtr());
-    case clang::Type::Record:                   return cast<RecordType>(qual_type)->getDecl();
-    case clang::Type::Enum:                     return cast<EnumType>(qual_type)->getDecl();
-    case clang::Type::Typedef:                  return ClangASTContext::GetDeclContextForType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-    case clang::Type::Elaborated:               return ClangASTContext::GetDeclContextForType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-    case clang::Type::TypeOfExpr:               break;
-    case clang::Type::TypeOf:                   break;
-    case clang::Type::Decltype:                 break;
-    //case clang::Type::QualifiedName:          break;
-    case clang::Type::TemplateSpecialization:   break;
-    case clang::Type::DependentTemplateSpecialization:  break;
-    case clang::Type::TemplateTypeParm:         break;
-    case clang::Type::SubstTemplateTypeParm:    break;
-    case clang::Type::SubstTemplateTypeParmPack:break;
-    case clang::Type::PackExpansion:            break;
-    case clang::Type::UnresolvedUsing:          break;
-    case clang::Type::Paren:                    break;
-    case clang::Type::Attributed:               break;
-    case clang::Type::Auto:                     break;
-    case clang::Type::InjectedClassName:        break;
-    case clang::Type::DependentName:            break;
-    case clang::Type::Atomic:                   break;
-    }
-    // No DeclContext in this type...
-    return NULL;
-}
-
-#pragma mark Namespace Declarations
-
-NamespaceDecl *
-ClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
-{
-    NamespaceDecl *namespace_decl = NULL;
-    ASTContext *ast = getASTContext();
-    TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
-    if (decl_ctx == NULL)
-        decl_ctx = translation_unit_decl;
-    
-    if (name)
-    {
-        IdentifierInfo &identifier_info = ast->Idents.get(name);
-        DeclarationName decl_name (&identifier_info);
-        clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
-        for (clang::DeclContext::lookup_iterator pos = result.first, end = result.second; pos != end; ++pos) 
-        {
-            namespace_decl = dyn_cast<clang::NamespaceDecl>(*pos);
-            if (namespace_decl)
-                return namespace_decl;
-        }
-
-        namespace_decl = NamespaceDecl::Create(*ast, 
-                                               decl_ctx, 
-                                               false, 
-                                               SourceLocation(), 
-                                               SourceLocation(),
-                                               &identifier_info,
-                                               NULL);
-        
-        decl_ctx->addDecl (namespace_decl);        
-    }
-    else
-    {
-        if (decl_ctx == translation_unit_decl)
-        {
-            namespace_decl = translation_unit_decl->getAnonymousNamespace();
-            if (namespace_decl)
-                return namespace_decl;
-            
-            namespace_decl = NamespaceDecl::Create(*ast, 
-                                                   decl_ctx,
-                                                   false,
-                                                   SourceLocation(),
-                                                   SourceLocation(),
-                                                   NULL,
-                                                   NULL);
-            translation_unit_decl->setAnonymousNamespace (namespace_decl);
-            translation_unit_decl->addDecl (namespace_decl);
-            assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
-        }
-        else
-        {
-            NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
-            if (parent_namespace_decl)
-            {
-                namespace_decl = parent_namespace_decl->getAnonymousNamespace();
-                if (namespace_decl)
-                    return namespace_decl;
-                namespace_decl = NamespaceDecl::Create(*ast, 
-                                                       decl_ctx, 
-                                                       false,
-                                                       SourceLocation(), 
-                                                       SourceLocation(), 
-                                                       NULL,
-                                                       NULL);
-                parent_namespace_decl->setAnonymousNamespace (namespace_decl);
-                parent_namespace_decl->addDecl (namespace_decl);
-                assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
-            }
-            else
-            {
-                // BAD!!!
-            }
-        }
-        
-
-        if (namespace_decl)
-        {
-            // If we make it here, we are creating the anonymous namespace decl
-            // for the first time, so we need to do the using directive magic
-            // like SEMA does
-            UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast, 
-                                                                                   decl_ctx, 
-                                                                                   SourceLocation(),
-                                                                                   SourceLocation(),
-                                                                                   NestedNameSpecifierLoc(),
-                                                                                   SourceLocation(),
-                                                                                   namespace_decl,
-                                                                                   decl_ctx);
-            using_directive_decl->setImplicit();
-            decl_ctx->addDecl(using_directive_decl);
-        }
-    }
-#ifdef LLDB_CONFIGURATION_DEBUG
-    VerifyDecl(namespace_decl);
-#endif
-    return namespace_decl;
-}
-
-
-#pragma mark Function Types
-
-FunctionDecl *
-ClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx, const char *name, clang_type_t function_clang_type, int storage, bool is_inline)
-{
-    FunctionDecl *func_decl = NULL;
-    ASTContext *ast = getASTContext();
-    if (decl_ctx == NULL)
-        decl_ctx = ast->getTranslationUnitDecl();
-
-    if (name && name[0])
-    {
-        func_decl = FunctionDecl::Create (*ast,
-                                          decl_ctx,
-                                          SourceLocation(),
-                                          SourceLocation(),
-                                          DeclarationName (&ast->Idents.get(name)),
-                                          QualType::getFromOpaquePtr(function_clang_type),
-                                          NULL,
-                                          (FunctionDecl::StorageClass)storage,
-                                          (FunctionDecl::StorageClass)storage,
-                                          is_inline);
-    }
-    else
-    {
-        func_decl = FunctionDecl::Create (*ast,
-                                          decl_ctx,
-                                          SourceLocation(),
-                                          SourceLocation(),
-                                          DeclarationName (),
-                                          QualType::getFromOpaquePtr(function_clang_type),
-                                          NULL,
-                                          (FunctionDecl::StorageClass)storage,
-                                          (FunctionDecl::StorageClass)storage,
-                                          is_inline);
-    }
-    if (func_decl)
-        decl_ctx->addDecl (func_decl);
-    
-#ifdef LLDB_CONFIGURATION_DEBUG
-    VerifyDecl(func_decl);
-#endif
-    
-    return func_decl;
-}
-
-clang_type_t
-ClangASTContext::CreateFunctionType (ASTContext *ast,
-                                     clang_type_t result_type, 
-                                     clang_type_t *args, 
-                                     unsigned num_args, 
-                                     bool is_variadic, 
-                                     unsigned type_quals)
-{
-    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?
-    FunctionProtoType::ExtProtoInfo proto_info;
-    proto_info.Variadic = is_variadic;
-    proto_info.ExceptionSpecType = EST_None;
-    proto_info.TypeQuals = type_quals;
-    proto_info.RefQualifier = RQ_None;
-    proto_info.NumExceptions = 0;
-    proto_info.Exceptions = NULL;
-    
-    return ast->getFunctionType (QualType::getFromOpaquePtr(result_type),
-                                 qual_type_args.empty() ? NULL : &qual_type_args.front(),
-                                 qual_type_args.size(),
-                                 proto_info).getAsOpaquePtr();    // NoReturn);
-}
-
-ParmVarDecl *
-ClangASTContext::CreateParameterDeclaration (const char *name, clang_type_t param_type, int storage)
-{
-    ASTContext *ast = getASTContext();
-    assert (ast != NULL);
-    return ParmVarDecl::Create(*ast,
-                                ast->getTranslationUnitDecl(),
-                                SourceLocation(),
-                                SourceLocation(),
-                                name && name[0] ? &ast->Idents.get(name) : NULL,
-                                QualType::getFromOpaquePtr(param_type),
-                                NULL,
-                                (VarDecl::StorageClass)storage,
-                                (VarDecl::StorageClass)storage,
-                                0);
-}
-
-void
-ClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
-{
-    if (function_decl)
-        function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
-}
-
-
-#pragma mark Array Types
-
-clang_type_t
-ClangASTContext::CreateArrayType (clang_type_t element_type, size_t element_count, uint32_t bit_stride)
-{
-    if (element_type)
-    {
-        ASTContext *ast = getASTContext();
-        assert (ast != NULL);
-        llvm::APInt ap_element_count (64, element_count);
-        return ast->getConstantArrayType(QualType::getFromOpaquePtr(element_type),
-                                                 ap_element_count,
-                                                 ArrayType::Normal,
-                                                 0).getAsOpaquePtr(); // ElemQuals
-    }
-    return NULL;
-}
-
-
-#pragma mark TagDecl
-
-bool
-ClangASTContext::StartTagDeclarationDefinition (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        const clang::Type *t = qual_type.getTypePtr();
-        if (t)
-        {
-            const TagType *tag_type = dyn_cast<TagType>(t);
-            if (tag_type)
-            {
-                TagDecl *tag_decl = tag_type->getDecl();
-                if (tag_decl)
-                {
-                    tag_decl->startDefinition();
-                    return true;
-                }
-            }
-            
-            const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(t);
-            if (object_type)
-            {
-                ObjCInterfaceDecl *interface_decl = object_type->getInterface();
-                if (interface_decl)
-                {
-                    interface_decl->startDefinition();
-                    return true;
-                }
-            }
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::CompleteTagDeclarationDefinition (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        
-        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-        
-        if (cxx_record_decl)
-        {
-            cxx_record_decl->completeDefinition();
-            
-            return true;
-        }
-        
-        const EnumType *enum_type = dyn_cast<EnumType>(qual_type.getTypePtr());
-        
-        if (enum_type)
-        {
-            EnumDecl *enum_decl = enum_type->getDecl();
-            
-            if (enum_decl)
-            {
-                /// TODO This really needs to be fixed.
-                
-                unsigned NumPositiveBits = 1;
-                unsigned NumNegativeBits = 0;
-                
-                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->getTypeSize(enum_decl->getIntegerType()) < ast->getTypeSize(ast->IntTy))
-                {
-                    if (enum_decl->getIntegerType()->isSignedIntegerType())
-                        promotion_qual_type = ast->IntTy;
-                    else
-                        promotion_qual_type = ast->UnsignedIntTy;
-                }
-                else
-                    promotion_qual_type = enum_decl->getIntegerType();
-
-                enum_decl->completeDefinition(enum_decl->getIntegerType(), promotion_qual_type, NumPositiveBits, NumNegativeBits);
-                return true;
-            }
-        }
-    }
-    return false;
-}
-
-
-#pragma mark Enumeration Types
-
-clang_type_t
-ClangASTContext::CreateEnumerationType 
-(
-    const char *name, 
-    DeclContext *decl_ctx, 
-    const Declaration &decl, 
-    clang_type_t integer_qual_type
-)
-{
-    // TODO: Do something intelligent with the Declaration object passed in
-    // like maybe filling in the SourceLocation with it...
-    ASTContext *ast = getASTContext();
-    assert (ast != NULL);
-
-    // TODO: ask about these...
-//    const bool IsScoped = false;
-//    const bool IsFixed = false;
-
-    EnumDecl *enum_decl = EnumDecl::Create (*ast,
-                                            decl_ctx,
-                                            SourceLocation(),
-                                            SourceLocation(),
-                                            name && name[0] ? &ast->Idents.get(name) : NULL,
-                                            NULL, 
-                                            false,  // IsScoped
-                                            false,  // IsScopedUsingClassTag
-                                            false); // IsFixed
-    
-    
-    if (enum_decl)
-    {
-        // TODO: check if we should be setting the promotion type too?
-        enum_decl->setIntegerType(QualType::getFromOpaquePtr (integer_qual_type));
-        
-        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
-        
-        return ast->getTagDeclType(enum_decl).getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::GetEnumerationIntegerType (clang_type_t enum_clang_type)
-{
-    QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
-
-    const clang::Type *clang_type = enum_qual_type.getTypePtr();
-    if (clang_type)
-    {
-        const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
-        if (enum_type)
-        {
-            EnumDecl *enum_decl = enum_type->getDecl();
-            if (enum_decl)
-                return enum_decl->getIntegerType().getAsOpaquePtr();
-        }
-    }
-    return NULL;
-}
-bool
-ClangASTContext::AddEnumerationValueToEnumerationType
-(
-    clang_type_t enum_clang_type,
-    clang_type_t enumerator_clang_type,
-    const Declaration &decl,
-    const char *name,
-    int64_t enum_value,
-    uint32_t enum_value_bit_size
-)
-{
-    if (enum_clang_type && enumerator_clang_type && name)
-    {
-        // TODO: Do something intelligent with the Declaration object passed in
-        // like maybe filling in the SourceLocation with it...
-        ASTContext *ast = getASTContext();
-        IdentifierTable *identifier_table = getIdentifierTable();
-
-        assert (ast != NULL);
-        assert (identifier_table != NULL);
-        QualType enum_qual_type (QualType::getFromOpaquePtr(enum_clang_type));
-
-        const clang::Type *clang_type = enum_qual_type.getTypePtr();
-        if (clang_type)
-        {
-            const EnumType *enum_type = dyn_cast<EnumType>(clang_type);
-
-            if (enum_type)
-            {
-                llvm::APSInt enum_llvm_apsint(enum_value_bit_size, false);
-                enum_llvm_apsint = enum_value;
-                EnumConstantDecl *enumerator_decl =
-                    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);
-                    
-#ifdef LLDB_CONFIGURATION_DEBUG
-                    VerifyDecl(enumerator_decl);
-#endif
-                    
-                    return true;
-                }
-            }
-        }
-    }
-    return false;
-}
-
-#pragma mark Pointers & References
-
-clang_type_t
-ClangASTContext::CreatePointerType (clang_type_t clang_type)
-{
-    return CreatePointerType (getASTContext(), clang_type);
-}
-
-clang_type_t
-ClangASTContext::CreatePointerType (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (ast && clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            return ast->getObjCObjectPointerType(qual_type).getAsOpaquePtr();
-
-        default:
-            return ast->getPointerType(qual_type).getAsOpaquePtr();
-        }
-    }
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::CreateLValueReferenceType (clang::ASTContext *ast,
-                                            clang_type_t clang_type)
-{
-    if (clang_type)
-        return ast->getLValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::CreateRValueReferenceType (clang::ASTContext *ast,
-                                            clang_type_t clang_type)
-{
-    if (clang_type)
-        return ast->getRValueReferenceType (QualType::getFromOpaquePtr(clang_type)).getAsOpaquePtr();
-    return NULL;
-}
-
-clang_type_t
-ClangASTContext::CreateMemberPointerType (clang_type_t clang_pointee_type, clang_type_t clang_class_type)
-{
-    if (clang_pointee_type && clang_pointee_type)
-        return getASTContext()->getMemberPointerType(QualType::getFromOpaquePtr(clang_pointee_type),
-                                                     QualType::getFromOpaquePtr(clang_class_type).getTypePtr()).getAsOpaquePtr();
-    return NULL;
-}
-
-uint32_t
-ClangASTContext::GetPointerBitSize ()
-{
-    ASTContext *ast = getASTContext();
-    return ast->getTypeSize(ast->VoidPtrTy);
-}
-
-bool
-ClangASTContext::IsPossibleDynamicType (clang::ASTContext *ast,
-                                        clang_type_t clang_type,
-                                        clang_type_t *dynamic_pointee_type,
-                                        bool check_cplusplus,
-                                        bool check_objc)
-{
-    QualType pointee_qual_type;
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        bool success = false;
-        switch (type_class)
-        {
-            case clang::Type::Builtin:
-                if (check_objc && cast<clang::BuiltinType>(qual_type)->getKind() == clang::BuiltinType::ObjCId)
-                {
-                    if (dynamic_pointee_type)
-                        *dynamic_pointee_type = clang_type;
-                    return true;
-                }
-                break;
-
-            case clang::Type::ObjCObjectPointer:
-                if (check_objc)
-                {
-                    if (dynamic_pointee_type)
-                        *dynamic_pointee_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-                    return true;
-                }
-                break;
-
-            case clang::Type::Pointer:
-                pointee_qual_type = cast<PointerType>(qual_type)->getPointeeType();
-                success = true;
-                break;
-                
-            case clang::Type::LValueReference:
-            case clang::Type::RValueReference:
-                pointee_qual_type = cast<ReferenceType>(qual_type)->getPointeeType();
-                success = true;
-                break;
-                
-            case clang::Type::Typedef:
-                return ClangASTContext::IsPossibleDynamicType (ast,
-                                                               cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                               dynamic_pointee_type,
-                                                               check_cplusplus,
-                                                               check_objc);
-            
-            case clang::Type::Elaborated:
-                return ClangASTContext::IsPossibleDynamicType (ast,
-                                                               cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                               dynamic_pointee_type,
-                                                               check_cplusplus,
-                                                               check_objc);
-            
-            default:
-                break;
-        }
-        
-        if (success)
-        {
-            // Check to make sure what we are pointing too is a possible dynamic C++ type
-            // We currently accept any "void *" (in case we have a class that has been
-            // watered down to an opaque pointer) and virtual C++ classes.
-            const clang::Type::TypeClass pointee_type_class = pointee_qual_type->getTypeClass();
-            switch (pointee_type_class)
-            {
-                case clang::Type::Builtin:
-                    switch (cast<clang::BuiltinType>(pointee_qual_type)->getKind())
-                    {
-                        case clang::BuiltinType::UnknownAny:
-                        case clang::BuiltinType::Void:
-                            if (dynamic_pointee_type)
-                                *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
-                            return true;
-                            
-                        case clang::BuiltinType::NullPtr:  
-                        case clang::BuiltinType::Bool:
-                        case clang::BuiltinType::Char_U:
-                        case clang::BuiltinType::UChar:
-                        case clang::BuiltinType::WChar_U:
-                        case clang::BuiltinType::Char16:
-                        case clang::BuiltinType::Char32:
-                        case clang::BuiltinType::UShort:
-                        case clang::BuiltinType::UInt:
-                        case clang::BuiltinType::ULong:
-                        case clang::BuiltinType::ULongLong:
-                        case clang::BuiltinType::UInt128:
-                        case clang::BuiltinType::Char_S:
-                        case clang::BuiltinType::SChar:
-                        case clang::BuiltinType::WChar_S:
-                        case clang::BuiltinType::Short:
-                        case clang::BuiltinType::Int:
-                        case clang::BuiltinType::Long:
-                        case clang::BuiltinType::LongLong:
-                        case clang::BuiltinType::Int128:
-                        case clang::BuiltinType::Float:
-                        case clang::BuiltinType::Double:
-                        case clang::BuiltinType::LongDouble:
-                        case clang::BuiltinType::Dependent:
-                        case clang::BuiltinType::Overload:
-                        case clang::BuiltinType::ObjCId:
-                        case clang::BuiltinType::ObjCClass:
-                        case clang::BuiltinType::ObjCSel:
-                        case clang::BuiltinType::BoundMember:
-                        case clang::BuiltinType::Half:          
-                        case clang::BuiltinType::ARCUnbridgedCast:          
-                        case clang::BuiltinType::PseudoObject:
-                        case clang::BuiltinType::BuiltinFn:
-                            break;
-                    }
-                    break;
-
-                case clang::Type::Record:
-                    if (check_cplusplus)
-                    {
-                        CXXRecordDecl *cxx_record_decl = pointee_qual_type->getAsCXXRecordDecl();
-                        if (cxx_record_decl)
-                        {
-                            bool is_complete = cxx_record_decl->isCompleteDefinition();
-                            if (!is_complete)
-                                is_complete = ClangASTContext::GetCompleteType (ast, pointee_qual_type.getAsOpaquePtr());
-
-                            if (is_complete)
-                            {
-                                success = cxx_record_decl->isDynamicClass();
-                            }
-                            else
-                            {
-                                success = false;
-                            }
-
-                            if (success)
-                            {
-                                if (dynamic_pointee_type)
-                                    *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
-                                return true;
-                            }
-                        }
-                    }
-                    break;
-                    
-                case clang::Type::ObjCObject:
-                case clang::Type::ObjCInterface:
-                    if (check_objc)
-                    {
-                        if (dynamic_pointee_type)
-                            *dynamic_pointee_type = pointee_qual_type.getAsOpaquePtr();
-                        return true;
-                    }
-                    break;
-
-                default:
-                    break;
-            }
-        }
-    }
-    if (dynamic_pointee_type)
-        *dynamic_pointee_type = NULL;
-    return false;
-}
-
-
-bool
-ClangASTContext::IsPossibleCPlusPlusDynamicType (clang::ASTContext *ast, clang_type_t clang_type, clang_type_t *dynamic_pointee_type)
-{
-    return IsPossibleDynamicType (ast,
-                                  clang_type,
-                                  dynamic_pointee_type,
-                                  true,     // Check for dynamic C++ types
-                                  false);   // Check for dynamic ObjC types
-}
-
-bool
-ClangASTContext::IsReferenceType (clang_type_t clang_type, clang_type_t *target_type)
-{
-    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::LValueReference:
-        if (target_type)
-            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
-        return true;
-    case clang::Type::RValueReference:
-        if (target_type)
-            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
-        return true;
-    case clang::Type::Typedef:
-        return ClangASTContext::IsReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-    case clang::Type::Elaborated:
-        return ClangASTContext::IsReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-    default:
-        break;
-    }
-    
-    return false;
-}
-
-bool
-ClangASTContext::IsPointerOrReferenceType (clang_type_t clang_type, clang_type_t*target_type)
-{
-    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::Builtin:
-        switch (cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        default:
-            break;
-        case clang::BuiltinType::ObjCId:
-        case clang::BuiltinType::ObjCClass:
-            return true;
-        }
-        return false;
-    case clang::Type::ObjCObjectPointer:
-        if (target_type)
-            *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-        return true;
-    case clang::Type::BlockPointer:
-        if (target_type)
-            *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-        return true;
-    case clang::Type::Pointer:
-        if (target_type)
-            *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-        return true;
-    case clang::Type::MemberPointer:
-        if (target_type)
-            *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-        return true;
-    case clang::Type::LValueReference:
-        if (target_type)
-            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
-        return true;
-    case clang::Type::RValueReference:
-        if (target_type)
-            *target_type = cast<LValueReferenceType>(qual_type)->desugar().getAsOpaquePtr();
-        return true;
-    case clang::Type::Typedef:
-        return ClangASTContext::IsPointerOrReferenceType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-    case clang::Type::Elaborated:
-        return ClangASTContext::IsPointerOrReferenceType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-    default:
-        break;
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsIntegerType (clang_type_t clang_type, bool &is_signed)
-{
-    if (!clang_type)
-        return false;
-    
-    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-    const BuiltinType *builtin_type = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal());
-    
-    if (builtin_type)
-    {
-        if (builtin_type->isInteger())
-        {
-            is_signed = builtin_type->isSignedInteger();
-            return true;
-        }
-    }
-    
-    return false;
-}
-
-bool
-ClangASTContext::IsPointerType (clang_type_t clang_type, clang_type_t *target_type)
-{
-    if (target_type)
-        *target_type = NULL;
-
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        case clang::Type::Builtin:
-            switch (cast<clang::BuiltinType>(qual_type)->getKind())
-            {
-            default:
-                break;
-            case clang::BuiltinType::ObjCId:
-            case clang::BuiltinType::ObjCClass:
-                return true;
-            }
-            return false;
-        case clang::Type::ObjCObjectPointer:
-            if (target_type)
-                *target_type = cast<ObjCObjectPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-            return true;
-        case clang::Type::BlockPointer:
-            if (target_type)
-                *target_type = cast<BlockPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-            return true;
-        case clang::Type::Pointer:
-            if (target_type)
-                *target_type = cast<PointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-            return true;
-        case clang::Type::MemberPointer:
-            if (target_type)
-                *target_type = cast<MemberPointerType>(qual_type)->getPointeeType().getAsOpaquePtr();
-            return true;
-        case clang::Type::Typedef:
-            return ClangASTContext::IsPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), target_type);
-        case clang::Type::Elaborated:
-            return ClangASTContext::IsPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(), target_type);
-        default:
-            break;
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsFloatingPointType (clang_type_t clang_type, uint32_t &count, bool &is_complex)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-
-        if (const BuiltinType *BT = dyn_cast<BuiltinType>(qual_type->getCanonicalTypeInternal()))
-        {
-            clang::BuiltinType::Kind kind = BT->getKind();
-            if (kind >= BuiltinType::Float && kind <= BuiltinType::LongDouble)
-            {
-                count = 1;
-                is_complex = false;
-                return true;
-            }
-        }
-        else if (const ComplexType *CT = dyn_cast<ComplexType>(qual_type->getCanonicalTypeInternal()))
-        {
-            if (IsFloatingPointType(CT->getElementType().getAsOpaquePtr(), count, is_complex))
-            {
-                count = 2;
-                is_complex = true;
-                return true;
-            }
-        }
-        else if (const VectorType *VT = dyn_cast<VectorType>(qual_type->getCanonicalTypeInternal()))
-        {
-            if (IsFloatingPointType(VT->getElementType().getAsOpaquePtr(), count, is_complex))
-            {
-                count = VT->getNumElements();
-                is_complex = false;
-                return true;
-            }
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsScalarType (lldb::clang_type_t clang_type)
-{
-    bool is_signed;
-    if (ClangASTContext::IsIntegerType(clang_type, is_signed))
-        return true;
-    
-    uint32_t count;
-    bool is_complex;
-    return ClangASTContext::IsFloatingPointType(clang_type, count, is_complex) && !is_complex;
-}
-
-bool
-ClangASTContext::IsPointerToScalarType (lldb::clang_type_t clang_type)
-{
-    if (!IsPointerType(clang_type))
-        return false;
-    
-    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-    lldb::clang_type_t pointee_type = qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
-    return IsScalarType(pointee_type);
-}
-
-bool
-ClangASTContext::IsArrayOfScalarType (lldb::clang_type_t clang_type)
-{
-    clang_type = GetAsArrayType(clang_type);
-    
-    if (clang_type == 0)
-        return false;
-    
-    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-    lldb::clang_type_t item_type = cast<ArrayType>(qual_type.getTypePtr())->getElementType().getAsOpaquePtr();
-    return IsScalarType(item_type);
-}
-
-
-bool
-ClangASTContext::GetCXXClassName (clang_type_t clang_type, std::string &class_name)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        
-        CXXRecordDecl *cxx_record_decl = qual_type->getAsCXXRecordDecl();
-        if (cxx_record_decl)
-        {
-            class_name.assign (cxx_record_decl->getIdentifier()->getNameStart());
-            return true;
-        }
-    }
-    class_name.clear();
-    return false;
-}
-
-
-bool
-ClangASTContext::IsCXXClassType (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        if (qual_type->getAsCXXRecordDecl() != NULL)
-            return true;
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsBeingDefined (lldb::clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        const clang::TagType *tag_type = dyn_cast<clang::TagType>(qual_type);
-        if (tag_type)
-            return tag_type->isBeingDefined();
-    }
-    return false;
-}
-
-bool 
-ClangASTContext::IsObjCClassType (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        if (qual_type->isObjCObjectOrInterfaceType())
-            return true;
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsObjCObjectPointerType (lldb::clang_type_t clang_type, clang_type_t *class_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        if (qual_type->isObjCObjectPointerType())
-        {
-            if (class_type)
-            {
-                *class_type = NULL;
-                
-                if (!qual_type->isObjCClassType() &&
-                    !qual_type->isObjCIdType())
-                {
-                    const ObjCObjectPointerType *obj_pointer_type = dyn_cast<ObjCObjectPointerType>(qual_type);
-                    if (!obj_pointer_type)
-                        *class_type = NULL;
-                    else
-                        *class_type = QualType(obj_pointer_type->getInterfaceType(), 0).getAsOpaquePtr();
-                }
-            }
-            return true;
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::GetObjCClassName (lldb::clang_type_t clang_type,
-                                   std::string &class_name)
-{
-    if (!clang_type)
-        return false;
-        
-    const ObjCObjectType *object_type = dyn_cast<ObjCObjectType>(QualType::getFromOpaquePtr(clang_type));
-    if (!object_type)
-        return false;
-    
-    const ObjCInterfaceDecl *interface = object_type->getInterface();
-    if (!interface)
-        return false;
-    
-    class_name = interface->getNameAsString();
-    return true;
-}
-
-bool 
-ClangASTContext::IsCharType (clang_type_t clang_type)
-{
-    if (clang_type)
-        return QualType::getFromOpaquePtr(clang_type)->isCharType();
-    return false;
-}
-
-bool
-ClangASTContext::IsCStringType (clang_type_t clang_type, uint32_t &length)
-{
-    clang_type_t pointee_or_element_clang_type = NULL;
-    Flags type_flags (ClangASTContext::GetTypeInfo (clang_type, NULL, &pointee_or_element_clang_type));
-    
-    if (pointee_or_element_clang_type == NULL)
-        return false;
-
-    if (type_flags.AnySet (eTypeIsArray | eTypeIsPointer))
-    {
-        QualType pointee_or_element_qual_type (QualType::getFromOpaquePtr (pointee_or_element_clang_type));
-        
-        if (pointee_or_element_qual_type.getUnqualifiedType()->isCharType())
-        {
-            QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-            if (type_flags.Test (eTypeIsArray))
-            {
-                // We know the size of the array and it could be a C string
-                // since it is an array of characters
-                length = cast<ConstantArrayType>(qual_type.getTypePtr())->getSize().getLimitedValue();
-                return true;
-            }
-            else
-            {
-                length = 0;
-                return true;
-            }
-
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTContext::IsFunctionPointerType (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        
-        if (qual_type->isFunctionPointerType())
-            return true;
-    
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        default:
-            break;
-        case clang::Type::Typedef:
-            return ClangASTContext::IsFunctionPointerType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-        case clang::Type::Elaborated:
-            return ClangASTContext::IsFunctionPointerType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-
-        case clang::Type::LValueReference:
-        case clang::Type::RValueReference:
-            {
-                const ReferenceType *reference_type = cast<ReferenceType>(qual_type.getTypePtr());
-                if (reference_type)
-                    return ClangASTContext::IsFunctionPointerType (reference_type->getPointeeType().getAsOpaquePtr());
-            }
-            break;
-        }
-    }
-    return false;
-}
-
-size_t
-ClangASTContext::GetArraySize (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        QualType qual_type(QualType::getFromOpaquePtr(clang_type));
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        case clang::Type::ConstantArray:
-            {
-                const ConstantArrayType *array = cast<ConstantArrayType>(QualType::getFromOpaquePtr(clang_type).getTypePtr());
-                if (array)
-                    return array->getSize().getLimitedValue();
-            }
-            break;
-
-        case clang::Type::Typedef:
-            return ClangASTContext::GetArraySize(cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-            
-        case clang::Type::Elaborated:
-            return ClangASTContext::GetArraySize(cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr());
-                
-        default:
-            break;
-        }
-    }
-    return 0;
-}
-
-clang_type_t
-ClangASTContext::GetAsArrayType (clang_type_t clang_type, clang_type_t*member_type, uint64_t *size)
-{
-    if (!clang_type)
-        return 0;
-    
-    QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-    
-    const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-    switch (type_class)
-    {
-    default:
-        break;
-
-    case clang::Type::ConstantArray:
-        if (member_type)
-            *member_type = cast<ConstantArrayType>(qual_type)->getElementType().getAsOpaquePtr();
-        if (size)
-            *size = cast<ConstantArrayType>(qual_type)->getSize().getLimitedValue(ULLONG_MAX);
-        return clang_type;
-
-    case clang::Type::IncompleteArray:
-        if (member_type)
-            *member_type = cast<IncompleteArrayType>(qual_type)->getElementType().getAsOpaquePtr();
-        if (size)
-            *size = 0;
-        return clang_type;
-
-    case clang::Type::VariableArray:
-        if (member_type)
-            *member_type = cast<VariableArrayType>(qual_type)->getElementType().getAsOpaquePtr();
-        if (size)
-            *size = 0;
-        return clang_type;
-
-    case clang::Type::DependentSizedArray:
-        if (member_type)
-            *member_type = cast<DependentSizedArrayType>(qual_type)->getElementType().getAsOpaquePtr();
-        if (size)
-            *size = 0;
-        return clang_type;
-    
-    case clang::Type::Typedef:
-        return ClangASTContext::GetAsArrayType (cast<TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(),
-                                                member_type, 
-                                                size);
-    
-    case clang::Type::Elaborated:
-        return ClangASTContext::GetAsArrayType (cast<ElaboratedType>(qual_type)->getNamedType().getAsOpaquePtr(),
-                                                member_type,
-                                                size);
-    }
-    return 0;
-}
-
-
-#pragma mark Typedefs
-
-clang_type_t
-ClangASTContext::CreateTypedefType (const char *name, clang_type_t clang_type, DeclContext *decl_ctx)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        ASTContext *ast = getASTContext();
-        IdentifierTable *identifier_table = getIdentifierTable();
-        assert (ast != NULL);
-        assert (identifier_table != NULL);
-        if (decl_ctx == NULL)
-            decl_ctx = ast->getTranslationUnitDecl();
-        TypedefDecl *decl = TypedefDecl::Create (*ast,
-                                                 decl_ctx,
-                                                 SourceLocation(),
-                                                 SourceLocation(),
-                                                 name ? &identifier_table->get(name) : NULL, // Identifier
-                                                 ast->CreateTypeSourceInfo(qual_type));
-        
-        //decl_ctx->addDecl (decl);
-
-        decl->setAccess(AS_public); // TODO respect proper access specifier
-
-        // Get a uniqued QualType for the typedef decl type
-        return ast->getTypedefType (decl).getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-// Disable this for now since I can't seem to get a nicely formatted float
-// out of the APFloat class without just getting the float, double or quad
-// and then using a formatted print on it which defeats the purpose. We ideally
-// would like to get perfect string values for any kind of float semantics
-// so we can support remote targets. The code below also requires a patch to
-// llvm::APInt.
-//bool
-//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;
-//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
-//  {
-//      unsigned num_bytes_per_float = byte_size / count;
-//      unsigned num_bits_per_float = num_bytes_per_float * 8;
-//
-//      float_str.clear();
-//      uint32_t i;
-//      for (i=0; i<count; i++)
-//      {
-//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
-//          bool is_ieee = false;
-//          APFloat ap_float(ap_int, is_ieee);
-//          char s[1024];
-//          unsigned int hex_digits = 0;
-//          bool upper_case = false;
-//
-//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
-//          {
-//              if (i > 0)
-//                  float_str.append(", ");
-//              float_str.append(s);
-//              if (i == 1 && is_complex)
-//                  float_str.append(1, 'i');
-//          }
-//      }
-//      return !float_str.empty();
-//  }
-//  return false;
-//}
-
-size_t
-ClangASTContext::ConvertStringToFloatValue (ASTContext *ast, clang_type_t clang_type, const char *s, uint8_t *dst, size_t dst_size)
-{
-    if (clang_type)
-    {
-        QualType qual_type (QualType::getFromOpaquePtr(clang_type));
-        uint32_t count = 0;
-        bool is_complex = false;
-        if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
-        {
-            // TODO: handle complex and vector types
-            if (count != 1)
-                return false;
-
-            StringRef s_sref(s);
-            APFloat ap_float(ast->getFloatTypeSemantics(qual_type), s_sref);
-
-            const uint64_t bit_size = ast->getTypeSize (qual_type);
-            const uint64_t byte_size = bit_size / 8;
-            if (dst_size >= byte_size)
-            {
-                if (bit_size == sizeof(float)*8)
-                {
-                    float float32 = ap_float.convertToFloat();
-                    ::memcpy (dst, &float32, byte_size);
-                    return byte_size;
-                }
-                else if (bit_size >= 64)
-                {
-                    llvm::APInt ap_int(ap_float.bitcastToAPInt());
-                    ::memcpy (dst, ap_int.getRawData(), byte_size);
-                    return byte_size;
-                }
-            }
-        }
-    }
-    return 0;
-}
-
-unsigned
-ClangASTContext::GetTypeQualifiers(clang_type_t clang_type)
-{
-    assert (clang_type);
-    
-    QualType qual_type (QualType::getFromOpaquePtr(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;
-
-    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type));
-}
-
-
-bool
-ClangASTContext::GetCompleteType (clang_type_t clang_type)
-{   
-    return ClangASTContext::GetCompleteType (getASTContext(), clang_type);
-}
-
-bool
-ClangASTContext::IsCompleteType (clang::ASTContext *ast, lldb::clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return false;
-    
-    return GetCompleteQualType (ast, clang::QualType::getFromOpaquePtr(clang_type), false); // just check but don't let it actually complete
-}
-
-
-bool
-ClangASTContext::IsCompleteType (clang_type_t clang_type)
-{   
-    return ClangASTContext::IsCompleteType (getASTContext(), clang_type);
-}
-
-bool
-ClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
-                                  clang::Decl *decl)
-{
-    if (!decl)
-        return false;
-    
-    ExternalASTSource *ast_source = ast->getExternalSource();
-    
-    if (!ast_source)
-        return false;
-        
-    if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
-    {
-        if (tag_decl->isCompleteDefinition())
-            return true;
-        
-        if (!tag_decl->hasExternalLexicalStorage())
-            return false;
-        
-        ast_source->CompleteType(tag_decl);
-        
-        return !tag_decl->getTypeForDecl()->isIncompleteType();
-    }
-    else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
-    {
-        if (objc_interface_decl->getDefinition())
-            return true;
-        
-        if (!objc_interface_decl->hasExternalLexicalStorage())
-            return false;
-        
-        ast_source->CompleteType(objc_interface_decl);
-        
-        return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
-    }
-    else
-    {
-        return false;
-    }
-}
-
-void
-ClangASTContext::SetMetadata (clang::ASTContext *ast,
-                              uintptr_t object,
-                              uint64_t metadata)
-{
-    ClangExternalASTSourceCommon *external_source =
-        static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
-    
-    if (external_source)
-        external_source->SetMetadata(object, metadata);
-}
-
-uint64_t
-ClangASTContext::GetMetadata (clang::ASTContext *ast,
-                              uintptr_t object)
-{
-    ClangExternalASTSourceCommon *external_source =
-        static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
-    
-    if (external_source && external_source->HasMetadata(object))
-        return external_source->GetMetadata(object);
-    else
-        return 0;
-}
-
-clang::DeclContext *
-ClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
-{
-    return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
-}
-
-clang::DeclContext *
-ClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
-{
-    return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
-}
-
-
-bool
-ClangASTContext::GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
-                                                   lldb::LanguageType &language,
-                                                   bool &is_instance_method,
-                                                   ConstString &language_object_name)
-{
-    language_object_name.Clear();
-    language = eLanguageTypeUnknown;
-    is_instance_method = false;
-
-    if (decl_ctx)
-    {
-        if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
-        {
-            if (method_decl->isStatic())
-            {
-                is_instance_method = false;
-            }
-            else
-            {
-                language_object_name.SetCString("this");
-                is_instance_method = true;
-            }
-            language = eLanguageTypeC_plus_plus;
-            return true;
-        }
-        else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
-        {
-            // Both static and instance methods have a "self" object in objective C
-            language_object_name.SetCString("self");
-            if (method_decl->isInstanceMethod())
-            {
-                is_instance_method = true;
-            }
-            else
-            {
-                is_instance_method = false;
-            }
-            language = eLanguageTypeObjC;
-            return true;
-        }
-    }
-    return false;
-}
-

Removed: lldb/branches/windows/source/Symbol/ClangASTType.cpp.orig
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/windows/source/Symbol/ClangASTType.cpp.orig?rev=167219&view=auto
==============================================================================
--- lldb/branches/windows/source/Symbol/ClangASTType.cpp.orig (original)
+++ lldb/branches/windows/source/Symbol/ClangASTType.cpp.orig (removed)
@@ -1,1789 +0,0 @@
-//===-- ClangASTType.cpp ---------------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/Symbol/ClangASTType.h"
-
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Decl.h"
-#include "clang/AST/DeclCXX.h"
-#include "clang/AST/DeclObjC.h"
-#include "clang/AST/DeclGroup.h"
-#include "clang/AST/RecordLayout.h"
-#include "clang/AST/Type.h"
-
-#include "clang/Basic/Builtins.h"
-#include "clang/Basic/IdentifierTable.h"
-#include "clang/Basic/LangOptions.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Basic/TargetInfo.h"
-#include "clang/Basic/Version.h"
-
-#include "llvm/Support/FormattedStream.h"
-#include "llvm/Support/raw_ostream.h"
-
-#include "lldb/Core/ConstString.h"
-#include "lldb/Core/DataBufferHeap.h"
-#include "lldb/Core/DataExtractor.h"
-#include "lldb/Core/Debugger.h"
-#include "lldb/Core/Scalar.h"
-#include "lldb/Core/Stream.h"
-#include "lldb/Core/StreamString.h"
-#include "lldb/Symbol/ClangASTContext.h"
-#include "lldb/Target/ExecutionContext.h"
-#include "lldb/Target/Process.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-
-ClangASTType::~ClangASTType()
-{
-}
-
-std::string
-ClangASTType::GetTypeNameForQualType (clang::ASTContext *ast, clang::QualType qual_type)
-{
-    std::string type_name;
-    
-    clang::PrintingPolicy printing_policy (ast->getPrintingPolicy());
-    printing_policy.SuppressTagKeyword = true;
-    const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
-    if (typedef_type)
-    {
-        const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
-        type_name = typedef_decl->getQualifiedNameAsString(printing_policy);
-    }
-    else
-    {
-        type_name = qual_type.getAsString(printing_policy);
-    }
-    return type_name;
-}
-
-std::string
-ClangASTType::GetTypeNameForOpaqueQualType (clang::ASTContext *ast, clang_type_t opaque_qual_type)
-{
-    return GetTypeNameForQualType (ast, clang::QualType::getFromOpaquePtr(opaque_qual_type));
-}
-
-
-ConstString
-ClangASTType::GetConstTypeName ()
-{
-    // TODO: verify if we actually need to complete a type just to get its type name????
-    if (!ClangASTContext::GetCompleteType (this->m_ast, this->m_type))
-        return ConstString("<invalid>");
-    return GetConstTypeName (m_ast, m_type);
-}
-
-ConstString
-ClangASTType::GetConstQualifiedTypeName ()
-{
-    // TODO: verify if we actually need to complete a type just to get its fully qualified type name????
-    if (!ClangASTContext::GetCompleteType (this->m_ast, this->m_type))
-        return ConstString("<invalid>");
-    return GetConstQualifiedTypeName (m_ast, m_type);
-}
-
-ConstString
-ClangASTType::GetConstQualifiedTypeName (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (ast == NULL || clang_type == NULL)
-        return ConstString("<invalid>");
-
-    return ConstString (GetTypeNameForQualType (ast, clang::QualType::getFromOpaquePtr(clang_type)).c_str());
-}
-
-
-ConstString
-ClangASTType::GetConstTypeName (clang::ASTContext *ast, clang_type_t clang_type)
-{
-    if (!clang_type)
-        return ConstString("<invalid>");
-    
-    std::string type_name (GetTypeNameForOpaqueQualType(ast, clang_type));
-    ConstString const_type_name;
-    if (type_name.empty())
-        const_type_name.SetCString ("<invalid>");
-    else
-        const_type_name.SetCString(type_name.c_str());
-    return const_type_name;
-}
-
-clang_type_t
-ClangASTType::GetPointeeType ()
-{
-    return GetPointeeType (m_type);
-}
-
-clang_type_t
-ClangASTType::GetPointeeType (clang_type_t clang_type)
-{
-    if (clang_type)
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-        
-        return qual_type.getTypePtr()->getPointeeType().getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-lldb::clang_type_t
-ClangASTType::GetArrayElementType (uint32_t& stride)
-{
-    return GetArrayElementType(m_ast, m_type, stride);
-}
-
-lldb::clang_type_t
-ClangASTType::GetArrayElementType (clang::ASTContext* ast,
-                                   lldb::clang_type_t opaque_clang_qual_type,
-                                   uint32_t& stride)
-{
-    if (opaque_clang_qual_type)
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type));
-        
-        lldb::clang_type_t ret_type = qual_type.getTypePtr()->getArrayElementTypeNoTypeQual()->getCanonicalTypeUnqualified().getAsOpaquePtr();
-        
-        // TODO: the real stride will be >= this value.. find the real one!
-        stride = GetTypeByteSize(ast, ret_type);
-        
-        return ret_type;
-        
-    }
-    return NULL;
-
-}
-
-lldb::clang_type_t
-ClangASTType::GetPointerType () const
-{
-    return GetPointerType (m_ast, m_type);
-}
-
-lldb::clang_type_t
-ClangASTType::GetPointerType (clang::ASTContext *ast_context,
-                              lldb::clang_type_t opaque_clang_qual_type)
-{
-    if (opaque_clang_qual_type)
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type));
-        
-        return ast_context->getPointerType(qual_type).getAsOpaquePtr();
-    }
-    return NULL;
-}
-
-lldb::Encoding
-ClangASTType::GetEncoding (uint32_t &count)
-{
-    return GetEncoding(m_type, count);
-}
-
-
-lldb::LanguageType
-ClangASTType::GetMinimumLanguage ()
-{
-    return ClangASTType::GetMinimumLanguage (m_ast,
-                                             m_type);
-}
-
-lldb::TypeClass
-ClangASTType::GetTypeClass (clang::ASTContext *ast_context, lldb::clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return lldb::eTypeClassInvalid;
-
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    
-    switch (qual_type->getTypeClass())
-    {
-        case clang::Type::UnaryTransform:           break;
-        case clang::Type::FunctionNoProto:          return lldb::eTypeClassFunction;
-        case clang::Type::FunctionProto:            return lldb::eTypeClassFunction;
-        case clang::Type::IncompleteArray:          return lldb::eTypeClassArray;
-        case clang::Type::VariableArray:            return lldb::eTypeClassArray;
-        case clang::Type::ConstantArray:            return lldb::eTypeClassArray;
-        case clang::Type::DependentSizedArray:      return lldb::eTypeClassArray;
-        case clang::Type::DependentSizedExtVector:  return lldb::eTypeClassVector;
-        case clang::Type::ExtVector:                return lldb::eTypeClassVector;
-        case clang::Type::Vector:                   return lldb::eTypeClassVector;
-        case clang::Type::Builtin:                  return lldb::eTypeClassBuiltin;
-        case clang::Type::ObjCObjectPointer:        return lldb::eTypeClassObjCObjectPointer;
-        case clang::Type::BlockPointer:             return lldb::eTypeClassBlockPointer;
-        case clang::Type::Pointer:                  return lldb::eTypeClassPointer;
-        case clang::Type::LValueReference:          return lldb::eTypeClassReference;
-        case clang::Type::RValueReference:          return lldb::eTypeClassReference;
-        case clang::Type::MemberPointer:            return lldb::eTypeClassMemberPointer;
-        case clang::Type::Complex:
-            if (qual_type->isComplexType())
-                return lldb::eTypeClassComplexFloat;
-            else
-                return lldb::eTypeClassComplexInteger;
-        case clang::Type::ObjCObject:               return lldb::eTypeClassObjCObject;
-        case clang::Type::ObjCInterface:            return lldb::eTypeClassObjCInterface;
-        case clang::Type::Record:
-            if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-            {
-                const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
-                const clang::RecordDecl *record_decl = record_type->getDecl();
-                if (record_decl->isUnion())
-                    return lldb::eTypeClassUnion;
-                else if (record_decl->isStruct())
-                    return lldb::eTypeClassStruct;
-                else
-                    return lldb::eTypeClassClass;
-            }
-            break;
-        case clang::Type::Enum:                     return lldb::eTypeClassEnumeration;
-        case clang::Type::Typedef:                  return lldb::eTypeClassTypedef;
-        case clang::Type::UnresolvedUsing:          break;
-        case clang::Type::Paren:                    break;
-        case clang::Type::Elaborated:               break;
-        case clang::Type::Attributed:               break;
-        case clang::Type::TemplateTypeParm:         break;
-        case clang::Type::SubstTemplateTypeParm:    break;
-        case clang::Type::SubstTemplateTypeParmPack:break;
-        case clang::Type::Auto:                     break;
-        case clang::Type::InjectedClassName:        break;
-        case clang::Type::DependentName:            break;
-        case clang::Type::DependentTemplateSpecialization: break;
-        case clang::Type::PackExpansion:            break;
-            
-        case clang::Type::TypeOfExpr:               break;
-        case clang::Type::TypeOf:                   break;
-        case clang::Type::Decltype:                 break;
-        case clang::Type::TemplateSpecialization:   break;
-        case clang::Type::Atomic:                   break;
-    }
-    // We don't know hot to display this type...
-    return lldb::eTypeClassOther;
-
-}
-
-
-lldb::LanguageType
-ClangASTType::GetMinimumLanguage (clang::ASTContext *ctx,
-                                  lldb::clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return lldb::eLanguageTypeC;
-
-    // If the type is a reference, then resolve it to what it refers to first:     
-    clang::QualType qual_type (clang::QualType::getFromOpaquePtr(clang_type).getNonReferenceType());
-    if (qual_type->isAnyPointerType())
-    {
-        if (qual_type->isObjCObjectPointerType())
-            return lldb::eLanguageTypeObjC;
-        
-        clang::QualType pointee_type (qual_type->getPointeeType());
-        if (pointee_type->getCXXRecordDeclForPointerType() != NULL)
-            return lldb::eLanguageTypeC_plus_plus;
-        if (pointee_type->isObjCObjectOrInterfaceType())
-            return lldb::eLanguageTypeObjC;
-        if (pointee_type->isObjCClassType())
-            return lldb::eLanguageTypeObjC;
-        if (pointee_type.getTypePtr() == ctx->ObjCBuiltinIdTy.getTypePtr())
-            return lldb::eLanguageTypeObjC;
-    }
-    else
-    {
-        if (qual_type->isObjCObjectOrInterfaceType())
-            return lldb::eLanguageTypeObjC;
-        if (qual_type->getAsCXXRecordDecl())
-            return lldb::eLanguageTypeC_plus_plus;
-        switch (qual_type->getTypeClass())
-        {
-        default:
-                break;
-        case clang::Type::Builtin:
-          switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
-            {
-                default:
-                case clang::BuiltinType::Void:
-                case clang::BuiltinType::Bool:
-                case clang::BuiltinType::Char_U:
-                case clang::BuiltinType::UChar:
-                case clang::BuiltinType::WChar_U:
-                case clang::BuiltinType::Char16:
-                case clang::BuiltinType::Char32:
-                case clang::BuiltinType::UShort:
-                case clang::BuiltinType::UInt:
-                case clang::BuiltinType::ULong:
-                case clang::BuiltinType::ULongLong:
-                case clang::BuiltinType::UInt128:
-                case clang::BuiltinType::Char_S:
-                case clang::BuiltinType::SChar:
-                case clang::BuiltinType::WChar_S:
-                case clang::BuiltinType::Short:
-                case clang::BuiltinType::Int:
-                case clang::BuiltinType::Long:
-                case clang::BuiltinType::LongLong:
-                case clang::BuiltinType::Int128:
-                case clang::BuiltinType::Float:
-                case clang::BuiltinType::Double:
-                case clang::BuiltinType::LongDouble:
-                    break;
-
-                case clang::BuiltinType::NullPtr:   
-                    return eLanguageTypeC_plus_plus;
-                    
-                case clang::BuiltinType::ObjCId:
-                case clang::BuiltinType::ObjCClass:
-                case clang::BuiltinType::ObjCSel:   
-                    return eLanguageTypeObjC;
-
-                case clang::BuiltinType::Dependent:
-                case clang::BuiltinType::Overload:
-                case clang::BuiltinType::BoundMember:
-                case clang::BuiltinType::UnknownAny:
-                    break;
-            }
-            break;
-        case clang::Type::Typedef:
-            return GetMinimumLanguage(ctx,
-                                      llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-        }
-    }
-    return lldb::eLanguageTypeC;
-}
-
-lldb::Encoding
-ClangASTType::GetEncoding (clang_type_t clang_type, uint32_t &count)
-{
-    count = 1;
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-
-    switch (qual_type->getTypeClass())
-    {
-    case clang::Type::UnaryTransform:
-        break;
-            
-    case clang::Type::FunctionNoProto:
-    case clang::Type::FunctionProto:
-        break;
-
-    case clang::Type::IncompleteArray:
-    case clang::Type::VariableArray:
-        break;
-
-    case clang::Type::ConstantArray:
-        break;
-
-    case clang::Type::ExtVector:
-    case clang::Type::Vector:
-        // TODO: Set this to more than one???
-        break;
-
-    case clang::Type::Builtin:
-        switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        default: assert(0 && "Unknown builtin type!");
-        case clang::BuiltinType::Void:
-            break;
-
-        case clang::BuiltinType::Bool:
-        case clang::BuiltinType::Char_S:
-        case clang::BuiltinType::SChar:
-        case clang::BuiltinType::WChar_S:
-        case clang::BuiltinType::Char16:
-        case clang::BuiltinType::Char32:
-        case clang::BuiltinType::Short:
-        case clang::BuiltinType::Int:
-        case clang::BuiltinType::Long:
-        case clang::BuiltinType::LongLong:
-        case clang::BuiltinType::Int128:        return lldb::eEncodingSint;
-
-        case clang::BuiltinType::Char_U:
-        case clang::BuiltinType::UChar:
-        case clang::BuiltinType::WChar_U:
-        case clang::BuiltinType::UShort:
-        case clang::BuiltinType::UInt:
-        case clang::BuiltinType::ULong:
-        case clang::BuiltinType::ULongLong:
-        case clang::BuiltinType::UInt128:       return lldb::eEncodingUint;
-
-        case clang::BuiltinType::Float:
-        case clang::BuiltinType::Double:
-        case clang::BuiltinType::LongDouble:    return lldb::eEncodingIEEE754;
-        
-        case clang::BuiltinType::ObjCClass:
-        case clang::BuiltinType::ObjCId:
-        case clang::BuiltinType::ObjCSel:       return lldb::eEncodingUint;
-
-        case clang::BuiltinType::NullPtr:       return lldb::eEncodingUint;
-        }
-        break;
-    // All pointer types are represented as unsigned integer encodings.
-    // We may nee to add a eEncodingPointer if we ever need to know the
-    // difference
-    case clang::Type::ObjCObjectPointer:
-    case clang::Type::BlockPointer:
-    case clang::Type::Pointer:
-    case clang::Type::LValueReference:
-    case clang::Type::RValueReference:
-    case clang::Type::MemberPointer:            return lldb::eEncodingUint;
-    case clang::Type::Complex:
-        {
-            lldb::Encoding encoding = lldb::eEncodingIEEE754;
-            if (qual_type->isComplexType())
-                encoding = lldb::eEncodingIEEE754;
-            else
-            {
-                const clang::ComplexType *complex_type = qual_type->getAsComplexIntegerType();
-                if (complex_type)
-                    encoding = GetEncoding (complex_type->getElementType().getAsOpaquePtr(), count);
-                else 
-                    encoding = lldb::eEncodingSint;
-            }
-            count = 2;
-            return encoding;
-        }
-
-    case clang::Type::ObjCInterface:            break;
-    case clang::Type::Record:                   break;
-    case clang::Type::Enum:                     return lldb::eEncodingSint;
-    case clang::Type::Typedef:
-            return GetEncoding(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr(), count);
-        break;
-
-    case clang::Type::DependentSizedArray:
-    case clang::Type::DependentSizedExtVector:
-    case clang::Type::UnresolvedUsing:
-    case clang::Type::Paren:
-    case clang::Type::Elaborated:
-    case clang::Type::Attributed:
-    case clang::Type::TemplateTypeParm:
-    case clang::Type::SubstTemplateTypeParm:
-    case clang::Type::SubstTemplateTypeParmPack:
-    case clang::Type::Auto:
-    case clang::Type::InjectedClassName:
-    case clang::Type::DependentName:
-    case clang::Type::DependentTemplateSpecialization:
-    case clang::Type::PackExpansion:
-    case clang::Type::ObjCObject:
-            
-    case clang::Type::TypeOfExpr:
-    case clang::Type::TypeOf:
-    case clang::Type::Decltype:
-    case clang::Type::TemplateSpecialization:
-    case clang::Type::Atomic:
-        break;
-
-    }
-    count = 0;
-    return lldb::eEncodingInvalid;
-}
-
-lldb::Format
-ClangASTType::GetFormat ()
-{
-    return GetFormat (m_type);
-}
-
-lldb::Format
-ClangASTType::GetFormat (clang_type_t clang_type)
-{
-    if (clang_type == NULL)
-        return lldb::eFormatDefault;
-        
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-
-    switch (qual_type->getTypeClass())
-    {
-    case clang::Type::UnaryTransform:
-        break;
-        
-    case clang::Type::FunctionNoProto:
-    case clang::Type::FunctionProto:
-        break;
-
-    case clang::Type::IncompleteArray:
-    case clang::Type::VariableArray:
-        break;
-
-    case clang::Type::ConstantArray:
-        break;
-
-    case clang::Type::ExtVector:
-    case clang::Type::Vector:
-        break;
-
-    case clang::Type::Builtin:
-        switch (llvm::cast<clang::BuiltinType>(qual_type)->getKind())
-        {
-        //default: assert(0 && "Unknown builtin type!");
-        case clang::BuiltinType::UnknownAny:
-        case clang::BuiltinType::Void:
-        case clang::BuiltinType::BoundMember:
-            break;
-
-        case clang::BuiltinType::Bool:          return lldb::eFormatBoolean;
-        case clang::BuiltinType::Char_S:
-        case clang::BuiltinType::SChar:
-        case clang::BuiltinType::WChar_S:
-        case clang::BuiltinType::Char_U:
-        case clang::BuiltinType::UChar:
-        case clang::BuiltinType::WChar_U:       return lldb::eFormatChar;
-        case clang::BuiltinType::Char16:        return lldb::eFormatUnicode16;
-        case clang::BuiltinType::Char32:        return lldb::eFormatUnicode32;
-        case clang::BuiltinType::UShort:        return lldb::eFormatUnsigned;
-        case clang::BuiltinType::Short:         return lldb::eFormatDecimal;
-        case clang::BuiltinType::UInt:          return lldb::eFormatUnsigned;
-        case clang::BuiltinType::Int:           return lldb::eFormatDecimal;
-        case clang::BuiltinType::ULong:         return lldb::eFormatUnsigned;
-        case clang::BuiltinType::Long:          return lldb::eFormatDecimal;
-        case clang::BuiltinType::ULongLong:     return lldb::eFormatUnsigned;
-        case clang::BuiltinType::LongLong:      return lldb::eFormatDecimal;
-        case clang::BuiltinType::UInt128:       return lldb::eFormatUnsigned;
-        case clang::BuiltinType::Int128:        return lldb::eFormatDecimal;
-        case clang::BuiltinType::Float:         return lldb::eFormatFloat;
-        case clang::BuiltinType::Double:        return lldb::eFormatFloat;
-        case clang::BuiltinType::LongDouble:    return lldb::eFormatFloat;
-        case clang::BuiltinType::NullPtr:       
-        case clang::BuiltinType::Overload:
-        case clang::BuiltinType::Dependent:
-        case clang::BuiltinType::ObjCId:
-        case clang::BuiltinType::ObjCClass:
-        case clang::BuiltinType::ObjCSel:       
-        case clang::BuiltinType::Half:          
-        case clang::BuiltinType::ARCUnbridgedCast:          
-        case clang::BuiltinType::PseudoObject:
-        case clang::BuiltinType::BuiltinFn:
-            return lldb::eFormatHex;
-        }
-        break;
-    case clang::Type::ObjCObjectPointer:        return lldb::eFormatHex;
-    case clang::Type::BlockPointer:             return lldb::eFormatHex;
-    case clang::Type::Pointer:                  return lldb::eFormatHex;
-    case clang::Type::LValueReference:
-    case clang::Type::RValueReference:          return lldb::eFormatHex;
-    case clang::Type::MemberPointer:            break;
-    case clang::Type::Complex:
-        {
-            if (qual_type->isComplexType())
-                return lldb::eFormatComplex;
-            else
-                return lldb::eFormatComplexInteger;
-        }
-    case clang::Type::ObjCInterface:            break;
-    case clang::Type::Record:                   break;
-    case clang::Type::Enum:                     return lldb::eFormatEnum;
-    case clang::Type::Typedef:
-            return ClangASTType::GetFormat(llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType().getAsOpaquePtr());
-
-    case clang::Type::Auto:
-            return ClangASTType::GetFormat(llvm::cast<clang::AutoType>(qual_type)->desugar().getAsOpaquePtr());
-    case clang::Type::DependentSizedArray:
-    case clang::Type::DependentSizedExtVector:
-    case clang::Type::UnresolvedUsing:
-    case clang::Type::Paren:
-    case clang::Type::Elaborated:
-    case clang::Type::Attributed:
-    case clang::Type::TemplateTypeParm:
-    case clang::Type::SubstTemplateTypeParm:
-    case clang::Type::SubstTemplateTypeParmPack:
-    case clang::Type::InjectedClassName:
-    case clang::Type::DependentName:
-    case clang::Type::DependentTemplateSpecialization:
-    case clang::Type::PackExpansion:
-    case clang::Type::ObjCObject:
-            
-    case clang::Type::TypeOfExpr:
-    case clang::Type::TypeOf:
-    case clang::Type::Decltype:
-    case clang::Type::TemplateSpecialization:
-    case clang::Type::Atomic:
-            break;
-    }
-    // We don't know hot to display this type...
-    return lldb::eFormatBytes;
-}
-
-
-void
-ClangASTType::DumpValue
-(
-    ExecutionContext *exe_ctx,
-    Stream *s,
-    lldb::Format format,
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size,
-    uint32_t bitfield_bit_size,
-    uint32_t bitfield_bit_offset,
-    bool show_types,
-    bool show_summary,
-    bool verbose,
-    uint32_t depth
-)
-{
-    return DumpValue (m_ast, 
-                      m_type,
-                      exe_ctx,
-                      s,
-                      format,
-                      data,
-                      data_byte_offset,
-                      data_byte_size,
-                      bitfield_bit_size,
-                      bitfield_bit_offset,
-                      show_types,
-                      show_summary,
-                      verbose,
-                      depth);
-}
-                      
-#define DEPTH_INCREMENT 2
-void
-ClangASTType::DumpValue
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    ExecutionContext *exe_ctx,
-    Stream *s,
-    lldb::Format format,
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size,
-    uint32_t bitfield_bit_size,
-    uint32_t bitfield_bit_offset,
-    bool show_types,
-    bool show_summary,
-    bool verbose,
-    uint32_t depth
-)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    switch (qual_type->getTypeClass())
-    {
-    case clang::Type::Record:
-        if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-        {
-            const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
-            const clang::RecordDecl *record_decl = record_type->getDecl();
-            assert(record_decl);
-            uint32_t field_bit_offset = 0;
-            uint32_t field_byte_offset = 0;
-            const clang::ASTRecordLayout &record_layout = ast_context->getASTRecordLayout(record_decl);
-            uint32_t child_idx = 0;
-
-
-            const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
-            if (cxx_record_decl)
-            {
-                // We might have base classes to print out first
-                clang::CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
-                for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
-                     base_class != base_class_end;
-                     ++base_class)
-                {
-                    const clang::CXXRecordDecl *base_class_decl = llvm::cast<clang::CXXRecordDecl>(base_class->getType()->getAs<clang::RecordType>()->getDecl());
-
-                    // Skip empty base classes
-                    if (verbose == false && ClangASTContext::RecordHasFields(base_class_decl) == false)
-                        continue;
-
-                    if (base_class->isVirtual())
-                        field_bit_offset = record_layout.getVBaseClassOffset(base_class_decl).getQuantity() * 8;
-                    else
-                        field_bit_offset = record_layout.getBaseClassOffset(base_class_decl).getQuantity() * 8;
-                    field_byte_offset = field_bit_offset / 8;
-                    assert (field_bit_offset % 8 == 0);
-                    if (child_idx == 0)
-                        s->PutChar('{');
-                    else
-                        s->PutChar(',');
-
-                    clang::QualType base_class_qual_type = base_class->getType();
-                    std::string base_class_type_name(base_class_qual_type.getAsString());
-
-                    // Indent and print the base class type name
-                    s->Printf("\n%*s%s ", depth + DEPTH_INCREMENT, "", base_class_type_name.c_str());
-
-                    std::pair<uint64_t, unsigned> base_class_type_info = ast_context->getTypeInfo(base_class_qual_type);
-
-                    // Dump the value of the member
-                    DumpValue (ast_context,                        // The clang AST context for this type
-                               base_class_qual_type.getAsOpaquePtr(),// The clang type we want to dump
-                               exe_ctx,
-                               s,                                  // Stream to dump to
-                               ClangASTType::GetFormat(base_class_qual_type.getAsOpaquePtr()), // The format with which to display the member
-                               data,                               // Data buffer containing all bytes for this type
-                               data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
-                               base_class_type_info.first / 8,     // Size of this type in bytes
-                               0,                                  // Bitfield bit size
-                               0,                                  // Bitfield bit offset
-                               show_types,                         // Boolean indicating if we should show the variable types
-                               show_summary,                       // Boolean indicating if we should show a summary for the current type
-                               verbose,                            // Verbose output?
-                               depth + DEPTH_INCREMENT);           // Scope depth for any types that have children
-                    
-                    ++child_idx;
-                }
-            }
-            uint32_t field_idx = 0;
-            clang::RecordDecl::field_iterator field, field_end;
-            for (field = record_decl->field_begin(), field_end = record_decl->field_end(); field != field_end; ++field, ++field_idx, ++child_idx)
-            {
-                // Print the starting squiggly bracket (if this is the
-                // first member) or comman (for member 2 and beyong) for
-                // the struct/union/class member.
-                if (child_idx == 0)
-                    s->PutChar('{');
-                else
-                    s->PutChar(',');
-
-                // Indent
-                s->Printf("\n%*s", depth + DEPTH_INCREMENT, "");
-
-                clang::QualType field_type = field->getType();
-                // Print the member type if requested
-                // 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_type);
-                assert(field_idx < record_layout.getFieldCount());
-                // Figure out the field offset within the current struct/union/class type
-                field_bit_offset = record_layout.getFieldOffset (field_idx);
-                field_byte_offset = field_bit_offset / 8;
-                uint32_t field_bitfield_bit_size = 0;
-                uint32_t field_bitfield_bit_offset = 0;
-                if (ClangASTContext::FieldIsBitfield (ast_context, *field, field_bitfield_bit_size))
-                    field_bitfield_bit_offset = field_bit_offset % 8;
-
-                if (show_types)
-                {
-                    std::string field_type_name(field_type.getAsString());
-                    if (field_bitfield_bit_size > 0)
-                        s->Printf("(%s:%u) ", field_type_name.c_str(), field_bitfield_bit_size);
-                    else
-                        s->Printf("(%s) ", field_type_name.c_str());
-                }
-                // Print the member name and equal sign
-                s->Printf("%s = ", field->getNameAsString().c_str());
-
-
-                // Dump the value of the member
-                DumpValue (ast_context,                    // The clang AST context for this type
-                           field_type.getAsOpaquePtr(),    // The clang type we want to dump
-                           exe_ctx,
-                           s,                              // Stream to dump to
-                           ClangASTType::GetFormat(field_type.getAsOpaquePtr()),   // The format with which to display the member
-                           data,                           // Data buffer containing all bytes for this type
-                           data_byte_offset + field_byte_offset,// Offset into "data" where to grab value from
-                           field_type_info.first / 8,      // Size of this type in bytes
-                           field_bitfield_bit_size,        // Bitfield bit size
-                           field_bitfield_bit_offset,      // Bitfield bit offset
-                           show_types,                     // Boolean indicating if we should show the variable types
-                           show_summary,                   // Boolean indicating if we should show a summary for the current type
-                           verbose,                        // Verbose output?
-                           depth + DEPTH_INCREMENT);       // Scope depth for any types that have children
-            }
-
-            // Indent the trailing squiggly bracket
-            if (child_idx > 0)
-                s->Printf("\n%*s}", depth, "");
-        }
-        return;
-
-    case clang::Type::Enum:
-        if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-        {
-            const clang::EnumType *enum_type = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
-            const clang::EnumDecl *enum_decl = enum_type->getDecl();
-            assert(enum_decl);
-            clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
-            uint32_t offset = data_byte_offset;
-            const int64_t enum_value = data.GetMaxU64Bitfield(&offset, data_byte_size, bitfield_bit_size, bitfield_bit_offset);
-            for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
-            {
-                if (enum_pos->getInitVal() == enum_value)
-                {
-                    s->Printf("%s", enum_pos->getNameAsString().c_str());
-                    return;
-                }
-            }
-            // If we have gotten here we didn't get find the enumerator in the
-            // enum decl, so just print the integer.
-            s->Printf("%lli", enum_value);
-        }
-        return;
-
-    case clang::Type::ConstantArray:
-        {
-            const clang::ConstantArrayType *array = llvm::cast<clang::ConstantArrayType>(qual_type.getTypePtr());
-            bool is_array_of_characters = false;
-            clang::QualType element_qual_type = array->getElementType();
-
-            const clang::Type *canonical_type = element_qual_type->getCanonicalTypeInternal().getTypePtr();
-            if (canonical_type)
-                is_array_of_characters = canonical_type->isCharType();
-
-            const uint64_t element_count = array->getSize().getLimitedValue();
-
-            std::pair<uint64_t, unsigned> field_type_info = ast_context->getTypeInfo(element_qual_type);
-
-            uint32_t element_idx = 0;
-            uint32_t element_offset = 0;
-            uint64_t element_byte_size = field_type_info.first / 8;
-            uint32_t element_stride = element_byte_size;
-
-            if (is_array_of_characters)
-            {
-                s->PutChar('"');
-                data.Dump(s, data_byte_offset, lldb::eFormatChar, element_byte_size, element_count, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
-                s->PutChar('"');
-                return;
-            }
-            else
-            {
-                lldb::Format element_format = ClangASTType::GetFormat(element_qual_type.getAsOpaquePtr());
-
-                for (element_idx = 0; element_idx < element_count; ++element_idx)
-                {
-                    // Print the starting squiggly bracket (if this is the
-                    // first member) or comman (for member 2 and beyong) for
-                    // the struct/union/class member.
-                    if (element_idx == 0)
-                        s->PutChar('{');
-                    else
-                        s->PutChar(',');
-
-                    // Indent and print the index
-                    s->Printf("\n%*s[%u] ", depth + DEPTH_INCREMENT, "", element_idx);
-
-                    // Figure out the field offset within the current struct/union/class type
-                    element_offset = element_idx * element_stride;
-
-                    // Dump the value of the member
-                    DumpValue (ast_context,                    // The clang AST context for this type
-                               element_qual_type.getAsOpaquePtr(), // The clang type we want to dump
-                               exe_ctx,
-                               s,                              // Stream to dump to
-                               element_format,                 // The format with which to display the element
-                               data,                           // Data buffer containing all bytes for this type
-                               data_byte_offset + element_offset,// Offset into "data" where to grab value from
-                               element_byte_size,              // Size of this type in bytes
-                               0,                              // Bitfield bit size
-                               0,                              // Bitfield bit offset
-                               show_types,                     // Boolean indicating if we should show the variable types
-                               show_summary,                   // Boolean indicating if we should show a summary for the current type
-                               verbose,                        // Verbose output?
-                               depth + DEPTH_INCREMENT);       // Scope depth for any types that have children
-                }
-
-                // Indent the trailing squiggly bracket
-                if (element_idx > 0)
-                    s->Printf("\n%*s}", depth, "");
-            }
-        }
-        return;
-
-    case clang::Type::Typedef:
-        {
-            clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
-            lldb::Format typedef_format = ClangASTType::GetFormat(typedef_qual_type.getAsOpaquePtr());
-            std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type);
-            uint64_t typedef_byte_size = typedef_type_info.first / 8;
-
-            return DumpValue (ast_context,        // The clang AST context for this type
-                              typedef_qual_type.getAsOpaquePtr(), // The clang type we want to dump
-                              exe_ctx,
-                              s,                  // Stream to dump to
-                              typedef_format,     // The format with which to display the element
-                              data,               // Data buffer containing all bytes for this type
-                              data_byte_offset,   // Offset into "data" where to grab value from
-                              typedef_byte_size,  // Size of this type in bytes
-                              bitfield_bit_size,  // Bitfield bit size
-                              bitfield_bit_offset,// Bitfield bit offset
-                              show_types,         // Boolean indicating if we should show the variable types
-                              show_summary,       // Boolean indicating if we should show a summary for the current type
-                              verbose,            // Verbose output?
-                              depth);             // Scope depth for any types that have children
-        }
-        break;
-
-    default:
-        // We are down the a scalar type that we just need to display.
-        data.Dump(s, data_byte_offset, format, data_byte_size, 1, UINT32_MAX, LLDB_INVALID_ADDRESS, bitfield_bit_size, bitfield_bit_offset);
-
-        if (show_summary)
-            DumpSummary (ast_context, clang_type, exe_ctx, s, data, data_byte_offset, data_byte_size);
-        break;
-    }
-}
-
-
-
-bool
-ClangASTType::DumpTypeValue (Stream *s,
-                             lldb::Format format,
-                             const lldb_private::DataExtractor &data,
-                             uint32_t byte_offset,
-                             size_t byte_size,
-                             uint32_t bitfield_bit_size,
-                             uint32_t bitfield_bit_offset,
-                             ExecutionContextScope *exe_scope)
-{
-    return DumpTypeValue (m_ast,
-                          m_type,
-                          s,
-                          format,
-                          data,
-                          byte_offset,
-                          byte_size,
-                          bitfield_bit_size,
-                          bitfield_bit_offset,
-                          exe_scope);
-}
-
-
-bool
-ClangASTType::DumpTypeValue (clang::ASTContext *ast_context,
-                             clang_type_t clang_type,
-                             Stream *s,
-                             lldb::Format format,
-                             const lldb_private::DataExtractor &data,
-                             uint32_t byte_offset,
-                             size_t byte_size,
-                             uint32_t bitfield_bit_size,
-                             uint32_t bitfield_bit_offset,
-                             ExecutionContextScope *exe_scope)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    if (ClangASTContext::IsAggregateType (clang_type))
-    {
-        return 0;
-    }
-    else
-    {
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-            
-        switch (type_class)
-        {
-        case clang::Type::Typedef:
-            {
-                clang::QualType typedef_qual_type = llvm::cast<clang::TypedefType>(qual_type)->getDecl()->getUnderlyingType();
-                if (format == eFormatDefault)
-                    format = ClangASTType::GetFormat(typedef_qual_type.getAsOpaquePtr());
-                std::pair<uint64_t, unsigned> typedef_type_info = ast_context->getTypeInfo(typedef_qual_type);
-                uint64_t typedef_byte_size = typedef_type_info.first / 8;
-
-                return ClangASTType::DumpTypeValue (ast_context,            // The clang AST context for this type
-                                                    typedef_qual_type.getAsOpaquePtr(),     // The clang type we want to dump
-                                                    s,
-                                                    format,                 // The format with which to display the element
-                                                    data,                   // Data buffer containing all bytes for this type
-                                                    byte_offset,            // Offset into "data" where to grab value from
-                                                    typedef_byte_size,      // Size of this type in bytes
-                                                    bitfield_bit_size,      // Size in bits of a bitfield value, if zero don't treat as a bitfield
-                                                    bitfield_bit_offset,    // Offset in bits of a bitfield value if bitfield_bit_size != 0
-                                                    exe_scope);
-            }
-            break;
-
-        case clang::Type::Enum:
-            // If our format is enum or default, show the enumeration value as
-            // its enumeration string value, else just display it as requested.
-            if ((format == eFormatEnum || format == eFormatDefault) && ClangASTContext::GetCompleteType (ast_context, clang_type))
-            {
-                const clang::EnumType *enum_type = llvm::cast<clang::EnumType>(qual_type.getTypePtr());
-                const clang::EnumDecl *enum_decl = enum_type->getDecl();
-                assert(enum_decl);
-                clang::EnumDecl::enumerator_iterator enum_pos, enum_end_pos;
-                uint32_t offset = byte_offset;
-                const int64_t enum_value = data.GetMaxU64Bitfield (&offset, byte_size, bitfield_bit_size, bitfield_bit_offset);
-                for (enum_pos = enum_decl->enumerator_begin(), enum_end_pos = enum_decl->enumerator_end(); enum_pos != enum_end_pos; ++enum_pos)
-                {
-                    if (enum_pos->getInitVal() == enum_value)
-                    {
-                        s->PutCString (enum_pos->getNameAsString().c_str());
-                        return true;
-                    }
-                }
-                // If we have gotten here we didn't get find the enumerator in the
-                // enum decl, so just print the integer.
-                
-                s->Printf("%lli", enum_value);
-                return true;
-            }
-            // format was not enum, just fall through and dump the value as requested....
-                
-        default:
-            // We are down the a scalar type that we just need to display.
-            {
-                uint32_t item_count = 1;
-                // A few formats, we might need to modify our size and count for depending
-                // on how we are trying to display the value...
-                switch (format)
-                {
-                    default:
-                    case eFormatBoolean:
-                    case eFormatBinary:
-                    case eFormatComplex:
-                    case eFormatCString:         // NULL terminated C strings
-                    case eFormatDecimal:
-                    case eFormatEnum:
-                    case eFormatHex:
-                    case eFormatHexUppercase:
-                    case eFormatFloat:
-                    case eFormatOctal:
-                    case eFormatOSType:
-                    case eFormatUnsigned:
-                    case eFormatPointer:
-                    case eFormatVectorOfChar:
-                    case eFormatVectorOfSInt8:
-                    case eFormatVectorOfUInt8:
-                    case eFormatVectorOfSInt16:
-                    case eFormatVectorOfUInt16:
-                    case eFormatVectorOfSInt32:
-                    case eFormatVectorOfUInt32:
-                    case eFormatVectorOfSInt64:
-                    case eFormatVectorOfUInt64:
-                    case eFormatVectorOfFloat32:
-                    case eFormatVectorOfFloat64:
-                    case eFormatVectorOfUInt128:
-                        break;
-
-                    case eFormatChar: 
-                    case eFormatCharPrintable:  
-                    case eFormatCharArray:
-                    case eFormatBytes:
-                    case eFormatBytesWithASCII:
-                        item_count = byte_size;
-                        byte_size = 1; 
-                        break;
-
-                    case eFormatUnicode16:
-                        item_count = byte_size / 2; 
-                        byte_size = 2; 
-                        break;
-
-                    case eFormatUnicode32:
-                        item_count = byte_size / 4; 
-                        byte_size = 4; 
-                        break;
-                }
-                return data.Dump (s,
-                                  byte_offset,
-                                  format,
-                                  byte_size,
-                                  item_count,
-                                  UINT32_MAX,
-                                  LLDB_INVALID_ADDRESS,
-                                  bitfield_bit_size,
-                                  bitfield_bit_offset,
-                                  exe_scope);
-            }
-            break;
-        }
-    }
-    return 0;
-}
-
-
-
-void
-ClangASTType::DumpSummary
-(
-    ExecutionContext *exe_ctx,
-    Stream *s,
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size
-)
-{
-    return DumpSummary (m_ast,
-                        m_type,
-                        exe_ctx, 
-                        s, 
-                        data, 
-                        data_byte_offset, 
-                        data_byte_size);
-}
-
-void
-ClangASTType::DumpSummary
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    ExecutionContext *exe_ctx,
-    Stream *s,
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size
-)
-{
-    uint32_t length = 0;
-    if (ClangASTContext::IsCStringType (clang_type, length))
-    {
-        if (exe_ctx)
-        {
-            Process *process = exe_ctx->GetProcessPtr();
-            if (process)
-            {
-                uint32_t offset = data_byte_offset;
-                lldb::addr_t pointer_addresss = data.GetMaxU64(&offset, data_byte_size);
-                std::vector<uint8_t> buf;
-                if (length > 0)
-                    buf.resize (length);
-                else
-                    buf.resize (256);
-
-                lldb_private::DataExtractor cstr_data(&buf.front(), buf.size(), process->GetByteOrder(), 4);
-                buf.back() = '\0';
-                size_t bytes_read;
-                size_t total_cstr_len = 0;
-                Error error;
-                while ((bytes_read = process->ReadMemory (pointer_addresss, &buf.front(), buf.size(), error)) > 0)
-                {
-                    const size_t len = strlen((const char *)&buf.front());
-                    if (len == 0)
-                        break;
-                    if (total_cstr_len == 0)
-                        s->PutCString (" \"");
-                    cstr_data.Dump(s, 0, lldb::eFormatChar, 1, len, UINT32_MAX, LLDB_INVALID_ADDRESS, 0, 0);
-                    total_cstr_len += len;
-                    if (len < buf.size())
-                        break;
-                    pointer_addresss += total_cstr_len;
-                }
-                if (total_cstr_len > 0)
-                    s->PutChar ('"');
-            }
-        }
-    }
-}
-
-uint32_t
-ClangASTType::GetClangTypeBitWidth ()
-{
-    return GetClangTypeBitWidth (m_ast, m_type);
-}
-
-uint32_t
-ClangASTType::GetClangTypeBitWidth (clang::ASTContext *ast_context, clang_type_t clang_type)
-{
-    if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-        return ast_context->getTypeSize (qual_type);
-    }
-    return 0;
-}
-
-size_t
-ClangASTType::GetTypeBitAlign ()
-{
-    return GetTypeBitAlign (m_ast, m_type);
-}
-
-size_t
-ClangASTType::GetTypeBitAlign (clang::ASTContext *ast_context, clang_type_t clang_type)
-{
-    if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-        return ast_context->getTypeAlign(clang::QualType::getFromOpaquePtr(clang_type));
-    return 0;
-}
-
-
-bool
-ClangASTType::IsDefined()
-{
-    return ClangASTType::IsDefined (m_type);
-}
-
-bool
-ClangASTType::IsDefined (clang_type_t clang_type)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
-    if (tag_type)
-    {
-        clang::TagDecl *tag_decl = tag_type->getDecl();
-        if (tag_decl)
-            return tag_decl->isCompleteDefinition();
-        return false;
-    }
-    else
-    {
-        const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type);
-        if (objc_class_type)
-        {
-            clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-            if (class_interface_decl)
-                return class_interface_decl->getDefinition() != NULL;
-            return false;
-        }
-    }
-    return true;
-}
-
-bool
-ClangASTType::IsConst()
-{
-    return ClangASTType::IsConst (m_type);
-}
-
-bool
-ClangASTType::IsConst (lldb::clang_type_t clang_type)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    
-    return qual_type.isConstQualified();
-}
-
-void
-ClangASTType::DumpTypeDescription (Stream *s)
-{
-    return DumpTypeDescription (m_ast, m_type, s);
-}
-
-// Dump the full description of a type. For classes this means all of the
-// ivars and member functions, for structs/unions all of the members. 
-void
-ClangASTType::DumpTypeDescription (clang::ASTContext *ast_context, clang_type_t clang_type, Stream *s)
-{
-    if (clang_type)
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-
-        llvm::SmallVector<char, 1024> buf;
-        llvm::raw_svector_ostream llvm_ostrm (buf);
-
-        const clang::Type::TypeClass type_class = qual_type->getTypeClass();
-        switch (type_class)
-        {
-        case clang::Type::ObjCObject:
-        case clang::Type::ObjCInterface:
-            if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-            {
-                const clang::ObjCObjectType *objc_class_type = llvm::dyn_cast<clang::ObjCObjectType>(qual_type.getTypePtr());
-                assert (objc_class_type);
-                if (objc_class_type)
-                {
-                    clang::ObjCInterfaceDecl *class_interface_decl = objc_class_type->getInterface();
-                    if (class_interface_decl)
-                    {
-                        clang::PrintingPolicy policy = ast_context->getPrintingPolicy();
-<<<<<<< .working
-						
-#if CLANG_VERSION_MAJOR > 3 || (CLANG_VERSION_MAJOR == 3 && CLANG_VERSION_MINOR  >= 2)
-#else
-                        policy.Dump = 1;
-=======
-                        policy.DumpSourceManager = &ast_context->getSourceManager();
->>>>>>> .merge-right.r164814
-#endif
-                        class_interface_decl->print(llvm_ostrm, policy, s->GetIndentLevel());
-                    }
-                }
-            }
-            break;
-        
-        case clang::Type::Typedef:
-            {
-                const clang::TypedefType *typedef_type = qual_type->getAs<clang::TypedefType>();
-                if (typedef_type)
-                {
-                    const clang::TypedefNameDecl *typedef_decl = typedef_type->getDecl();
-                    std::string clang_typedef_name (typedef_decl->getQualifiedNameAsString());
-                    if (!clang_typedef_name.empty())
-                    {
-                        s->PutCString ("typedef ");
-                        s->PutCString (clang_typedef_name.c_str());
-                    }
-                }
-            }
-            break;
-
-        case clang::Type::Record:
-            if (ClangASTContext::GetCompleteType (ast_context, clang_type))
-            {
-                const clang::RecordType *record_type = llvm::cast<clang::RecordType>(qual_type.getTypePtr());
-                const clang::RecordDecl *record_decl = record_type->getDecl();
-                const clang::CXXRecordDecl *cxx_record_decl = llvm::dyn_cast<clang::CXXRecordDecl>(record_decl);
-
-                if (cxx_record_decl)
-                    cxx_record_decl->print(llvm_ostrm, ast_context->getPrintingPolicy(), s->GetIndentLevel());
-                else
-                    record_decl->print(llvm_ostrm, ast_context->getPrintingPolicy(), s->GetIndentLevel());
-            }
-            break;
-
-        default:
-            {
-                const clang::TagType *tag_type = llvm::dyn_cast<clang::TagType>(qual_type.getTypePtr());
-                if (tag_type)
-                {
-                    clang::TagDecl *tag_decl = tag_type->getDecl();
-                    if (tag_decl)
-                        tag_decl->print(llvm_ostrm, 0);
-                }
-                else
-                {
-                    std::string clang_type_name(qual_type.getAsString());
-                    if (!clang_type_name.empty())
-                        s->PutCString (clang_type_name.c_str());
-                }
-            }
-        }
-        
-        llvm_ostrm.flush();
-        if (buf.size() > 0)
-        {
-            s->Write (buf.data(), buf.size());
-        }
-    }
-}
-
-void
-ClangASTType::DumpTypeCode (Stream *s)
-{
-    DumpTypeCode(m_type, s);
-}
-
-void
-ClangASTType::DumpTypeCode (void *type, 
-                            Stream *s)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(type));
-    s->PutCString(qual_type.getAsString().c_str());
-}
-
-bool
-ClangASTType::GetValueAsScalar
-(
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size,
-    Scalar &value
-)
-{
-    return GetValueAsScalar (m_ast, 
-                             m_type, 
-                             data, 
-                             data_byte_offset, 
-                             data_byte_size, 
-                             value);
-}
-
-bool
-ClangASTType::GetValueAsScalar
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    const lldb_private::DataExtractor &data,
-    uint32_t data_byte_offset,
-    size_t data_byte_size,
-    Scalar &value
-)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-
-    if (ClangASTContext::IsAggregateType (clang_type))
-    {
-        return false;   // Aggregate types don't have scalar values
-    }
-    else
-    {
-        uint32_t count = 0;
-        lldb::Encoding encoding = GetEncoding (clang_type, count);
-
-        if (encoding == lldb::eEncodingInvalid || count != 1)
-            return false;
-
-        uint64_t bit_width = ast_context->getTypeSize(qual_type);
-        uint32_t byte_size = (bit_width + 7 ) / 8;
-        uint32_t offset = data_byte_offset;
-        switch (encoding)
-        {
-        case lldb::eEncodingInvalid:
-            break;
-        case lldb::eEncodingVector:
-            break;
-        case lldb::eEncodingUint:
-            if (byte_size <= sizeof(unsigned long long))
-            {
-                uint64_t uval64 = data.GetMaxU64 (&offset, byte_size);
-                if (byte_size <= sizeof(unsigned int))
-                {
-                    value = (unsigned int)uval64;
-                    return true;
-                }
-                else if (byte_size <= sizeof(unsigned long))
-                {
-                    value = (unsigned long)uval64;
-                    return true;
-                }
-                else if (byte_size <= sizeof(unsigned long long))
-                {
-                    value = (unsigned long long )uval64;
-                    return true;
-                }
-                else
-                    value.Clear();
-            }
-            break;
-
-        case lldb::eEncodingSint:
-            if (byte_size <= sizeof(long long))
-            {
-                int64_t sval64 = data.GetMaxS64 (&offset, byte_size);
-                if (byte_size <= sizeof(int))
-                {
-                    value = (int)sval64;
-                    return true;
-                }
-                else if (byte_size <= sizeof(long))
-                {
-                    value = (long)sval64;
-                    return true;
-                }
-                else if (byte_size <= sizeof(long long))
-                {
-                    value = (long long )sval64;
-                    return true;
-                }
-                else
-                    value.Clear();
-            }
-            break;
-
-        case lldb::eEncodingIEEE754:
-            if (byte_size <= sizeof(long double))
-            {
-                uint32_t u32;
-                uint64_t u64;
-                if (byte_size == sizeof(float))
-                {
-                    if (sizeof(float) == sizeof(uint32_t))
-                    {
-                        u32 = data.GetU32(&offset);
-                        value = *((float *)&u32);
-                        return true;
-                    }
-                    else if (sizeof(float) == sizeof(uint64_t))
-                    {
-                        u64 = data.GetU64(&offset);
-                        value = *((float *)&u64);
-                        return true;
-                    }
-                }
-                else
-                if (byte_size == sizeof(double))
-                {
-                    if (sizeof(double) == sizeof(uint32_t))
-                    {
-                        u32 = data.GetU32(&offset);
-                        value = *((double *)&u32);
-                        return true;
-                    }
-                    else if (sizeof(double) == sizeof(uint64_t))
-                    {
-                        u64 = data.GetU64(&offset);
-                        value = *((double *)&u64);
-                        return true;
-                    }
-                }
-                else
-                if (byte_size == sizeof(long double))
-                {
-                    if (sizeof(long double) == sizeof(uint32_t))
-                    {
-                        u32 = data.GetU32(&offset);
-                        value = *((long double *)&u32);
-                        return true;
-                    }
-                    else if (sizeof(long double) == sizeof(uint64_t))
-                    {
-                        u64 = data.GetU64(&offset);
-                        value = *((long double *)&u64);
-                        return true;
-                    }
-                }
-            }
-            break;
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTType::SetValueFromScalar (const Scalar &value, Stream &strm)
-{
-    return SetValueFromScalar (m_ast, m_type, value, strm);
-}
-
-bool
-ClangASTType::SetValueFromScalar
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    const Scalar &value,
-    Stream &strm
-)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-
-    // Aggregate types don't have scalar values
-    if (!ClangASTContext::IsAggregateType (clang_type))
-    {
-        strm.GetFlags().Set(Stream::eBinary);
-        uint32_t count = 0;
-        lldb::Encoding encoding = GetEncoding (clang_type, count);
-
-        if (encoding == lldb::eEncodingInvalid || count != 1)
-            return false;
-
-        uint64_t bit_width = ast_context->getTypeSize(qual_type);
-        // This function doesn't currently handle non-byte aligned assignments
-        if ((bit_width % 8) != 0)
-            return false;
-
-        uint32_t byte_size = (bit_width + 7 ) / 8;
-        switch (encoding)
-        {
-        case lldb::eEncodingInvalid:
-            break;
-        case lldb::eEncodingVector:
-            break;
-        case lldb::eEncodingUint:
-            switch (byte_size)
-            {
-            case 1: strm.PutHex8(value.UInt()); return true;
-            case 2: strm.PutHex16(value.UInt()); return true;
-            case 4: strm.PutHex32(value.UInt()); return true;
-            case 8: strm.PutHex64(value.ULongLong()); return true;
-            default:
-                break;
-            }
-            break;
-
-        case lldb::eEncodingSint:
-            switch (byte_size)
-            {
-            case 1: strm.PutHex8(value.SInt()); return true;
-            case 2: strm.PutHex16(value.SInt()); return true;
-            case 4: strm.PutHex32(value.SInt()); return true;
-            case 8: strm.PutHex64(value.SLongLong()); return true;
-            default:
-                break;
-            }
-            break;
-
-        case lldb::eEncodingIEEE754:
-            if (byte_size <= sizeof(long double))
-            {
-                if (byte_size == sizeof(float))
-                {
-                    strm.PutFloat(value.Float());
-                    return true;
-                }
-                else
-                if (byte_size == sizeof(double))
-                {
-                    strm.PutDouble(value.Double());
-                    return true;
-                }
-                else
-                if (byte_size == sizeof(long double))
-                {
-                    strm.PutDouble(value.LongDouble());
-                    return true;
-                }
-            }
-            break;
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTType::ReadFromMemory
-(
-    lldb_private::ExecutionContext *exe_ctx,
-    lldb::addr_t addr,
-    AddressType address_type,
-    lldb_private::DataExtractor &data
-)
-{
-    return ReadFromMemory (m_ast,
-                           m_type,
-                           exe_ctx, 
-                           addr,
-                           address_type,
-                           data);
-}
-
-uint32_t
-ClangASTType::GetTypeByteSize() const
-{
-    return GetTypeByteSize(m_ast,
-                           m_type);
-}
-
-uint32_t
-ClangASTType::GetTypeByteSize(
-                clang::ASTContext *ast_context,
-                lldb::clang_type_t opaque_clang_qual_type)
-{
-    
-    if (ClangASTContext::GetCompleteType (ast_context, opaque_clang_qual_type))
-    {
-        clang::QualType qual_type(clang::QualType::getFromOpaquePtr(opaque_clang_qual_type));
-        
-        uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8;
-        
-        if (ClangASTContext::IsObjCClassType(opaque_clang_qual_type))
-            byte_size += ast_context->getTypeSize(ast_context->ObjCBuiltinClassTy) / 8; // isa
-        
-        return byte_size;
-    }
-    return 0;
-}
-
-
-bool
-ClangASTType::ReadFromMemory
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    lldb_private::ExecutionContext *exe_ctx,
-    lldb::addr_t addr,
-    AddressType address_type,
-    lldb_private::DataExtractor &data
-)
-{
-    if (address_type == eAddressTypeFile)
-    {
-        // Can't convert a file address to anything valid without more
-        // context (which Module it came from)
-        return false;
-    }
-    
-    if (!ClangASTContext::GetCompleteType(ast_context, clang_type))
-        return false;
-    
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    
-    const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8;
-    if (data.GetByteSize() < byte_size)
-    {
-        lldb::DataBufferSP data_sp(new DataBufferHeap (byte_size, '\0'));
-        data.SetData(data_sp);
-    }
-
-    uint8_t* dst = (uint8_t*)data.PeekData(0, byte_size);
-    if (dst != NULL)
-    {
-        if (address_type == eAddressTypeHost)
-        {
-            // The address is an address in this process, so just copy it
-            memcpy (dst, (uint8_t*)NULL + addr, byte_size);
-            return true;
-        }
-        else
-        {
-            Process *process = NULL;
-            if (exe_ctx)
-                process = exe_ctx->GetProcessPtr();
-            if (process)
-            {
-                Error error;
-                return process->ReadMemory(addr, dst, byte_size, error) == byte_size;
-            }
-        }
-    }
-    return false;
-}
-
-bool
-ClangASTType::WriteToMemory
-(
-    lldb_private::ExecutionContext *exe_ctx,
-    lldb::addr_t addr,
-    AddressType address_type,
-    StreamString &new_value
-)
-{
-    return WriteToMemory (m_ast,
-                          m_type,
-                          exe_ctx,
-                          addr,
-                          address_type,
-                          new_value);
-}
-
-bool
-ClangASTType::WriteToMemory
-(
-    clang::ASTContext *ast_context,
-    clang_type_t clang_type,
-    lldb_private::ExecutionContext *exe_ctx,
-    lldb::addr_t addr,
-    AddressType address_type,
-    StreamString &new_value
-)
-{
-    if (address_type == eAddressTypeFile)
-    {
-        // Can't convert a file address to anything valid without more
-        // context (which Module it came from)
-        return false;
-    }
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    const uint32_t byte_size = (ast_context->getTypeSize (qual_type) + 7) / 8;
-
-    if (byte_size > 0)
-    {
-        if (address_type == eAddressTypeHost)
-        {
-            // The address is an address in this process, so just copy it
-            memcpy ((void *)addr, new_value.GetData(), byte_size);
-            return true;
-        }
-        else
-        {
-            Process *process = NULL;
-            if (exe_ctx)
-                process = exe_ctx->GetProcessPtr();
-            if (process)
-            {
-                Error error;
-                return process->WriteMemory(addr, new_value.GetData(), byte_size, error) == byte_size;
-            }
-        }
-    }
-    return false;
-}
-
-
-lldb::clang_type_t
-ClangASTType::RemoveFastQualifiers (lldb::clang_type_t clang_type)
-{
-    clang::QualType qual_type(clang::QualType::getFromOpaquePtr(clang_type));
-    qual_type.getQualifiers().removeFastQualifiers();
-    return qual_type.getAsOpaquePtr();
-}
-
-
-bool
-lldb_private::operator == (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
-{
-    return lhs.GetASTContext() == rhs.GetASTContext() && lhs.GetOpaqueQualType() == rhs.GetOpaqueQualType();
-}
-
-
-bool
-lldb_private::operator != (const lldb_private::ClangASTType &lhs, const lldb_private::ClangASTType &rhs)
-{
-    return lhs.GetASTContext() != rhs.GetASTContext() || lhs.GetOpaqueQualType() != rhs.GetOpaqueQualType();
-}

Removed: lldb/branches/windows/source/Target/ObjCLanguageRuntime.cpp.orig
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/windows/source/Target/ObjCLanguageRuntime.cpp.orig?rev=167219&view=auto
==============================================================================
--- lldb/branches/windows/source/Target/ObjCLanguageRuntime.cpp.orig (original)
+++ lldb/branches/windows/source/Target/ObjCLanguageRuntime.cpp.orig (removed)
@@ -1,406 +0,0 @@
-//===-- ObjCLanguageRuntime.cpp ---------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-#include "clang/AST/Type.h"
-
-#include "lldb/Core/Log.h"
-#include "lldb/Core/Module.h"
-#include "lldb/Core/PluginManager.h"
-#include "lldb/Core/ValueObject.h"
-#include "lldb/Symbol/ClangASTContext.h"
-#include "lldb/Symbol/Type.h"
-#include "lldb/Symbol/TypeList.h"
-#include "lldb/Target/ObjCLanguageRuntime.h"
-#include "lldb/Target/Target.h"
-
-using namespace lldb;
-using namespace lldb_private;
-
-//----------------------------------------------------------------------
-// Destructor
-//----------------------------------------------------------------------
-ObjCLanguageRuntime::~ObjCLanguageRuntime()
-{
-}
-
-ObjCLanguageRuntime::ObjCLanguageRuntime (Process *process) :
-    LanguageRuntime (process),
-    m_has_new_literals_and_indexing (eLazyBoolCalculate),
-    m_isa_to_descriptor_cache(),
-    m_isa_to_descriptor_cache_is_up_to_date (false)
-{
-
-}
-
-void
-ObjCLanguageRuntime::AddToMethodCache (lldb::addr_t class_addr, lldb::addr_t selector, lldb::addr_t impl_addr)
-{
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
-    if (log)
-    {
-        log->Printf ("Caching: class 0x%llx selector 0x%llx implementation 0x%llx.", class_addr, selector, impl_addr);
-    }
-    m_impl_cache.insert (std::pair<ClassAndSel,lldb::addr_t> (ClassAndSel(class_addr, selector), impl_addr));
-}
-
-lldb::addr_t
-ObjCLanguageRuntime::LookupInMethodCache (lldb::addr_t class_addr, lldb::addr_t selector)
-{
-    MsgImplMap::iterator pos, end = m_impl_cache.end();
-    pos = m_impl_cache.find (ClassAndSel(class_addr, selector));
-    if (pos != end)
-        return (*pos).second;
-    return LLDB_INVALID_ADDRESS;
-}
-
-void
-ObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const char *name, lldb::TypeSP type_sp)
-{
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
-    if (log)
-    {
-        log->Printf ("Caching: class 0x%llx name: %s.", class_addr, name);
-    }
-    
-    TypeAndOrName class_type_or_name;
-    
-    if (type_sp)
-        class_type_or_name.SetTypeSP (type_sp);
-    else if (name && *name != '\0')
-        class_type_or_name.SetName (name);
-    else 
-        return;
-    m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
-}
-
-void
-ObjCLanguageRuntime::AddToClassNameCache (lldb::addr_t class_addr, const TypeAndOrName &class_type_or_name)
-{
-    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
-    if (log)
-    {
-        log->Printf ("Caching: class 0x%llx name: %s.", class_addr, class_type_or_name.GetName().AsCString());
-    }
-    
-    m_class_name_cache.insert (std::pair<lldb::addr_t,TypeAndOrName> (class_addr, class_type_or_name));
-}
-
-TypeAndOrName
-ObjCLanguageRuntime::LookupInClassNameCache (lldb::addr_t class_addr)
-{
-    ClassNameMap::iterator pos, end = m_class_name_cache.end();
-    pos = m_class_name_cache.find (class_addr);
-    if (pos != end)
-        return (*pos).second;
-    return TypeAndOrName ();
-}
-
-lldb::TypeSP
-ObjCLanguageRuntime::LookupInCompleteClassCache (ConstString &name)
-{
-    CompleteClassMap::iterator complete_class_iter = m_complete_class_cache.find(name);
-    
-    if (complete_class_iter != m_complete_class_cache.end())
-    {
-        TypeSP ret(complete_class_iter->second);
-        
-        if (!ret)
-            m_complete_class_cache.erase(name);
-        else
-            return TypeSP(complete_class_iter->second);
-    }
-    
-    ModuleList &modules = m_process->GetTarget().GetImages();
-    
-    SymbolContextList sc_list;
-    
-    modules.FindSymbolsWithNameAndType(name, eSymbolTypeObjCClass, sc_list);
-    
-    if (sc_list.GetSize() == 0)
-        return TypeSP();
-    
-    SymbolContext sc;
-    
-    sc_list.GetContextAtIndex(0, sc);
-    
-    ModuleSP module_sp(sc.module_sp);
-    
-    if (!module_sp)
-        return TypeSP();
-    
-    const SymbolContext null_sc;
-    const bool exact_match = true;
-    const uint32_t max_matches = UINT32_MAX;
-    TypeList types;
-    
-    module_sp->FindTypes (null_sc,
-                          name,
-                          exact_match,
-                          max_matches,
-                          types);
-    
-    if (types.GetSize() == 1)
-    {
-        TypeSP candidate_type = types.GetTypeAtIndex(0);
-        
-        if (ClangASTContext::IsObjCClassType(candidate_type->GetClangForwardType()))
-        {
-            m_complete_class_cache[name] = TypeWP(candidate_type);
-            return candidate_type;
-        }
-        else
-        {
-            return TypeSP();
-        }
-    }
-    
-    for (uint32_t ti = 0, te = types.GetSize();
-         ti < te;
-         ++ti)
-    {
-        TypeSP candidate_type = types.GetTypeAtIndex(ti);
-        
-        if (candidate_type->IsCompleteObjCClass() &&
-            ClangASTContext::IsObjCClassType(candidate_type->GetClangForwardType()))
-        {
-            m_complete_class_cache[name] = TypeWP(candidate_type);
-            return candidate_type;                                       
-        }
-    }
-    
-    return TypeSP();
-}
-
-size_t
-ObjCLanguageRuntime::GetByteOffsetForIvar (ClangASTType &parent_qual_type, const char *ivar_name)
-{
-    return LLDB_INVALID_IVAR_OFFSET;
-}
-
-
-uint32_t
-ObjCLanguageRuntime::ParseMethodName (const char *name, 
-                                      ConstString *class_name,              // Class name (with category if any)
-                                      ConstString *selector_name,           // selector on its own
-                                      ConstString *name_sans_category,      // Full function prototype with no category
-                                      ConstString *class_name_sans_category)// Class name with no category (or empty if no category as answer will be in "class_name"
-{
-    if (class_name)
-        class_name->Clear();
-    if (selector_name)
-        selector_name->Clear();
-    if (name_sans_category)
-        name_sans_category->Clear();
-    if (class_name_sans_category)
-        class_name_sans_category->Clear();
-    
-    uint32_t result = 0;
-
-    if (IsPossibleObjCMethodName (name))
-    {
-        int name_len = strlen (name);
-        // Objective C methods must have at least:
-        //      "-[" or "+[" prefix
-        //      One character for a class name
-        //      One character for the space between the class name
-        //      One character for the method name
-        //      "]" suffix
-        if (name_len >= 6 && name[name_len - 1] == ']')
-        {
-            const char *selector_name_ptr = strchr (name, ' ');
-            if (selector_name_ptr)
-            {
-                if (class_name)
-                {
-                    class_name->SetCStringWithLength (name + 2, selector_name_ptr - name - 2);
-                    ++result;
-                }    
-                
-                // Skip the space
-                ++selector_name_ptr;
-                // Extract the objective C basename and add it to the
-                // accelerator tables
-                size_t selector_name_len = name_len - (selector_name_ptr - name) - 1;
-                if (selector_name)
-                {
-                    selector_name->SetCStringWithLength (selector_name_ptr, selector_name_len);                                
-                    ++result;
-                }
-                
-                // Also see if this is a "category" on our class.  If so strip off the category name,
-                // and add the class name without it to the basename table. 
-                
-                if (name_sans_category || class_name_sans_category)
-                {
-                    const char *open_paren = strchr (name, '(');
-                    if (open_paren)
-                    {
-                        if (class_name_sans_category)
-                        {
-                            class_name_sans_category->SetCStringWithLength (name + 2, open_paren - name - 2);
-                            ++result;
-                        }
-                        
-                        if (name_sans_category)
-                        {
-                            const char *close_paren = strchr (open_paren, ')');
-                            if (open_paren < close_paren)
-                            {
-                                std::string buffer (name, open_paren - name);
-                                buffer.append (close_paren + 1);
-                                name_sans_category->SetCString (buffer.c_str());
-                                ++result;
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-    return result;
-}
-
-bool
-ObjCLanguageRuntime::ClassDescriptor::IsPointerValid (lldb::addr_t value,
-                                                      uint32_t ptr_size,
-                                                      bool allow_NULLs,
-                                                      bool allow_tagged,
-                                                      bool check_version_specific) const
-{
-    if (!value)
-        return allow_NULLs;
-    if ( (value % 2) == 1  && allow_tagged)
-        return true;
-    if ((value % ptr_size) == 0)
-        return (check_version_specific ? CheckPointer(value,ptr_size) : true);
-    else
-        return false;
-}
-
-ObjCLanguageRuntime::ObjCISA
-ObjCLanguageRuntime::GetISA(const ConstString &name)
-{
-    UpdateISAToDescriptorMap();
-    for (std::map<ObjCISA, ClassDescriptorSP>::iterator it = 
-        m_isa_to_descriptor_cache.begin(); it != m_isa_to_descriptor_cache.end(); ++it)
-        if (it->second && it->second->GetClassName() == name)
-            return it->first;
-    return 0;
-}
-
-ObjCLanguageRuntime::ObjCISA
-ObjCLanguageRuntime::GetParentClass(ObjCLanguageRuntime::ObjCISA isa)
-{
-    ClassDescriptorSP objc_class_sp (GetClassDescriptor(isa));
-    if (objc_class_sp)
-    {
-        ClassDescriptorSP objc_super_class_sp (objc_class_sp->GetSuperclass());
-        if (objc_super_class_sp)
-            return objc_super_class_sp->GetISA();
-    }
-    return 0;
-}
-
-ConstString
-ObjCLanguageRuntime::GetActualTypeName(ObjCLanguageRuntime::ObjCISA isa)
-{
-    ClassDescriptorSP objc_class_sp (GetNonKVOClassDescriptor(isa));
-    if (objc_class_sp)
-        return objc_class_sp->GetClassName();
-    return ConstString();
-}
-
-ObjCLanguageRuntime::ClassDescriptorSP
-ObjCLanguageRuntime::GetClassDescriptor (const ConstString &class_name)
-{
-    UpdateISAToDescriptorMap();
-    for (const ISAToDescriptorMap::value_type &val : m_isa_to_descriptor_cache)
-        if (val.second && val.second->GetClassName() == class_name)
-            return val.second;
-    return ClassDescriptorSP();
-
-}
-
-ObjCLanguageRuntime::ClassDescriptorSP
-ObjCLanguageRuntime::GetClassDescriptor (ValueObject& valobj)
-{
-    ClassDescriptorSP objc_class_sp;
-    // if we get an invalid VO (which might still happen when playing around
-    // with pointers returned by the expression parser, don't consider this
-    // a valid ObjC object)
-    if (valobj.GetValue().GetContextType() != Value::eContextTypeInvalid)
-    {
-        addr_t isa_pointer = valobj.GetPointerValue();
-        if (isa_pointer != LLDB_INVALID_ADDRESS)
-        {
-            ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
-            
-            Process *process = exe_ctx.GetProcessPtr();
-            if (process)
-            {
-                Error error;
-                ObjCISA isa = process->ReadPointerFromMemory(isa_pointer, error);
-                if (isa != LLDB_INVALID_ADDRESS)
-                    objc_class_sp = GetClassDescriptor (isa);
-            }
-        }
-    }
-    return objc_class_sp;
-}
-
-ObjCLanguageRuntime::ClassDescriptorSP
-ObjCLanguageRuntime::GetNonKVOClassDescriptor (ValueObject& valobj)
-{
-    ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (GetClassDescriptor (valobj));
-    if (objc_class_sp)
-    {
-        if (!objc_class_sp->IsKVO())
-            return objc_class_sp;
-        
-        ClassDescriptorSP non_kvo_objc_class_sp(objc_class_sp->GetSuperclass());
-        if (non_kvo_objc_class_sp && non_kvo_objc_class_sp->IsValid())
-            return non_kvo_objc_class_sp;
-    }
-    return ClassDescriptorSP();
-}
-
-
-ObjCLanguageRuntime::ClassDescriptorSP
-ObjCLanguageRuntime::GetClassDescriptor (ObjCISA isa)
-{
-    if (isa)
-    {
-        UpdateISAToDescriptorMap();
-        ObjCLanguageRuntime::ISAToDescriptorIterator pos = m_isa_to_descriptor_cache.find(isa);    
-        if (pos != m_isa_to_descriptor_cache.end())
-            return pos->second;
-    }
-    return ClassDescriptorSP();
-}
-
-ObjCLanguageRuntime::ClassDescriptorSP
-ObjCLanguageRuntime::GetNonKVOClassDescriptor (ObjCISA isa)
-{
-    if (isa)
-    {
-        ClassDescriptorSP objc_class_sp = GetClassDescriptor (isa);
-        if (objc_class_sp && objc_class_sp->IsValid())
-        {
-            if (!objc_class_sp->IsKVO())
-                return objc_class_sp;
-
-            ClassDescriptorSP non_kvo_objc_class_sp(objc_class_sp->GetSuperclass());
-            if (non_kvo_objc_class_sp && non_kvo_objc_class_sp->IsValid())
-                return non_kvo_objc_class_sp;
-        }
-    }
-    return ClassDescriptorSP();
-}
-
-
-

Removed: lldb/branches/windows/tools/driver/Driver.cpp.orig
URL: http://llvm.org/viewvc/llvm-project/lldb/branches/windows/tools/driver/Driver.cpp.orig?rev=167219&view=auto
==============================================================================
--- lldb/branches/windows/tools/driver/Driver.cpp.orig (original)
+++ lldb/branches/windows/tools/driver/Driver.cpp.orig (removed)
@@ -1,672 +0,0 @@
-//===-- Driver.cpp ----------------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Driver.h"
-
-#ifdef _WIN32
-#include "lldb/lldb-windows.h"
-#include "lldb/lldb-private-log.h"
-#include "lldb/Core/StreamCallback.h"
-#include "lldb/Core/Log.h"
-#endif
-#include <string.h>
-#include <stdlib.h>
-#include <limits.h>
-#include <fcntl.h>
-
-#include "IOChannel.h"
-#include "lldb/API/SBBreakpoint.h"
-#include "lldb/API/SBCommandInterpreter.h"
-#include "lldb/API/SBCommandReturnObject.h"
-#include "lldb/API/SBCommunication.h"
-#include "lldb/API/SBDebugger.h"
-#include "lldb/API/SBEvent.h"
-#include "lldb/API/SBHostOS.h"
-#include "lldb/API/SBListener.h"
-#include "lldb/API/SBStream.h"
-#include "lldb/API/SBTarget.h"
-#include "lldb/API/SBThread.h"
-#include "lldb/API/SBProcess.h"
-
-using namespace lldb;
-
-static void reset_stdin_termios ();
-
-Driver::Driver () :
-    SBBroadcaster ("Driver"),
-    m_debugger (NULL),
-    m_editline_pty (),
-    m_editline_slave_fh (NULL),
-    m_editline_reader (),
-    m_io_channel_ap (),
-    m_option_data (),
-    m_waiting_for_command (false)
-{
-}
-
-Driver::~Driver ()
-{
-}
-
-const char *
-Driver::GetFilename() const
-{
-    if (m_option_data.m_args.empty())
-        return NULL;
-    return m_option_data.m_args.front().c_str();
-}
-
-const char *
-Driver::GetCrashLogFilename() const
-{
-    if (m_option_data.m_crash_log.empty())
-        return NULL;
-    return m_option_data.m_crash_log.c_str();
-}
-
-lldb::ScriptLanguage
-Driver::GetScriptLanguage() const
-{
-    return m_option_data.m_script_lang;
-}
-
-size_t
-Driver::GetNumSourceCommandFiles () const
-{
-    return m_option_data.m_source_command_files.size();
-}
-
-const char *
-Driver::GetSourceCommandFileAtIndex (uint32_t idx) const
-{
-    if (idx < m_option_data.m_source_command_files.size())
-        return m_option_data.m_source_command_files[idx].c_str();
-    return NULL;
-}
-
-bool
-Driver::GetDebugMode() const
-{
-    return m_option_data.m_debug_mode;
-}
-
-size_t
-Driver::GetProcessSTDOUT ()
-{
-    //  The process has stuff waiting for stdout; get it and write it out to the appropriate place.
-    char stdio_buffer[1024];
-    size_t len;
-    size_t total_bytes = 0;
-    while ((len = m_debugger.GetSelectedTarget().GetProcess().GetSTDOUT (stdio_buffer, sizeof (stdio_buffer))) > 0)
-    {
-        m_io_channel_ap->OutWrite (stdio_buffer, len, ASYNC);
-        total_bytes += len;
-    }
-    return total_bytes;
-}
-
-size_t
-Driver::GetProcessSTDERR ()
-{
-    //  The process has stuff waiting for stderr; get it and write it out to the appropriate place.
-    char stdio_buffer[1024];
-    size_t len;
-    size_t total_bytes = 0;
-    while ((len = m_debugger.GetSelectedTarget().GetProcess().GetSTDERR (stdio_buffer, sizeof (stdio_buffer))) > 0)
-    {
-        m_io_channel_ap->ErrWrite (stdio_buffer, len, ASYNC);
-        total_bytes += len;
-    }
-    return total_bytes;
-}
-
-void
-Driver::UpdateSelectedThread ()
-{
-    using namespace lldb;
-    SBProcess process(m_debugger.GetSelectedTarget().GetProcess());
-    if (!process.IsValid())
-        return;
-    
-    SBThread curr_thread (process.GetSelectedThread());
-    SBThread thread;
-    StopReason curr_thread_stop_reason = eStopReasonInvalid;
-    curr_thread_stop_reason = curr_thread.GetStopReason();
-
-    if (!curr_thread.IsValid() ||
-        curr_thread_stop_reason == eStopReasonInvalid ||
-        curr_thread_stop_reason == eStopReasonNone)
-    {
-        // Prefer a thread that has just completed its plan over another thread as current thread.
-        SBThread plan_thread;
-        SBThread other_thread;
-       const size_t num_threads = process.GetNumThreads();
-        size_t i;
-        for (i = 0; i < num_threads; ++i)
-        {
-            thread = process.GetThreadAtIndex(i);
-            StopReason thread_stop_reason = thread.GetStopReason();
-            switch (thread_stop_reason)
-			{
-            default:
-            case eStopReasonInvalid:
-            case eStopReasonNone:
-                break;
-
-            case eStopReasonTrace:
-            case eStopReasonBreakpoint:
-            case eStopReasonWatchpoint:
-            case eStopReasonSignal:
-            case eStopReasonException:
-                if (!other_thread.IsValid())
-                    other_thread = thread;
-                break;
-            case eStopReasonPlanComplete:
-                if (!plan_thread.IsValid())
-                    plan_thread = thread;
-                break;
-            }
-        }
-        if (plan_thread.IsValid())
-            process.SetSelectedThread (plan_thread);
-        else if (other_thread.IsValid())
-            process.SetSelectedThread (other_thread);
-        else
-		{
-			if (curr_thread.IsValid())
-				thread = curr_thread;
-			else
-				thread = process.GetThreadAtIndex(0);
-
-<<<<<<< .working
-			if (thread.IsValid())
-				process.SetSelectedThread (thread);
-=======
-void
-Driver::HandleThreadEvent (const SBEvent &event)
-{
-    // At present the only thread event we handle is the Frame Changed event, and all we do for that is just
-    // reprint the thread status for that thread.
-    using namespace lldb;
-    const uint32_t event_type = event.GetType();
-    if (event_type == SBThread::eBroadcastBitStackChanged)
-    {
-        SBThread thread = SBThread::GetThreadFromEvent (event);
-        if (thread.IsValid())
-        {
-            SBStream out_stream;
-            thread.GetStatus(out_stream);
-            m_io_channel_ap->OutWrite (out_stream.GetData (), out_stream.GetSize (), ASYNC);
-        }
-    }
-}
-
-//  This function handles events broadcast by the IOChannel (HasInput, UserInterrupt, or ThreadShouldExit).
-
-bool
-Driver::HandleIOEvent (const SBEvent &event)
-{
-    bool quit = false;
-
-    const uint32_t event_type = event.GetType();
-
-    if (event_type & IOChannel::eBroadcastBitHasUserInput)
-    {
-        // We got some input (i.e. a command string) from the user; pass it off to the command interpreter for
-        // handling.
-
-        const char *command_string = SBEvent::GetCStringFromEvent(event);
-        if (command_string == NULL)
-            command_string = "";
-        SBCommandReturnObject result;
-        
-        // We don't want the result to bypass the OutWrite function in IOChannel, as this can result in odd
-        // output orderings and problems with the prompt.
-        m_debugger.GetCommandInterpreter().HandleCommand (command_string, result, true);
-
-        if (result.GetOutputSize() > 0)
-            m_io_channel_ap->OutWrite (result.GetOutput(), result.GetOutputSize(), NO_ASYNC);
-            
-        if (result.GetErrorSize() > 0)
-            m_io_channel_ap->OutWrite (result.GetError(), result.GetErrorSize(), NO_ASYNC);
-
-        // We are done getting and running our command, we can now clear the
-        // m_waiting_for_command so we can get another one.
-        m_waiting_for_command = false;
-
-        // If our editline input reader is active, it means another input reader
-        // got pushed onto the input reader and caused us to become deactivated.
-        // When the input reader above us gets popped, we will get re-activated
-        // and our prompt will refresh in our callback
-        if (m_editline_reader.IsActive())
-        {
-            ReadyForCommand ();
->>>>>>> .merge-right.r165938
-        }
-    }
-}
-
-void LogOutput(const char * msg, void *baton)
-{
-    puts(msg);
-}
-
-void Driver::Initialize()
-{
-    m_debugger = SBDebugger::Create(false, LogOutput, 0);
-    // We want to be able to handle CTRL+D in the terminal to have it terminate
-    // certain input
-    m_debugger.SetCloseInputOnEOF (false);
-    InitializePseudoTerminal();
- 
-
-    m_debugger.SetErrorFileHandle (stderr, false);
-    m_debugger.SetOutputFileHandle (stdout, false);
-    m_debugger.SetInputFileHandle (stdin, true);
- 
-    m_debugger.SetUseExternalEditor(m_option_data.m_use_external_editor);
-
-    InitializeEditLineIO();	
-
-	
-    SBCommandInterpreter sb_interpreter = m_debugger.GetCommandInterpreter();
-    m_interpreter = &sb_interpreter;
-
-    SBListener listener(m_debugger.GetListener());
-    listener.StartListeningForEventClass(m_debugger, 
-                                         SBTarget::GetBroadcasterClassName(), 
-                                         SBTarget::eBroadcastBitBreakpointChanged);
-    if (!listener.IsValid())
-        return;
-
-    listener.StartListeningForEvents (*m_io_channel_ap,
-                                        IOChannel::eBroadcastBitHasUserInput |
-                                        IOChannel::eBroadcastBitUserInterrupt |
-                                        IOChannel::eBroadcastBitThreadShouldExit |
-                                        IOChannel::eBroadcastBitThreadDidStart |
-                                        IOChannel::eBroadcastBitThreadDidExit);
-
-    if (!m_io_channel_ap->Start ())
-        return;
-    
-	iochannel_thread_exited = false;
-	
-    listener.StartListeningForEvents (sb_interpreter.GetBroadcaster(),
-                                        SBCommandInterpreter::eBroadcastBitQuitCommandReceived |
-                                        SBCommandInterpreter::eBroadcastBitAsynchronousOutputData |
-                                        SBCommandInterpreter::eBroadcastBitAsynchronousErrorData);
-
-    // Before we handle any options from the command line, we parse the
-    // .lldbinit file in the user's home directory.
-    SBCommandReturnObject result;
-    sb_interpreter.SourceInitFileInHomeDirectory(result);
-
-    if (GetDebugMode())
-    {
-        result.PutError (m_debugger.GetErrorFileHandle());
-        result.PutOutput (m_debugger.GetOutputFileHandle());
-    }
-	HandleCommandLine(result);
-
-    // Now that all option parsing is done, we try and parse the .lldbinit
-    // file in the current working directory
-    sb_interpreter.SourceInitFileInCurrentWorkingDirectory (result);
-    if (GetDebugMode())	
-    {
-        result.PutError(m_debugger.GetErrorFileHandle());
-        result.PutOutput(m_debugger.GetOutputFileHandle());
-    }
-	SBEvent event;
-    // Make sure the IO channel is started up before we try to tell it we
-    // are ready for input
-    listener.WaitForEventForBroadcasterWithType (UINT32_MAX, 
-                                                    *m_io_channel_ap,
-                                                    IOChannel::eBroadcastBitThreadDidStart, 
-                                                    event);
-    
-    // If we were asked to attach, then do that here:
-    // I'm going to use the command string rather than directly
-    // calling the API's because then I don't have to recode the
-    // event handling here.
-    if (!m_option_data.m_process_name.empty()
-        || m_option_data.m_process_pid != LLDB_INVALID_PROCESS_ID)
-    {
-        AttachToProcess();
-    }
-    
-    ReadyForCommand ();
-}
-
-<<<<<<< .working
-void
-Driver::MainLoop ()
-{
-    SBEvent event;
-    while (!GetIsDone())
-=======
-    SBListener listener(m_debugger.GetListener());
-    if (listener.IsValid())
->>>>>>> .merge-right.r165938
-    {
-<<<<<<< .working
-        m_listener->WaitForEvent (UINT32_MAX, event);
-        if (event.IsValid())
-		{
-            ProcessEvent(event);
-        }
-    }
-	
-	
-    DestroyPseudoTerminal();
-    CloseIOChannelFile ();
- 
-    if (!iochannel_thread_exited)
-    {
-	        event.Clear();
-        m_listener->GetNextEventForBroadcasterWithType (*m_io_channel_ap,
-                                                        IOChannel::eBroadcastBitThreadDidExit,
-                                                        event);
-        if (!event.IsValid())
-=======
-
-        listener.StartListeningForEventClass(m_debugger, 
-                                         SBTarget::GetBroadcasterClassName(), 
-                                         SBTarget::eBroadcastBitBreakpointChanged);
-        listener.StartListeningForEventClass(m_debugger, 
-                                         SBThread::GetBroadcasterClassName(),
-                                         SBThread::eBroadcastBitStackChanged);
-        listener.StartListeningForEvents (*m_io_channel_ap,
-                                          IOChannel::eBroadcastBitHasUserInput |
-                                          IOChannel::eBroadcastBitUserInterrupt |
-                                          IOChannel::eBroadcastBitThreadShouldExit |
-                                          IOChannel::eBroadcastBitThreadDidStart |
-                                          IOChannel::eBroadcastBitThreadDidExit);
-
-        if (m_io_channel_ap->Start ())
->>>>>>> .merge-right.r165938
-        {
-<<<<<<< .working
-            // Send end EOF to the driver file descriptor
-            m_io_channel_ap->Stop();
-=======
-            bool iochannel_thread_exited = false;
-
-            listener.StartListeningForEvents (sb_interpreter.GetBroadcaster(),
-                                              SBCommandInterpreter::eBroadcastBitQuitCommandReceived |
-                                              SBCommandInterpreter::eBroadcastBitAsynchronousOutputData |
-                                              SBCommandInterpreter::eBroadcastBitAsynchronousErrorData);
-
-            // Before we handle any options from the command line, we parse the
-            // .lldbinit file in the user's home directory.
-            SBCommandReturnObject result;
-            sb_interpreter.SourceInitFileInHomeDirectory(result);
-            if (GetDebugMode())
-            {
-                result.PutError (m_debugger.GetErrorFileHandle());
-                result.PutOutput (m_debugger.GetOutputFileHandle());
-            }
-
-            // Now we handle options we got from the command line
-            char command_string[PATH_MAX * 2];
-            const size_t num_source_command_files = GetNumSourceCommandFiles();
-            if (num_source_command_files > 0)
-            {
-                for (size_t i=0; i < num_source_command_files; ++i)
-                {
-                    const char *command_file = GetSourceCommandFileAtIndex(i);
-                    ::snprintf (command_string, sizeof(command_string), "command source '%s'", command_file);
-                    m_debugger.GetCommandInterpreter().HandleCommand (command_string, result, false);
-                    if (GetDebugMode())
-                    {
-                        result.PutError (m_debugger.GetErrorFileHandle());
-                        result.PutOutput (m_debugger.GetOutputFileHandle());
-                    }
-                }
-            }
-
-            // Was there a core file specified?
-            std::string core_file_spec("");
-            if (!m_option_data.m_core_file.empty())
-                core_file_spec.append("--core ").append(m_option_data.m_core_file);
-
-            const size_t num_args = m_option_data.m_args.size();
-            if (num_args > 0)
-            {
-                char arch_name[64];
-                if (m_debugger.GetDefaultArchitecture (arch_name, sizeof (arch_name)))
-                    ::snprintf (command_string, 
-                                sizeof (command_string), 
-                                "target create --arch=%s %s \"%s\"", 
-                                arch_name,
-                                core_file_spec.c_str(),
-                                m_option_data.m_args[0].c_str());
-                else
-                    ::snprintf (command_string, 
-                                sizeof(command_string), 
-                                "target create %s \"%s\"", 
-                                core_file_spec.c_str(),
-                                m_option_data.m_args[0].c_str());
-
-                m_debugger.HandleCommand (command_string);
-                
-                if (num_args > 1)
-                {
-                    m_debugger.HandleCommand ("settings clear target.run-args");
-                    char arg_cstr[1024];
-                    for (size_t arg_idx = 1; arg_idx < num_args; ++arg_idx)
-                    {
-                        ::snprintf (arg_cstr, 
-                                    sizeof(arg_cstr), 
-                                    "settings append target.run-args \"%s\"", 
-                                    m_option_data.m_args[arg_idx].c_str());
-                        m_debugger.HandleCommand (arg_cstr);
-                    }
-                }
-            }
-            else if (!core_file_spec.empty())
-            {
-                ::snprintf (command_string, 
-                            sizeof(command_string), 
-                            "target create %s", 
-                            core_file_spec.c_str());
-                m_debugger.HandleCommand (command_string);;
-            }
-
-            // Now that all option parsing is done, we try and parse the .lldbinit
-            // file in the current working directory
-            sb_interpreter.SourceInitFileInCurrentWorkingDirectory (result);
-            if (GetDebugMode())
-            {
-                result.PutError(m_debugger.GetErrorFileHandle());
-                result.PutOutput(m_debugger.GetOutputFileHandle());
-            }
-
-            SBEvent event;
-
-            // Make sure the IO channel is started up before we try to tell it we
-            // are ready for input
-            listener.WaitForEventForBroadcasterWithType (UINT32_MAX, 
-                                                         *m_io_channel_ap,
-                                                         IOChannel::eBroadcastBitThreadDidStart, 
-                                                         event);
-            // If we were asked to attach, then do that here:
-            // I'm going to use the command string rather than directly
-            // calling the API's because then I don't have to recode the
-            // event handling here.
-            if (!m_option_data.m_process_name.empty()
-                || m_option_data.m_process_pid != LLDB_INVALID_PROCESS_ID)
-            {
-                std::string command_str("process attach ");
-                if (m_option_data.m_process_pid != LLDB_INVALID_PROCESS_ID)
-                {
-                    command_str.append("-p ");
-                    char pid_buffer[32];
-                    ::snprintf (pid_buffer, sizeof(pid_buffer), "%llu", m_option_data.m_process_pid);
-                    command_str.append(pid_buffer);
-                }
-                else 
-                {
-                    command_str.append("-n \"");
-                    command_str.append(m_option_data.m_process_name);
-                    command_str.push_back('\"');
-                    if (m_option_data.m_wait_for)
-                        command_str.append(" -w");
-                }
-                
-                if (m_debugger.GetOutputFileHandle())
-                    ::fprintf (m_debugger.GetOutputFileHandle(), 
-                               "Attaching to process with:\n    %s\n", 
-                               command_str.c_str());
-                                               
-                // Force the attach to be synchronous:
-                bool orig_async = m_debugger.GetAsync();
-                m_debugger.SetAsync(true);
-                m_debugger.HandleCommand(command_str.c_str());
-                m_debugger.SetAsync(orig_async);                
-            }
-                        
-            ReadyForCommand ();
-
-            while (!GetIsDone())
-            {
-                listener.WaitForEvent (UINT32_MAX, event);
-                if (event.IsValid())
-                {
-                    if (event.GetBroadcaster().IsValid())
-                    {
-                        uint32_t event_type = event.GetType();
-                        if (event.BroadcasterMatchesRef (*m_io_channel_ap))
-                        {
-                            if ((event_type & IOChannel::eBroadcastBitThreadShouldExit) ||
-                                (event_type & IOChannel::eBroadcastBitThreadDidExit))
-                            {
-                                SetIsDone();
-                                if (event_type & IOChannel::eBroadcastBitThreadDidExit)
-                                    iochannel_thread_exited = true;
-                            }
-                            else
-                            {
-                                if (HandleIOEvent (event))
-                                    SetIsDone();
-                            }
-                        }
-                        else if (SBProcess::EventIsProcessEvent (event))
-                        {
-                            HandleProcessEvent (event);
-                        }
-                        else if (SBBreakpoint::EventIsBreakpointEvent (event))
-                        {
-                            HandleBreakpointEvent (event);
-                        }
-                        else if (SBThread::EventIsThreadEvent (event))
-                        {
-                            HandleThreadEvent (event);
-                        }
-                        else if (event.BroadcasterMatchesRef (sb_interpreter.GetBroadcaster()))
-                        {
-                            // TODO: deprecate the eBroadcastBitQuitCommandReceived event
-                            // now that we have SBCommandInterpreter::SetCommandOverrideCallback()
-                            // that can take over a command
-                            if (event_type & SBCommandInterpreter::eBroadcastBitQuitCommandReceived)
-                            {
-                                SetIsDone();
-                            }
-                            else if (event_type & SBCommandInterpreter::eBroadcastBitAsynchronousErrorData)
-                            {
-                                const char *data = SBEvent::GetCStringFromEvent (event);
-                                m_io_channel_ap->ErrWrite (data, strlen(data), ASYNC);
-                            }
-                            else if (event_type & SBCommandInterpreter::eBroadcastBitAsynchronousOutputData)
-                            {
-                                const char *data = SBEvent::GetCStringFromEvent (event);
-                                m_io_channel_ap->OutWrite (data, strlen(data), ASYNC);
-                            }
-                        }
-                    }
-                }
-            }
-
-            editline_output_pty.CloseMasterFileDescriptor();
-            master_out_comm.Disconnect();
-            out_comm_2.Disconnect();
-            reset_stdin_termios();
-            fclose (stdin);
-
-            CloseIOChannelFile ();
-
-            if (!iochannel_thread_exited)
-            {
-                event.Clear();
-                listener.GetNextEventForBroadcasterWithType (*m_io_channel_ap,
-                                                             IOChannel::eBroadcastBitThreadDidExit,
-                                                             event);
-                if (!event.IsValid())
-                {
-                    // Send end EOF to the driver file descriptor
-                    m_io_channel_ap->Stop();
-                }
-            }
-
-            SBDebugger::Destroy (m_debugger);
->>>>>>> .merge-right.r165938
-        }
-    }
-	SBDebugger::Destroy (m_debugger);
-}
-
-
-void
-Driver::ReadyForCommand ()
-{
-    if (m_waiting_for_command == false)
-    {
-        m_waiting_for_command = true;
-        BroadcastEventByType (Driver::eBroadcastBitReadyForInput, true);
-    }
-}
-
-// defined in DriverPosix.cpp
-void SetupPosixSignals();
-
-int
-main (int argc, char const *argv[], const char *envp[])
-{
-#if 1 // Enable for debug logging
-    lldb::StreamSP logStream(new lldb_private::StreamCallback(LogOutput, 0));
-    const char* logCategories[] = { 0 };
-    lldb::LogSP log = lldb_private::EnableLog(logStream, 0, logCategories, 0);
-    log->GetMask().Reset(LIBLLDB_LOG_ALL);
-#endif
-    SBDebugger::Initialize();
-    
-    SBHostOS::ThreadCreated ("<lldb.driver.main-thread>");
-
-	SetupPosixSignals();
-    // Create a scope for driver so that the driver object will destroy itself
-    // before SBDebugger::Terminate() is called.
-    {
-        Driver driver;
-
-        bool exit = false;
-        SBError error = driver.ParseArgs (argc, argv, stdout, exit);
-        if (error.Fail())
-        {
-            const char *error_cstr = error.GetCString ();
-            if (error_cstr)
-                ::fprintf (stderr, "error: %s\n", error_cstr);
-        }
-        else if (!exit)
-        {
-            driver.Initialize();
-        }
-    }
-
-    SBDebugger::Terminate();
-    return 0;
-}





More information about the lldb-commits mailing list