124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ClangASTContext.cpp -------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include "lldb/Symbol/ClangASTContext.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
17b01000fd063629facd45044f137446fb748ee179Greg Clayton
18b01000fd063629facd45044f137446fb748ee179Greg Clayton// Clang headers like to use NDEBUG inside of them to enable/disable debug
19b01000fd063629facd45044f137446fb748ee179Greg Clayton// releated features using "#ifndef NDEBUG" preprocessor blocks to do one thing
20b01000fd063629facd45044f137446fb748ee179Greg Clayton// or another. This is bad because it means that if clang was built in release
21b01000fd063629facd45044f137446fb748ee179Greg Clayton// mode, it assumes that you are building in release mode which is not always
22b01000fd063629facd45044f137446fb748ee179Greg Clayton// the case. You can end up with functions that are defined as empty in header
23b01000fd063629facd45044f137446fb748ee179Greg Clayton// files when NDEBUG is not defined, and this can cause link errors with the
24b01000fd063629facd45044f137446fb748ee179Greg Clayton// clang .a files that you have since you might be missing functions in the .a
25b01000fd063629facd45044f137446fb748ee179Greg Clayton// file. So we have to define NDEBUG when including clang headers to avoid any
26b01000fd063629facd45044f137446fb748ee179Greg Clayton// mismatches. This is covered by rdar://problem/8691220
27b01000fd063629facd45044f137446fb748ee179Greg Clayton
28a31b4ddfd213da1c2595fe2c5ae599d05de65400Sean Callanan#if !defined(NDEBUG) && !defined(LLVM_NDEBUG_OFF)
29b01000fd063629facd45044f137446fb748ee179Greg Clayton#define LLDB_DEFINED_NDEBUG_FOR_CLANG
30bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#define NDEBUG
31b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to include assert.h so it is as clang would expect it to be (disabled)
32b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h>
33b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif
34b01000fd063629facd45044f137446fb748ee179Greg Clayton
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTContext.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/ASTImporter.h"
37803c3b042f19c9238825f4900a45676e1a2957f4Greg Clayton#include "clang/AST/Attr.h"
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/CXXInheritance.h"
3984f8075072eef306234f8109573067647735c111Greg Clayton#include "clang/AST/DeclObjC.h"
40f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "clang/AST/DeclTemplate.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/RecordLayout.h"
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/AST/Type.h"
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/Builtins.h"
4497b675ecde7a3b7ebb4161fbecb122fb22c2b6eaSean Callanan#include "clang/Basic/Diagnostic.h"
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/FileManager.h"
468a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan#include "clang/Basic/FileSystemOptions.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/SourceManager.h"
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetInfo.h"
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Basic/TargetOptions.h"
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/FrontendOptions.h"
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "clang/Frontend/LangStandard.h"
52b01000fd063629facd45044f137446fb748ee179Greg Clayton
53b01000fd063629facd45044f137446fb748ee179Greg Clayton#ifdef LLDB_DEFINED_NDEBUG_FOR_CLANG
54bc4f0f59ed752f511ceb1afaf5d379cf52014484Sean Callanan#undef NDEBUG
55b01000fd063629facd45044f137446fb748ee179Greg Clayton#undef LLDB_DEFINED_NDEBUG_FOR_CLANG
56b01000fd063629facd45044f137446fb748ee179Greg Clayton// Need to re-include assert.h so it is as _we_ would expect it to be (enabled)
57b01000fd063629facd45044f137446fb748ee179Greg Clayton#include <assert.h>
58b01000fd063629facd45044f137446fb748ee179Greg Clayton#endif
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton#include "lldb/Core/ArchSpec.h"
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/dwarf.h"
62f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton#include "lldb/Core/Flags.h"
63839fde455820d7758685f5eb2257a83e96ca68d2Sean Callanan#include "lldb/Core/Log.h"
64f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "lldb/Core/RegularExpression.h"
6552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#include "lldb/Core/UniqueCStringMap.h"
66f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton#include "lldb/Expression/ASTDumper.h"
672fc7e8d0d392fe85f22d9c75212ebca4cbce547fSean Callanan#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
68c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan#include "lldb/Symbol/VerifyDecl.h"
6958513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ExecutionContext.h"
7058513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/Process.h"
7158513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
7258513667f6765aa8db13cdc4abd500340c1cac80Jim Ingham
73f05633b35544b5d095feb05680c8728be087e441Eli Friedman#include <stdio.h>
74f05633b35544b5d095feb05680c8728be087e441Eli Friedman
751e68e88fd56c6a617058cb5807042587724b5db9Greg Clayton#include <mutex>
761e68e88fd56c6a617058cb5807042587724b5db9Greg Clayton
77585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Claytonusing namespace lldb;
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace llvm;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace clang;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8252f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::AccessSpecifier
8352f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::ConvertAccessTypeToAccessSpecifier (AccessType access)
8484f8075072eef306234f8109573067647735c111Greg Clayton{
8584f8075072eef306234f8109573067647735c111Greg Clayton    switch (access)
8684f8075072eef306234f8109573067647735c111Greg Clayton    {
87585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    default:               break;
88585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessNone:      return AS_none;
89585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPublic:    return AS_public;
90585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessPrivate:   return AS_private;
91585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eAccessProtected: return AS_protected;
9284f8075072eef306234f8109573067647735c111Greg Clayton    }
9384f8075072eef306234f8109573067647735c111Greg Clayton    return AS_none;
9484f8075072eef306234f8109573067647735c111Greg Clayton}
9584f8075072eef306234f8109573067647735c111Greg Clayton
9684f8075072eef306234f8109573067647735c111Greg Clayton
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic void
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerParseLangArgs
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangOptions &Opts,
101e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    InputKind IK
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Cleanup per-file based stuff.
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set some properties which depend soley on the input kind; it would be nice
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to move these to the language standard, and have the driver resolve the
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // input kind + language standard.
109e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    if (IK == IK_Asm) {
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AsmPreprocessor = 1;
111e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton    } else if (IK == IK_ObjC ||
112e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_ObjCXX ||
113e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjC ||
114e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton               IK == IK_PreprocessedObjCXX) {
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.ObjC1 = Opts.ObjC2 = 1;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LangStandard::Kind LangStd = LangStandard::lang_unspecified;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_unspecified) {
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Based on the base language, pick one.
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (IK) {
123e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_None:
124e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_AST:
125279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_LLVM_IR:
126b01000fd063629facd45044f137446fb748ee179Greg Clayton                assert (!"Invalid input kind!");
127e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_OpenCL:
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_opencl;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
130279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan            case IK_CUDA:
131279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                LangStd = LangStandard::lang_cuda;
132279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                break;
133e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_Asm:
134e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_C:
135e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedC:
136e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjC:
137e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjC:
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnu99;
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
140e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_CXX:
141e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedCXX:
142e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_ObjCXX:
143e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton            case IK_PreprocessedObjCXX:
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LangStd = LangStandard::lang_gnucxx98;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const LangStandard &Std = LangStandard::getLangStandardForKind(LangStd);
1509bb15b62769166095721c42396cd59c240485a20Filipe Cabecinhas    Opts.LineComment = Std.hasLineComments();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.C99 = Std.isC99();
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.CPlusPlus = Std.isCPlusPlus();
153c6fe581c95790f7beeda8c6fd7c8ea4b14ab95f3Chandler Carruth    Opts.CPlusPlus11 = Std.isCPlusPlus11();
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Digraphs = Std.hasDigraphs();
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUMode = Std.isGNUMode();
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.GNUInline = !Std.isC99();
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.HexFloats = Std.hasHexFloats();
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.ImplicitInt = Std.hasImplicitInt();
15963d67ed225f948484a73db65c3c2512211515f06Enrico Granata
16063d67ed225f948484a73db65c3c2512211515f06Enrico Granata    Opts.WChar = true;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL has some additional defaults.
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (LangStd == LangStandard::lang_opencl) {
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.OpenCL = 1;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.AltiVec = 1;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.CXXOperatorNames = 1;
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Opts.LaxVectorConversions = 1;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // OpenCL and C++ both have bool, true, false keywords.
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Opts.CPlusPlus)
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.CXXOperatorNames = !Args.hasArg(OPT_fno_operator_names);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fobjc_gc_only))
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::GCOnly);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Args.hasArg(OPT_fobjc_gc))
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setGCMode(LangOptions::HybridGC);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_print_ivar_layout))
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.ObjCGCBitmapPrint = 1;
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_faltivec))
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.AltiVec = 1;
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_pthread))
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.POSIXThreads = 1;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    llvm::StringRef Vis = getLastArgValue(Args, OPT_fvisibility,
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                          "default");
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Vis == "default")
193874378dfa01edbc46818ed1be1a2de2950ff984fSean Callanan        Opts.setValueVisibilityMode(DefaultVisibility);
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "hidden")
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Hidden);
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else if (Vis == "protected")
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.setVisibilityMode(LangOptions::Protected);
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    else
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Diags.Report(diag::err_drv_invalid_value)
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        << Args.getLastArg(OPT_fvisibility)->getAsString(Args) << Vis;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.OverflowChecking = Args.hasArg(OPT_ftrapv);
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mimicing gcc's behavior, trigraphs are only enabled if -trigraphs
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is specified, or -std is set to a conforming mode.
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.Trigraphs = !Opts.GNUMode;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_trigraphs))
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.Trigraphs = 1;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.DollarIdents = Args.hasFlag(OPT_fdollars_in_identifiers,
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     OPT_fno_dollars_in_identifiers,
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                     !Opts.AsmPreprocessor);
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PascalStrings = Args.hasArg(OPT_fpascal_strings);
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Microsoft = Args.hasArg(OPT_fms_extensions);
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.WritableStrings = Args.hasArg(OPT_fwritable_strings);
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    if (Args.hasArg(OPT_fno_lax_vector_conversions))
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        Opts.LaxVectorConversions = 0;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Exceptions = Args.hasArg(OPT_fexceptions);
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.RTTI = !Args.hasArg(OPT_fno_rtti);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Blocks = Args.hasArg(OPT_fblocks);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Freestanding = Args.hasArg(OPT_ffreestanding);
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AssumeSaneOperatorNew = !Args.hasArg(OPT_fno_assume_sane_operator_new);
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.AccessControl = Args.hasArg(OPT_faccess_control);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.MathErrno = !Args.hasArg(OPT_fno_math_errno);
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.InstantiationDepth = getLastArgIntValue(Args, OPT_ftemplate_depth, 99,
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                 Diags);
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.NeXTRuntime = !Args.hasArg(OPT_fgnu_runtime);
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCConstantStringClass = getLastArgValue(Args,
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                                                   OPT_fconstant_string_class);
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.ObjCNonFragileABI = Args.hasArg(OPT_fobjc_nonfragile_abi);
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.CatchUndefined = Args.hasArg(OPT_fcatch_undefined_behavior);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.EmitAllDecls = Args.hasArg(OPT_femit_all_decls);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.PICLevel = getLastArgIntValue(Args, OPT_pic_level, 0, Diags);
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Static = Args.hasArg(OPT_static_define);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Opts.OptimizeSize = 0;
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: Eliminate this dependency.
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned Opt =
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Args.hasArg(OPT_Os) ? 2 : getLastArgIntValue(Args, OPT_O, 0, Diags);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    Opts.Optimize = Opt != 0;
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    unsigned Opt = 0;
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This is the __NO_INLINE__ define, which just depends on things like the
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // optimization level and -fno-inline, not actually whether the backend has
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // inlining enabled.
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // FIXME: This is affected by other options (-fno-inline).
25306dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan    Opts.NoInlineDefine = !Opt;
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    unsigned SSP = getLastArgIntValue(Args, OPT_stack_protector, 0, Diags);
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    switch (SSP) {
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        default:
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            Diags.Report(diag::err_drv_invalid_value)
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//            break;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 1: Opts.setStackProtectorMode(LangOptions::SSPOn);  break;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//        case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break;
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//    }
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
267e9d0df45df0ee87623985d1e59947a2ca50c14eaGreg Clayton
268b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::ClangASTContext (const char *target_triple) :
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple(),
270b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap(),
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap(),
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap(),
273c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    m_diagnostics_engine_ap(),
2746a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    m_target_options_rp(),
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap(),
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap(),
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap(),
278b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_builtins_ap(),
279b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_tag_decl (NULL),
280b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_callback_objc_decl (NULL),
28152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_callback_baton (NULL),
28252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_pointer_byte_size (0)
283b01000fd063629facd45044f137446fb748ee179Greg Clayton
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (target_triple && target_triple[0])
286dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton        SetTargetTriple (target_triple);
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::~ClangASTContext()
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
2986a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    m_target_options_rp.reset();
299c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    m_diagnostics_engine_ap.reset();
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
302b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::Clear()
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
309b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast_ap.reset();
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_language_options_ap.reset();
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_source_manager_ap.reset();
312c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    m_diagnostics_engine_ap.reset();
3136a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    m_target_options_rp.reset();
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_info_ap.reset();
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_identifier_table_ap.reset();
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_selector_table_ap.reset();
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_builtins_ap.reset();
31852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    m_pointer_byte_size = 0;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetTargetTriple ()
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_triple.c_str();
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::SetTargetTriple (const char *target_triple)
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear();
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_target_triple.assign(target_triple);
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
334395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Claytonvoid
335395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonClangASTContext::SetArchitecture (const ArchSpec &arch)
336395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton{
337dcc59f079edcd40cfba46eec1cd323341261a5e2Greg Clayton    SetTargetTriple(arch.GetTriple().str().c_str());
338395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton}
339395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton
340b01000fd063629facd45044f137446fb748ee179Greg Claytonbool
341b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::HasExternalSource ()
342b01000fd063629facd45044f137446fb748ee179Greg Clayton{
343b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
344b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
345b01000fd063629facd45044f137446fb748ee179Greg Clayton        return ast->getExternalSource () != NULL;
346b01000fd063629facd45044f137446fb748ee179Greg Clayton    return false;
347b01000fd063629facd45044f137446fb748ee179Greg Clayton}
348b01000fd063629facd45044f137446fb748ee179Greg Clayton
349b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
350b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::SetExternalSource (llvm::OwningPtr<ExternalASTSource> &ast_source_ap)
351b01000fd063629facd45044f137446fb748ee179Greg Clayton{
352b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
353b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
354b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
355b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (ast_source_ap);
356b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(true);
357b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(true);
358b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
359b01000fd063629facd45044f137446fb748ee179Greg Clayton}
360b01000fd063629facd45044f137446fb748ee179Greg Clayton
361b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid
362b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::RemoveExternalSource ()
363b01000fd063629facd45044f137446fb748ee179Greg Clayton{
364b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
365b01000fd063629facd45044f137446fb748ee179Greg Clayton
366b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
367b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
368b01000fd063629facd45044f137446fb748ee179Greg Clayton        llvm::OwningPtr<ExternalASTSource> empty_ast_source_ap;
369b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->setExternalSource (empty_ast_source_ap);
370b01000fd063629facd45044f137446fb748ee179Greg Clayton        ast->getTranslationUnitDecl()->setHasExternalLexicalStorage(false);
371b01000fd063629facd45044f137446fb748ee179Greg Clayton        //ast->getTranslationUnitDecl()->setHasExternalVisibleStorage(false);
372b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
373b01000fd063629facd45044f137446fb748ee179Greg Clayton}
374b01000fd063629facd45044f137446fb748ee179Greg Clayton
375b01000fd063629facd45044f137446fb748ee179Greg Clayton
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerASTContext *
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getASTContext()
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
380b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_ast_ap.get() == NULL)
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
382b01000fd063629facd45044f137446fb748ee179Greg Clayton        m_ast_ap.reset(new ASTContext (*getLanguageOptions(),
383b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSourceManager(),
384c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan                                       getTargetInfo(),
385b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getIdentifierTable(),
386b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getSelectorTable(),
387b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       *getBuiltinContext(),
388b01000fd063629facd45044f137446fb748ee179Greg Clayton                                       0));
389887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
390b01000fd063629facd45044f137446fb748ee179Greg Clayton        if ((m_callback_tag_decl || m_callback_objc_decl) && m_callback_baton)
391b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
392b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_ast_ap->getTranslationUnitDecl()->setHasExternalLexicalStorage();
393b01000fd063629facd45044f137446fb748ee179Greg Clayton            //m_ast_ap->getTranslationUnitDecl()->setHasExternalVisibleStorage();
394b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
395b01000fd063629facd45044f137446fb748ee179Greg Clayton
396c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        m_ast_ap->getDiagnostics().setClient(getDiagnosticConsumer(), false);
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
398b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast_ap.get();
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerBuiltin::Context *
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getBuiltinContext()
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_builtins_ap.get() == NULL)
405c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        m_builtins_ap.reset (new Builtin::Context());
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_builtins_ap.get();
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerIdentifierTable *
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getIdentifierTable()
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_identifier_table_ap.get() == NULL)
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_identifier_table_ap.reset(new IdentifierTable (*ClangASTContext::getLanguageOptions(), NULL));
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_identifier_table_ap.get();
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLangOptions *
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getLanguageOptions()
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_language_options_ap.get() == NULL)
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_language_options_ap.reset(new LangOptions());
423e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton        ParseLangArgs(*m_language_options_ap, IK_ObjCXX);
424e41c4b2a407ebc4bf7b7452c1f46d194671ec31dGreg Clayton//        InitializeLangOptions(*m_language_options_ap, IK_ObjCXX);
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_language_options_ap.get();
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSelectorTable *
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSelectorTable()
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_selector_table_ap.get() == NULL)
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_selector_table_ap.reset (new SelectorTable());
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_selector_table_ap.get();
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4378a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callananclang::FileManager *
4388a3b0a85dd512824f528cfa55d93f530ebe38be8Sean CallananClangASTContext::getFileManager()
4398a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan{
4408a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    if (m_file_manager_ap.get() == NULL)
44122defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    {
44222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        clang::FileSystemOptions file_system_options;
44322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton        m_file_manager_ap.reset(new clang::FileManager(file_system_options));
44422defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    }
4458a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    return m_file_manager_ap.get();
4468a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan}
4478a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan
4481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Claytonclang::SourceManager *
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getSourceManager()
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_source_manager_ap.get() == NULL)
452c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        m_source_manager_ap.reset(new clang::SourceManager(*getDiagnosticsEngine(), *getFileManager()));
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_source_manager_ap.get();
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
456c1535187de67e4ce48053a7677c76825adcdda44Sean Callananclang::DiagnosticsEngine *
457c1535187de67e4ce48053a7677c76825adcdda44Sean CallananClangASTContext::getDiagnosticsEngine()
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
459c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    if (m_diagnostics_engine_ap.get() == NULL)
460eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    {
461eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton        llvm::IntrusiveRefCntPtr<DiagnosticIDs> diag_id_sp(new DiagnosticIDs());
462cbe707cf259561da16ecfd94acbd4323103036c1Sean Callanan        m_diagnostics_engine_ap.reset(new DiagnosticsEngine(diag_id_sp, new DiagnosticOptions()));
463eae91241c959357e5e867cfb257e762574b68dd6Greg Clayton    }
464c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    return m_diagnostics_engine_ap.get();
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
467c1535187de67e4ce48053a7677c76825adcdda44Sean Callananclass NullDiagnosticConsumer : public DiagnosticConsumer
468887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
469887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananpublic:
470c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    NullDiagnosticConsumer ()
471887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
472887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        m_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS);
473887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
474887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
475c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    void HandleDiagnostic (DiagnosticsEngine::Level DiagLevel, const Diagnostic &info)
476887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    {
477887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        if (m_log)
478887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        {
4798f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan            llvm::SmallVector<char, 32> diag_str(10);
480887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            info.FormatDiagnostic(diag_str);
481887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            diag_str.push_back('\0');
482887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan            m_log->Printf("Compiler diagnostic: %s\n", diag_str.data());
483887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan        }
484887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan    }
485c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan
486c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    DiagnosticConsumer *clone (DiagnosticsEngine &Diags) const
487c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    {
488c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        return new NullDiagnosticConsumer ();
489c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    }
490887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callananprivate:
491952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log * m_log;
492887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan};
493887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
494c1535187de67e4ce48053a7677c76825adcdda44Sean CallananDiagnosticConsumer *
495c1535187de67e4ce48053a7677c76825adcdda44Sean CallananClangASTContext::getDiagnosticConsumer()
496887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
497c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    if (m_diagnostic_consumer_ap.get() == NULL)
498c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan        m_diagnostic_consumer_ap.reset(new NullDiagnosticConsumer);
499887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
500c1535187de67e4ce48053a7677c76825adcdda44Sean Callanan    return m_diagnostic_consumer_ap.get();
501887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan}
502887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetOptions *
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetOptions()
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5066a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    if (m_target_options_rp.getPtr() == NULL && !m_target_triple.empty())
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
5086a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan        m_target_options_rp.reset ();
5096a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan        m_target_options_rp = new TargetOptions();
5106a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan        if (m_target_options_rp.getPtr() != NULL)
5116a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan            m_target_options_rp->Triple = m_target_triple;
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5136a97d425a9bb1a137a7dcf7be90edd37d21f4dbbSean Callanan    return m_target_options_rp.getPtr();
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTargetInfo *
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::getTargetInfo()
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
520b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton    // target_triple should be something like "x86_64-apple-macosx"
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_target_info_ap.get() == NULL && !m_target_triple.empty())
522b4faddef92927f6c3aa6b127b94e8763465d4563Greg Clayton        m_target_info_ap.reset (TargetInfo::CreateTargetInfo(*getDiagnosticsEngine(), getTargetOptions()));
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_target_info_ap.get();
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Basic Types
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic inline bool
529b01000fd063629facd45044f137446fb748ee179Greg ClaytonQualTypeMatchesBitSize(const uint64_t bit_size, ASTContext *ast, QualType qual_type)
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
531b01000fd063629facd45044f137446fb748ee179Greg Clayton    uint64_t qual_type_bit_size = ast->getTypeSize(qual_type);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (qual_type_bit_size == bit_size)
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
537585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (Encoding encoding, uint32_t bit_size)
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTContext::GetBuiltinTypeForEncodingAndBitSize (getASTContext(), encoding, bit_size);
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
543b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetBuiltinTypeForEncodingAndBitSize (ASTContext *ast, Encoding encoding, uint32_t bit_size)
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
545b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (!ast)
54652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType();
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (encoding)
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
550585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingInvalid:
551b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
55252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->VoidPtrTy.getAsOpaquePtr());
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
555585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingUint:
556b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
55752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr());
558b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
55952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedShortTy.getAsOpaquePtr());
560b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
56152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedIntTy.getAsOpaquePtr());
562b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
56352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedLongTy.getAsOpaquePtr());
564b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
56552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedLongLongTy.getAsOpaquePtr());
566b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
56752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->UnsignedInt128Ty.getAsOpaquePtr());
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
570585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingSint:
571b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
57252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->CharTy.getAsOpaquePtr());
573b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
57452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->ShortTy.getAsOpaquePtr());
575b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
57652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->IntTy.getAsOpaquePtr());
577b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
57852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->LongTy.getAsOpaquePtr());
579b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
58052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->LongLongTy.getAsOpaquePtr());
581b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
58252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->Int128Ty.getAsOpaquePtr());
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
585585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingIEEE754:
586b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
58752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->FloatTy.getAsOpaquePtr());
588b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
58952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->DoubleTy.getAsOpaquePtr());
590b01000fd063629facd45044f137446fb748ee179Greg Clayton        if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
59152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->LongDoubleTy.getAsOpaquePtr());
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
594585660cc442f7faf8d2cbd936e4c92ac689c30e5Greg Clayton    case eEncodingVector:
5951bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        // Sanity check that bit_size is a multiple of 8's.
5961bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        if (bit_size && !(bit_size & 0x7u))
59752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->getExtVectorType (ast->UnsignedCharTy, bit_size/8).getAsOpaquePtr());
5981bc1caddf53e812ba87411f76fc15b7971930c22Johnny Chen        break;
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
60252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
60352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
60452f792329be5db8e38961350589e97e8f2823acdGreg Clayton
60552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
60652f792329be5db8e38961350589e97e8f2823acdGreg Claytonlldb::BasicType
60752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetBasicTypeEnumeration (const ConstString &name)
60852f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
60952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (name)
61052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
61152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        typedef UniqueCStringMap<lldb::BasicType> TypeNameToBasicTypeMap;
61252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        static TypeNameToBasicTypeMap g_type_map;
61352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        static std::once_flag g_once_flag;
61452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        std::call_once(g_once_flag, [](){
61552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "void"
61652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("void").GetCString(), eBasicTypeVoid);
61752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
61852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "char"
61952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("char").GetCString(), eBasicTypeChar);
62052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("signed char").GetCString(), eBasicTypeSignedChar);
62152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned char").GetCString(), eBasicTypeUnsignedChar);
62252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("wchar_t").GetCString(), eBasicTypeWChar);
62352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("signed wchar_t").GetCString(), eBasicTypeSignedWChar);
62452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned wchar_t").GetCString(), eBasicTypeUnsignedWChar);
62552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "short"
62652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("short").GetCString(), eBasicTypeShort);
62752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("short int").GetCString(), eBasicTypeShort);
62852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned short").GetCString(), eBasicTypeUnsignedShort);
62952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned short int").GetCString(), eBasicTypeUnsignedShort);
63052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "int"
63252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("int").GetCString(), eBasicTypeInt);
63352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("signed int").GetCString(), eBasicTypeInt);
63452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned int").GetCString(), eBasicTypeUnsignedInt);
63552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned").GetCString(), eBasicTypeUnsignedInt);
63652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
63752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "long"
63852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("long").GetCString(), eBasicTypeLong);
63952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("long int").GetCString(), eBasicTypeLong);
64052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned long").GetCString(), eBasicTypeUnsignedLong);
64152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned long int").GetCString(), eBasicTypeUnsignedLong);
64252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
64352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "long long"
64452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("long long").GetCString(), eBasicTypeLongLong);
64552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("long long int").GetCString(), eBasicTypeLongLong);
64652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned long long").GetCString(), eBasicTypeUnsignedLongLong);
64752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("unsigned long long int").GetCString(), eBasicTypeUnsignedLongLong);
64852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
64952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // "int128"
65052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("__int128_t").GetCString(), eBasicTypeInt128);
65152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("__uint128_t").GetCString(), eBasicTypeUnsignedInt128);
65252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
65352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // Miscelaneous
65452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("bool").GetCString(), eBasicTypeBool);
65552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("float").GetCString(), eBasicTypeFloat);
65652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("double").GetCString(), eBasicTypeDouble);
65752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("long double").GetCString(), eBasicTypeLongDouble);
65852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("id").GetCString(), eBasicTypeObjCID);
65952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("SEL").GetCString(), eBasicTypeObjCSel);
66052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Append(ConstString("nullptr").GetCString(), eBasicTypeNullPtr);
66152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            g_type_map.Sort();
66252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        });
66352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
66452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return g_type_map.Find(name.GetCString(), eBasicTypeInvalid);
66552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
66652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return eBasicTypeInvalid;
66752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
66852f792329be5db8e38961350589e97e8f2823acdGreg Clayton
66952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
67052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetBasicType (ASTContext *ast, const ConstString &name)
67152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
67252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast)
67352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
67452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        lldb::BasicType basic_type = ClangASTContext::GetBasicTypeEnumeration (name);
67552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTContext::GetBasicType (ast, basic_type);
67652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
67752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
67852f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
67952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
68052f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
68152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetPointerByteSize ()
68252f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
68352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (m_pointer_byte_size == 0)
68452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        m_pointer_byte_size = GetBasicType(lldb::eBasicTypeVoid).GetPointerType().GetByteSize();
68552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return m_pointer_byte_size;
68652f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
68752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
68852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
68952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetBasicType (lldb::BasicType basic_type)
69052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
69152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return GetBasicType (getASTContext(), basic_type);
69252f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
69352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
69452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
69552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetBasicType (ASTContext *ast, lldb::BasicType basic_type)
69652f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
69752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast)
69852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
69952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        clang_type_t clang_type = NULL;
70052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
70152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        switch (basic_type)
70252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
70352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeInvalid:
70452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeOther:
70552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
70652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeVoid:
70752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->VoidTy.getAsOpaquePtr();
70852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
70952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeChar:
71052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->CharTy.getAsOpaquePtr();
71152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
71252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeSignedChar:
71352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->SignedCharTy.getAsOpaquePtr();
71452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
71552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedChar:
71652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedCharTy.getAsOpaquePtr();
71752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
71852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeWChar:
71952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getWCharType().getAsOpaquePtr();
72052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
72152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeSignedWChar:
72252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getSignedWCharType().getAsOpaquePtr();
72352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
72452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedWChar:
72552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getUnsignedWCharType().getAsOpaquePtr();
72652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
72752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeChar16:
72852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->Char16Ty.getAsOpaquePtr();
72952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
73052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeChar32:
73152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->Char32Ty.getAsOpaquePtr();
73252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
73352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeShort:
73452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->ShortTy.getAsOpaquePtr();
73552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
73652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedShort:
73752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedShortTy.getAsOpaquePtr();
73852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
73952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeInt:
74052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->IntTy.getAsOpaquePtr();
74152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
74252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedInt:
74352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedIntTy.getAsOpaquePtr();
74452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
74552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeLong:
74652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->LongTy.getAsOpaquePtr();
74752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
74852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedLong:
74952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedLongTy.getAsOpaquePtr();
75052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
75152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeLongLong:
75252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->LongLongTy.getAsOpaquePtr();
75352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
75452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedLongLong:
75552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedLongLongTy.getAsOpaquePtr();
75652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
75752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeInt128:
75852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->Int128Ty.getAsOpaquePtr();
75952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
76052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeUnsignedInt128:
76152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->UnsignedInt128Ty.getAsOpaquePtr();
76252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
76352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeBool:
76452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->BoolTy.getAsOpaquePtr();
76552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
76652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeHalf:
76752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->HalfTy.getAsOpaquePtr();
76852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
76952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeFloat:
77052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->FloatTy.getAsOpaquePtr();
77152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
77252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeDouble:
77352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->DoubleTy.getAsOpaquePtr();
77452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
77552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeLongDouble:
77652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->LongDoubleTy.getAsOpaquePtr();
77752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
77852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeFloatComplex:
77952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->FloatComplexTy.getAsOpaquePtr();
78052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
78152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeDoubleComplex:
78252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->DoubleComplexTy.getAsOpaquePtr();
78352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
78452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeLongDoubleComplex:
78552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->LongDoubleComplexTy.getAsOpaquePtr();
78652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
78752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeObjCID:
78852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getObjCIdType().getAsOpaquePtr();
78952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
79052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeObjCClass:
79152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getObjCClassType().getAsOpaquePtr();
79252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
79352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeObjCSel:
79452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->getObjCSelType().getAsOpaquePtr();
79552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
79652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            case eBasicTypeNullPtr:
79752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                clang_type = ast->NullPtrTy.getAsOpaquePtr();
79852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                break;
79952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
80052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
80152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (clang_type)
80252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, clang_type);
80352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
80452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80752f792329be5db8e38961350589e97e8f2823acdGreg Clayton
80852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetBuiltinTypeForDWARFEncodingAndBitSize (const char *type_name, uint32_t dw_ate, uint32_t bit_size)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
811b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
812e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
813e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan#define streq(a,b) strcmp(a,b) == 0
814b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
815b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast)
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (dw_ate)
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
819e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            default:
820e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
821e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
822e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_address:
823e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->VoidPtrTy))
82452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->VoidPtrTy.getAsOpaquePtr());
825e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
826e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
827e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_boolean:
828e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->BoolTy))
82952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->BoolTy.getAsOpaquePtr());
830e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
83152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr());
832e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
83352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedShortTy.getAsOpaquePtr());
834e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
83552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedIntTy.getAsOpaquePtr());
836e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
837e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
838e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_lo_user:
839e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                // This has been seen to mean DW_AT_complex_integer
840e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (type_name)
84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
842e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (::strstr(type_name, "complex"))
843e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
84452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        ClangASTType complex_int_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("int", DW_ATE_signed, bit_size/2);
84552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->getComplexType (complex_int_clang_type.GetQualType()).getAsOpaquePtr());
846e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
848e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
849e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
850e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_complex_float:
851e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatComplexTy))
85252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->FloatComplexTy.getAsOpaquePtr());
853e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                else if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleComplexTy))
85452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->DoubleComplexTy.getAsOpaquePtr());
855e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                else if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleComplexTy))
85652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->LongDoubleComplexTy.getAsOpaquePtr());
857e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                else
8588ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
85952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    ClangASTType complex_float_clang_type = GetBuiltinTypeForDWARFEncodingAndBitSize ("float", DW_ATE_float, bit_size/2);
86052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->getComplexType (complex_float_clang_type.GetQualType()).getAsOpaquePtr());
8618ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
862e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
863e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
864e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_float:
865e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->FloatTy))
86652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->FloatTy.getAsOpaquePtr());
867e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->DoubleTy))
86852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->DoubleTy.getAsOpaquePtr());
869e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->LongDoubleTy))
87052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->LongDoubleTy.getAsOpaquePtr());
871e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
872e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
873e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_signed:
874e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (type_name)
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
876e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (streq(type_name, "wchar_t") &&
877e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        QualTypeMatchesBitSize (bit_size, ast, ast->WCharTy))
87852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->WCharTy.getAsOpaquePtr());
879e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (streq(type_name, "void") &&
880e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        QualTypeMatchesBitSize (bit_size, ast, ast->VoidTy))
88152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->VoidTy.getAsOpaquePtr());
882e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "long long") &&
883e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
88452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->LongLongTy.getAsOpaquePtr());
885e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "long") &&
886e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
88752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->LongTy.getAsOpaquePtr());
888e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "short") &&
889e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
89052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->ShortTy.getAsOpaquePtr());
891e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "char"))
892e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
893e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
89452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->CharTy.getAsOpaquePtr());
895e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
89652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->SignedCharTy.getAsOpaquePtr());
897e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
898e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "int"))
899e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
900e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
90152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->IntTy.getAsOpaquePtr());
902e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
90352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->Int128Ty.getAsOpaquePtr());
904e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
9057bb069b2216523f21fb6a3ce867f2f7278b1b07bGreg Clayton                }
906e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                // We weren't able to match up a type name, just search by size
907e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
90852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->CharTy.getAsOpaquePtr());
909e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->ShortTy))
91052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->ShortTy.getAsOpaquePtr());
911e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->IntTy))
91252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->IntTy.getAsOpaquePtr());
913e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->LongTy))
91452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->LongTy.getAsOpaquePtr());
915e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->LongLongTy))
91652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->LongLongTy.getAsOpaquePtr());
917e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->Int128Ty))
91852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->Int128Ty.getAsOpaquePtr());
919e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
920e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
921e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_signed_char:
922e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (type_name)
9238ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                {
924e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (streq(type_name, "signed char"))
925e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
926e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
92752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->SignedCharTy.getAsOpaquePtr());
928e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
9298ff5d55184d7c491d9c0d34a717264ab10396138Greg Clayton                }
930e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy))
93152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->CharTy.getAsOpaquePtr());
932e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy))
93352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->SignedCharTy.getAsOpaquePtr());
934e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
935ca54193ca2c9adc31facadb17423f1937e92f6c3Greg Clayton
936e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_unsigned:
937e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (type_name)
938ca54193ca2c9adc31facadb17423f1937e92f6c3Greg Clayton                {
939e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (strstr(type_name, "long long"))
940e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
941e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
94252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedLongLongTy.getAsOpaquePtr());
943e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
944e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    else if (strstr(type_name, "long"))
945e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
946e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
94752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedLongTy.getAsOpaquePtr());
948e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
949e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    else if (strstr(type_name, "short"))
950e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
951e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
95252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedShortTy.getAsOpaquePtr());
953e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
954e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    else if (strstr(type_name, "char"))
955e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
956e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
95752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr());
958e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
959e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    else if (strstr(type_name, "int"))
960e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
961e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
96252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedIntTy.getAsOpaquePtr());
963e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                        if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
96452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                            return ClangASTType (ast, ast->UnsignedInt128Ty.getAsOpaquePtr());
965e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
966ca54193ca2c9adc31facadb17423f1937e92f6c3Greg Clayton                }
967e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                // We weren't able to match up a type name, just search by size
968e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
96952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr());
970e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
97152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedShortTy.getAsOpaquePtr());
972e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedIntTy))
97352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedIntTy.getAsOpaquePtr());
974e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongTy))
97552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedLongTy.getAsOpaquePtr());
976e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedLongLongTy))
97752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedLongLongTy.getAsOpaquePtr());
978e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty))
97952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedInt128Ty.getAsOpaquePtr());
980e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
981e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
982e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_unsigned_char:
983e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy))
98452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr());
985e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy))
98652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return ClangASTType (ast, ast->UnsignedShortTy.getAsOpaquePtr());
987e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
988e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
989e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_imaginary_float:
990e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
991e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan
992e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan            case DW_ATE_UTF:
993e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                if (type_name)
994ca54193ca2c9adc31facadb17423f1937e92f6c3Greg Clayton                {
995e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    if (streq(type_name, "char16_t"))
996e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
99752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->Char16Ty.getAsOpaquePtr());
998e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
999e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    else if (streq(type_name, "char32_t"))
1000e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    {
100152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        return ClangASTType (ast, ast->Char32Ty.getAsOpaquePtr());
1002e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                    }
1003ca54193ca2c9adc31facadb17423f1937e92f6c3Greg Clayton                }
1004e4b3d6351171505f612ebb2d78ed15f348081845Sean Callanan                break;
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This assert should fire for anything that we don't catch above so we know
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // to fix any issues we run into.
10095a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    if (type_name)
10105a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
1011df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        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);
10125a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
10135a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    else
10145a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    {
1015df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        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);
10165a570908d7c5c7cfd342e5b100ca596780f5b958Greg Clayton    }
101752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType ();
1018960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton}
1019960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton
102052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
1021fb3058efeaacc2ced967e46842dfc4875b3daf14Sean CallananClangASTContext::GetUnknownAnyType(clang::ASTContext *ast)
1022fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan{
102352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast)
102452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (ast, ast->UnknownAnyTy.getAsOpaquePtr());
102552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
1026fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan}
1027fb3058efeaacc2ced967e46842dfc4875b3daf14Sean Callanan
102852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::GetCStringType (bool is_const)
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
103152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = getASTContext();
103252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType char_type(ast->CharTy);
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (is_const)
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        char_type.addConst();
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType (ast, ast->getPointerType(char_type).getAsOpaquePtr());
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1040673f3dbea64b116166dfa668006cdc84224a27c0Sean Callananclang::DeclContext *
1041673f3dbea64b116166dfa668006cdc84224a27c0Sean CallananClangASTContext::GetTranslationUnitDecl (clang::ASTContext *ast)
1042673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan{
1043673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan    return ast->getTranslationUnitDecl();
1044673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan}
1045673f3dbea64b116166dfa668006cdc84224a27c0Sean Callanan
104652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
104722defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyType (ASTContext *dst_ast,
104852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                           ClangASTType src)
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10508a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
105152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *src_ast = src.GetASTContext();
105222defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
105322defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
1054ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
1055ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
1056cf18faaf72090a68480145ca206955d792633559Sean Callanan
105752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType dst (importer.Import(src.GetQualType()));
1058cf18faaf72090a68480145ca206955d792633559Sean Callanan
105952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType (dst_ast, dst.getAsOpaquePtr());
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10626916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
10636916e358c9725b75ed91f31236c147f26c9af10eGreg Claytonclang::Decl *
106422defe8b06df5b1f09b53bda255ef07513abc04cGreg ClaytonClangASTContext::CopyDecl (ASTContext *dst_ast,
106522defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton                           ASTContext *src_ast,
10666916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton                           clang::Decl *source_decl)
1067887d25180c9ebe10513654baa96bfb31f7f1f260Sean Callanan{
10688a3b0a85dd512824f528cfa55d93f530ebe38be8Sean Callanan    FileSystemOptions file_system_options;
106922defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    FileManager file_manager (file_system_options);
107022defe8b06df5b1f09b53bda255ef07513abc04cGreg Clayton    ASTImporter importer(*dst_ast, file_manager,
1071ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         *src_ast, file_manager,
1072ad29309ac7a29db2cc363bd4ace20fbf862a42d3Sean Callanan                         false);
10736916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
10746916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton    return importer.Import(source_decl);
10756916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton}
10766916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton
10778d82506a78f7cd8f5d195bf86b7dffaa9ebc06faSean Callananbool
107852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::AreTypesSame (ClangASTType type1,
107952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                               ClangASTType type2,
1080dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                               bool ignore_qualifiers)
10815510dddc33260a991284ef81ca343594f23262e8Sean Callanan{
108252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = type1.GetASTContext();
108352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast != type2.GetASTContext())
108452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return false;
108552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
108652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (type1.GetOpaqueQualType() == type2.GetOpaqueQualType())
1087e2f71a33fa5ffdd3829d0c2c2a6790387743d064Greg Clayton        return true;
1088e2f71a33fa5ffdd3829d0c2c2a6790387743d064Greg Clayton
108952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType type1_qual = type1.GetQualType();
109052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    QualType type2_qual = type2.GetQualType();
109170c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan
109270c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan    if (ignore_qualifiers)
109370c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan    {
109470c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan        type1_qual = type1_qual.getUnqualifiedType();
109570c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan        type2_qual = type2_qual.getUnqualifiedType();
109670c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan    }
109770c6cf4b614cd79a54cf1a8696f7b4c963229868Sean Callanan
109852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ast->hasSameType (type1_qual, type2_qual);
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
1103b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (TagDecl *decl)
1104b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1105b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1106b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1107b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
110852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = m_ast_ap.get();
110952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast)
111052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (ast, ast->getTagDeclType(decl).getAsOpaquePtr());
111152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
1112b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1113b01000fd063629facd45044f137446fb748ee179Greg Clayton
111452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
1115b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext::GetTypeForDecl (ObjCInterfaceDecl *decl)
1116b01000fd063629facd45044f137446fb748ee179Greg Clayton{
1117b01000fd063629facd45044f137446fb748ee179Greg Clayton    // No need to call the getASTContext() accessor (which can create the AST
1118b01000fd063629facd45044f137446fb748ee179Greg Clayton    // if it isn't created yet, because we can't have created a decl in this
1119b01000fd063629facd45044f137446fb748ee179Greg Clayton    // AST if our AST didn't already exist...
112052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = m_ast_ap.get();
112152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (ast)
112252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (ast, ast->getObjCInterfaceType(decl).getAsOpaquePtr());
112352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
1124b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1125b01000fd063629facd45044f137446fb748ee179Greg Clayton
112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#pragma mark Structure, Unions, Classes
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
11299c09181404cc35f65d5353231246959135fb7684Greg ClaytonClangASTContext::CreateRecordType (DeclContext *decl_ctx,
11309c09181404cc35f65d5353231246959135fb7684Greg Clayton                                   AccessType access_type,
11319c09181404cc35f65d5353231246959135fb7684Greg Clayton                                   const char *name,
11329c09181404cc35f65d5353231246959135fb7684Greg Clayton                                   int kind,
11339c09181404cc35f65d5353231246959135fb7684Greg Clayton                                   LanguageType language,
11349c09181404cc35f65d5353231246959135fb7684Greg Clayton                                   ClangASTMetadata *metadata)
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1136b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1137b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
1138a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (decl_ctx == NULL)
1140b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11429488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
114332b4f14eb8bb47cf6e2eb545253e3c03c687ed52Greg Clayton    if (language == eLanguageTypeObjC || language == eLanguageTypeObjC_plus_plus)
11449488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    {
1145306edcaab871503192162272c147aef89d0ee719Greg Clayton        bool isForwardDecl = true;
11469488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton        bool isInternal = false;
1147a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan        return CreateObjCClass (name, decl_ctx, isForwardDecl, isInternal, metadata);
11489488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton    }
11499488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // NOTE: Eventually CXXRecordDecl will be merged back into RecordDecl and
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // we will need to update this code. I was told to currently always use
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the CXXRecordDecl class since we often don't know from debug information
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // if something is struct or a class, so we default to always use the more
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // complete definition just in case.
1155f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    CXXRecordDecl *decl = CXXRecordDecl::Create (*ast,
1156f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                 (TagDecl::TagKind)kind,
1157f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                 decl_ctx,
1158f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                 SourceLocation(),
1159f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                 SourceLocation(),
1160f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                 name && name[0] ? &ast->Idents.get(name) : NULL);
1161d0d73728f2840432f77f01dcd040b76a8c6307a9Sean Callanan
11629c09181404cc35f65d5353231246959135fb7684Greg Clayton    if (decl)
11635e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton    {
11649c09181404cc35f65d5353231246959135fb7684Greg Clayton        if (metadata)
1165017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton            SetMetadata(ast, decl, *metadata);
11669c09181404cc35f65d5353231246959135fb7684Greg Clayton
11675e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton        if (access_type != eAccessNone)
11685e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton            decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
11699c09181404cc35f65d5353231246959135fb7684Greg Clayton
11709c09181404cc35f65d5353231246959135fb7684Greg Clayton        if (decl_ctx)
11719c09181404cc35f65d5353231246959135fb7684Greg Clayton            decl_ctx->addDecl (decl);
11729c09181404cc35f65d5353231246959135fb7684Greg Clayton
117352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType(ast, ast->getTagDeclType(decl).getAsOpaquePtr());
11745e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton    }
117552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
1176b01000fd063629facd45044f137446fb748ee179Greg Clayton}
1177b01000fd063629facd45044f137446fb748ee179Greg Clayton
1178b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Claytonstatic TemplateParameterList *
1179b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonCreateTemplateParameterList (ASTContext *ast,
118006dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan                             const ClangASTContext::TemplateParameterInfos &template_param_infos,
1181b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                             llvm::SmallVector<NamedDecl *, 8> &template_param_decls)
1182f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton{
1183f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    const bool parameter_pack = false;
1184f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    const bool is_typename = false;
1185f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    const unsigned depth = 0;
1186f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    const size_t num_template_params = template_param_infos.GetSize();
1187f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    for (size_t i=0; i<num_template_params; ++i)
1188f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    {
1189f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        const char *name = template_param_infos.names[i];
1190764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton
1191764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton        IdentifierInfo *identifier_info = NULL;
1192764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton        if (name && name[0])
1193764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton            identifier_info = &ast->Idents.get(name);
119406dc17f8eb821d7256fd42e56f85c2779a29f689Sean Callanan        if (template_param_infos.args[i].getKind() == TemplateArgument::Integral)
1195f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        {
1196f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            template_param_decls.push_back (NonTypeTemplateParmDecl::Create (*ast,
1197f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             ast->getTranslationUnitDecl(), // Is this the right decl context?, SourceLocation StartLoc,
1198f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             SourceLocation(),
1199f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             SourceLocation(),
1200f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             depth,
1201f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             i,
1202764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton                                                                             identifier_info,
12034b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton                                                                             template_param_infos.args[i].getIntegralType(),
1204f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             parameter_pack,
1205f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                             NULL));
1206b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1207f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        }
1208f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        else
1209f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        {
1210f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton            template_param_decls.push_back (TemplateTypeParmDecl::Create (*ast,
1211f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          ast->getTranslationUnitDecl(), // Is this the right decl context?
1212f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          SourceLocation(),
1213f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          SourceLocation(),
1214f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          depth,
1215f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          i,
1216764bca576e78c9bbfb01894cc4d96e96830c77f1Greg Clayton                                                                          identifier_info,
1217f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          is_typename,
1218f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                          parameter_pack));
1219f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        }
1220f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    }
1221b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1222b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    TemplateParameterList *template_param_list = TemplateParameterList::Create (*ast,
1223b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                                SourceLocation(),
1224b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                                SourceLocation(),
1225b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                                &template_param_decls.front(),
1226b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                                template_param_decls.size(),
1227b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                                SourceLocation());
1228b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    return template_param_list;
1229b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton}
1230b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1231b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Claytonclang::FunctionTemplateDecl *
1232b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonClangASTContext::CreateFunctionTemplateDecl (clang::DeclContext *decl_ctx,
1233b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                             clang::FunctionDecl *func_decl,
1234b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                             const char *name,
1235b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                             const TemplateParameterInfos &template_param_infos)
1236b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton{
1237b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton//    /// \brief Create a function template node.
1238b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    ASTContext *ast = getASTContext();
1239b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1240b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1241b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1242b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1243b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                              template_param_infos,
1244b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                              template_param_decls);
1245b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    FunctionTemplateDecl *func_tmpl_decl = FunctionTemplateDecl::Create (*ast,
1246b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                         decl_ctx,
1247b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                         func_decl->getLocation(),
1248b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                         func_decl->getDeclName(),
1249b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                         template_param_list,
1250b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                         func_decl);
1251b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1252b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    for (size_t i=0, template_param_decl_count = template_param_decls.size();
1253b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton         i < template_param_decl_count;
1254b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton         ++i)
1255b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    {
1256b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton        // TODO: verify which decl context we should put template_param_decls into..
1257b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton        template_param_decls[i]->setDeclContext (func_decl);
1258b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    }
1259b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1260b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    return func_tmpl_decl;
1261b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton}
1262b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1263b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Claytonvoid
1264b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonClangASTContext::CreateFunctionTemplateSpecializationInfo (FunctionDecl *func_decl,
1265b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                           clang::FunctionTemplateDecl *func_tmpl_decl,
1266b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                           const TemplateParameterInfos &infos)
1267b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton{
1268b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    TemplateArgumentList template_args (TemplateArgumentList::OnStack,
1269b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                        infos.args.data(),
1270b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                        infos.args.size());
1271b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1272b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    func_decl->setFunctionTemplateSpecialization (func_tmpl_decl,
1273b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                  &template_args,
1274b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                  NULL);
1275b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton}
1276b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1277b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1278b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonClassTemplateDecl *
1279b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg ClaytonClangASTContext::CreateClassTemplateDecl (DeclContext *decl_ctx,
1280b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                          lldb::AccessType access_type,
1281b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                          const char *class_name,
1282b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                          int kind,
1283b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                          const TemplateParameterInfos &template_param_infos)
1284b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton{
1285b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    ASTContext *ast = getASTContext();
1286f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1287b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    ClassTemplateDecl *class_template_decl = NULL;
1288b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    if (decl_ctx == NULL)
1289b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
1290b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1291b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    IdentifierInfo &identifier_info = ast->Idents.get(class_name);
1292b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    DeclarationName decl_name (&identifier_info);
1293b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1294b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
1295ca8fb173fa66d9c93e02c4abfd4627c143795653Sean Callanan
1296ca8fb173fa66d9c93e02c4abfd4627c143795653Sean Callanan    for (NamedDecl *decl : result)
1297b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    {
1298ca8fb173fa66d9c93e02c4abfd4627c143795653Sean Callanan        class_template_decl = dyn_cast<clang::ClassTemplateDecl>(decl);
1299b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton        if (class_template_decl)
1300b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton            return class_template_decl;
1301b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    }
1302b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton
1303b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    llvm::SmallVector<NamedDecl *, 8> template_param_decls;
1304f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1305b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton    TemplateParameterList *template_param_list = CreateTemplateParameterList (ast,
1306b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                              template_param_infos,
1307b7fad95031b51dde040dc8b3de7bd8db2d14f613Greg Clayton                                                                              template_param_decls);
1308f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1309f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    CXXRecordDecl *template_cxx_decl = CXXRecordDecl::Create (*ast,
1310f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                              (TagDecl::TagKind)kind,
1311f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                              decl_ctx,  // What decl context do we use here? TU? The actual decl context?
1312f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                              SourceLocation(),
1313f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                              SourceLocation(),
1314f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                              &identifier_info);
13154b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton
13164b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton    for (size_t i=0, template_param_decl_count = template_param_decls.size();
13174b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton         i < template_param_decl_count;
13184b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton         ++i)
13194b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton    {
13204b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton        template_param_decls[i]->setDeclContext (template_cxx_decl);
13214b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton    }
13224b9cf3d9c856d23e2d440c8dfc1e1850692432e1Greg Clayton
1323d9b798561f6f54d8ce3cffeff1f104835279a895Sean Callanan    // With templated classes, we say that a class is templated with
1324d9b798561f6f54d8ce3cffeff1f104835279a895Sean Callanan    // specializations, but that the bare class has no functions.
1325dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    //template_cxx_decl->startDefinition();
1326dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    //template_cxx_decl->completeDefinition();
1327d9b798561f6f54d8ce3cffeff1f104835279a895Sean Callanan
1328f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    class_template_decl = ClassTemplateDecl::Create (*ast,
1329f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     decl_ctx,  // What decl context do we use here? TU? The actual decl context?
1330f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     SourceLocation(),
1331f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     decl_name,
1332f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     template_param_list,
1333f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     template_cxx_decl,
1334f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                     NULL);
1335f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1336f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    if (class_template_decl)
1337c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan    {
13385e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton        if (access_type != eAccessNone)
13395e8eb5c428e91b99f3884b53fc5deea0ecb001cdGreg Clayton            class_template_decl->setAccess (ConvertAccessTypeToAccessSpecifier (access_type));
13408f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
13418f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        //if (TagDecl *ctx_tag_decl = dyn_cast<TagDecl>(decl_ctx))
13428f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        //    CompleteTagDeclarationDefinition(GetTypeForDecl(ctx_tag_decl));
13438f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
1344f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        decl_ctx->addDecl (class_template_decl);
1345c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan
1346c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan#ifdef LLDB_CONFIGURATION_DEBUG
1347c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan        VerifyDecl(class_template_decl);
1348c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan#endif
1349c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan    }
1350f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1351f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    return class_template_decl;
1352f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton}
1353f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1354f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1355f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg ClaytonClassTemplateSpecializationDecl *
1356f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg ClaytonClangASTContext::CreateClassTemplateSpecializationDecl (DeclContext *decl_ctx,
1357f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                        ClassTemplateDecl *class_template_decl,
1358f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                        int kind,
1359f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                        const TemplateParameterInfos &template_param_infos)
1360f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton{
1361f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    ASTContext *ast = getASTContext();
1362f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    ClassTemplateSpecializationDecl *class_template_specialization_decl = ClassTemplateSpecializationDecl::Create (*ast,
1363f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   (TagDecl::TagKind)kind,
1364f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   decl_ctx,
1365f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   SourceLocation(),
1366f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   SourceLocation(),
1367f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   class_template_decl,
1368f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   &template_param_infos.args.front(),
1369f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   template_param_infos.args.size(),
1370f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton                                                                                                                   NULL);
1371f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
1372dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan    class_template_specialization_decl->setSpecializationKind(TSK_ExplicitSpecialization);
1373dbf2fb0d760631d86ab93cc70c3bb05a4c514263Sean Callanan
1374f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    return class_template_specialization_decl;
1375f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton}
1376f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton
137752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
1378f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg ClaytonClangASTContext::CreateClassTemplateSpecializationType (ClassTemplateSpecializationDecl *class_template_specialization_decl)
1379f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton{
1380f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    if (class_template_specialization_decl)
1381f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton    {
1382f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        ASTContext *ast = getASTContext();
1383f6a5bd78aaef0e4d477208289ace03cfa7f60649Greg Clayton        if (ast)
138452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(ast, ast->getTagDeclType(class_template_specialization_decl).getAsOpaquePtr());
1385b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
138652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
138724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
138824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1389dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Claytonstatic bool
1390dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg ClaytonIsOperator (const char *name, OverloadedOperatorKind &op_kind)
1391dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton{
1392dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    if (name == NULL || name[0] == '\0')
1393dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        return false;
1394dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1395494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#define OPERATOR_PREFIX "operator"
1396427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#define OPERATOR_PREFIX_LENGTH (sizeof (OPERATOR_PREFIX) - 1)
1397c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1398c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    const char *post_op_name = NULL;
1399c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1400494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    bool no_space = true;
1401c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1402427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    if (::strncmp(name, OPERATOR_PREFIX, OPERATOR_PREFIX_LENGTH))
1403494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        return false;
1404494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan
1405427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton    post_op_name = name + OPERATOR_PREFIX_LENGTH;
1406427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton
1407494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan    if (post_op_name[0] == ' ')
1408c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    {
1409494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        post_op_name++;
1410494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan        no_space = false;
1411c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    }
1412c2c9a149f127736550d7430653f4c1a51731442eSean Callanan
1413494735debedd2ed3d9cf3ff0b6f8373232ae0d8dSean Callanan#undef OPERATOR_PREFIX
1414427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton#undef OPERATOR_PREFIX_LENGTH
1415dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1416dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // This is an operator, set the overloaded operator kind to invalid
1417dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    // in case this is a conversion operator...
1418dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    op_kind = NUM_OVERLOADED_OPERATORS;
1419dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1420dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    switch (post_op_name[0])
1421dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    {
1422c2c9a149f127736550d7430653f4c1a51731442eSean Callanan    default:
1423c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1424c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1425c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        break;
1426dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'n':
1427c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1428c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1429dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if  (strcmp (post_op_name, "new") == 0)
1430dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_New;
1431dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "new[]") == 0)
1432dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_New;
1433dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1434dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1435dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case 'd':
1436c2c9a149f127736550d7430653f4c1a51731442eSean Callanan        if (no_space)
1437c2c9a149f127736550d7430653f4c1a51731442eSean Callanan            return false;
1438dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (strcmp (post_op_name, "delete") == 0)
1439dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Delete;
1440dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (strcmp (post_op_name, "delete[]") == 0)
1441dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Array_Delete;
1442dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1443dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1444dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '+':
1445dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1446dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Plus;
1447dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1448dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1449dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[1] == '=')
1450dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusEqual;
1451dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            else if (post_op_name[1] == '+')
1452dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_PlusPlus;
1453dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1454dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1455dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1456dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '-':
1457dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1458dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Minus;
1459dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1460dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1461dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1462dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1463dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_MinusEqual; break;
1464dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '-': op_kind = OO_MinusMinus; break;
1465dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_Arrow; break;
1466dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1467dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1468dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1469dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1470dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '*')
1471dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_ArrowStar; break;
1472dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1473dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1474dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1475dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '*':
1476dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1477dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Star;
1478dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1479dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_StarEqual;
1480dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1481dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1482dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '/':
1483dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1484dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Slash;
1485dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1486dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_SlashEqual;
1487dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1488dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1489dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '%':
1490dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1491dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Percent;
1492dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1493dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_PercentEqual;
1494dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1495dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1496dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1497dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '^':
1498dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1499dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Caret;
1500dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1501dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_CaretEqual;
1502dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1503dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1504dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '&':
1505dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1506dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Amp;
1507dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1508dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1509dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1510dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1511dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_AmpEqual; break;
1512dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '&': op_kind = OO_AmpAmp; break;
1513dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1514dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1515dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1516dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1517dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '|':
1518dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1519dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Pipe;
1520dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1521dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1522dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1523dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1524dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_PipeEqual; break;
1525dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '|': op_kind = OO_PipePipe; break;
1526dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1527dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1528dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1529dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1530dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '~':
1531dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1532dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Tilde;
1533dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1534dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1535dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '!':
1536dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1537dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Exclaim;
1538dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1539dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_ExclaimEqual;
1540dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1541dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1542dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '=':
1543dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1544dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Equal;
1545dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '=' && post_op_name[2] == '\0')
1546dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_EqualEqual;
1547dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1548dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1549dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '<':
1550dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1551dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Less;
1552dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1553dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1554dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1555dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1556dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '<': op_kind = OO_LessLess; break;
1557dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_LessEqual; break;
1558dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1559dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1560dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[3] == '\0')
1561dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1562dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            if (post_op_name[2] == '=')
1563dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_LessLessEqual;
1564dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1565dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1566dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1567dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '>':
1568dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1569dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Greater;
1570dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[2] == '\0')
1571dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1572dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            switch (post_op_name[1])
1573dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            {
1574dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '>': op_kind = OO_GreaterGreater; break;
1575dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            case '=': op_kind = OO_GreaterEqual; break;
1576dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            }
1577dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1578dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        else if (post_op_name[1] == '>' &&
1579dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[2] == '=' &&
1580dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                 post_op_name[3] == '\0')
1581dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        {
1582dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton                op_kind = OO_GreaterGreaterEqual;
1583dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        }
1584dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1585dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1586dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case ',':
1587dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == '\0')
1588dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Comma;
1589dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1590dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1591dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '(':
1592dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ')' && post_op_name[2] == '\0')
1593dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Call;
1594dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1595dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1596dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    case '[':
1597dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        if (post_op_name[1] == ']' && post_op_name[2] == '\0')
1598dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton            op_kind = OO_Subscript;
1599dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton        break;
1600dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    }
1601dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton
1602dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton    return true;
1603dbf26158d1a50a1ff46e97e92481fc4d19c8ec98Greg Clayton}
1604b01000fd063629facd45044f137446fb748ee179Greg Clayton
16058c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonstatic inline bool
160637e278307f2d2c01077e15f9787ab93777e023fbSean Callanancheck_op_param (uint32_t op_kind, bool unary, bool binary, uint32_t num_params)
16078c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
160837e278307f2d2c01077e15f9787ab93777e023fbSean Callanan    // Special-case call since it can take any number of operands
160937e278307f2d2c01077e15f9787ab93777e023fbSean Callanan    if(op_kind == OO_Call)
161037e278307f2d2c01077e15f9787ab93777e023fbSean Callanan        return true;
161137e278307f2d2c01077e15f9787ab93777e023fbSean Callanan
16128c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    // The parameter count doens't include "this"
16138c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 0)
16148c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return unary;
16158c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    if (num_params == 1)
16168c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        return binary;
161737e278307f2d2c01077e15f9787ab93777e023fbSean Callanan    else
16188c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
16198c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
1620354ffde621c3c7560000fdafb085205bf5a5a545Daniel Dunbar
16218c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Claytonbool
16228c6907c4daa74a8ebc418ec6eed151b68bda6321Greg ClaytonClangASTContext::CheckOverloadedOperatorKindParameterCount (uint32_t op_kind, uint32_t num_params)
16238c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton{
16248f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    switch (op_kind)
16258f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    {
16268f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    default:
16278f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        break;
16288f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    // C++ standard allows any number of arguments to new/delete
16298f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    case OO_New:
16308f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    case OO_Array_New:
16318f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    case OO_Delete:
16328f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    case OO_Array_Delete:
16338f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return true;
16348f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan    }
16358f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan
163637e278307f2d2c01077e15f9787ab93777e023fbSean Callanan#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) case OO_##Name: return check_op_param (op_kind, Unary, Binary, num_params);
16378c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    switch (op_kind)
16388c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    {
16398c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton#include "clang/Basic/OperatorKinds.def"
16408c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton        default: break;
16418c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    }
16428c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton    return false;
16438c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton}
16448c6907c4daa74a8ebc418ec6eed151b68bda6321Greg Clayton
164552f792329be5db8e38961350589e97e8f2823acdGreg Claytonclang::AccessSpecifier
164652f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::UnifyAccessSpecifiers (clang::AccessSpecifier lhs, clang::AccessSpecifier rhs)
1647795230029c9c8ff35c167ee5f548b1b373b89c33Sean Callanan{
164852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    clang::AccessSpecifier ret = lhs;
16491d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
165052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // Make the access equal to the stricter of the field and the nested field's access
165152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    switch (ret)
165252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    {
165352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::AS_none:
165452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
165552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::AS_private:
165652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
165752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::AS_protected:
165852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (rhs == AS_private)
165952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ret = AS_private;
166052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
166152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        case clang::AS_public:
166252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            ret = rhs;
166352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            break;
166452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    }
16653c9c5eb466869ede185e879d14a47335fb43194dSean Callanan
166652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ret;
166752f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
166890e325d6aefb5e85c31982a745c4147b50dcac3cGreg Clayton
166952f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool
167052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::FieldIsBitfield (FieldDecl* field, uint32_t& bitfield_bit_size)
167152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
167252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return FieldIsBitfield(getASTContext(), field, bitfield_bit_size);
167352f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::FieldIsBitfield
167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
1678b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast,
167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FieldDecl* field,
168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t& bitfield_bit_size
168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
168224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1683b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (ast == NULL || field == NULL)
168424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
168524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (field->isBitField())
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Expr* bit_width_expr = field->getBitWidth();
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bit_width_expr)
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            llvm::APSInt bit_width_apsint;
1692b01000fd063629facd45044f137446fb748ee179Greg Clayton            if (bit_width_expr->isIntegerConstantExpr(bit_width_apsint, *ast))
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                bitfield_bit_size = bit_width_apsint.getLimitedValue(UINT32_MAX);
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerClangASTContext::RecordHasFields (const RecordDecl *record_decl)
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (record_decl == NULL)
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!record_decl->field_empty())
170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
171024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
171124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No fields, lets check this is a CXX record and check the base classes
171224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const CXXRecordDecl *cxx_record_decl = dyn_cast<CXXRecordDecl>(record_decl);
171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cxx_record_decl)
171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             base_class != base_class_end;
171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner             ++base_class)
171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const CXXRecordDecl *base_class_decl = cast<CXXRecordDecl>(base_class->getType()->getAs<RecordType>()->getDecl());
172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (RecordHasFields(base_class_decl))
172224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true;
172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
172884f8075072eef306234f8109573067647735c111Greg Clayton#pragma mark Objective C Classes
172984f8075072eef306234f8109573067647735c111Greg Clayton
173052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
1731a4974db9b26cc4f33e16c990304b51f4a1d38611Sean CallananClangASTContext::CreateObjCClass
173284f8075072eef306234f8109573067647735c111Greg Clayton(
173384f8075072eef306234f8109573067647735c111Greg Clayton    const char *name,
173484f8075072eef306234f8109573067647735c111Greg Clayton    DeclContext *decl_ctx,
173584f8075072eef306234f8109573067647735c111Greg Clayton    bool isForwardDecl,
1736a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan    bool isInternal,
1737a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    ClangASTMetadata *metadata
173884f8075072eef306234f8109573067647735c111Greg Clayton)
173984f8075072eef306234f8109573067647735c111Greg Clayton{
1740b01000fd063629facd45044f137446fb748ee179Greg Clayton    ASTContext *ast = getASTContext();
1741b01000fd063629facd45044f137446fb748ee179Greg Clayton    assert (ast != NULL);
174284f8075072eef306234f8109573067647735c111Greg Clayton    assert (name && name[0]);
174384f8075072eef306234f8109573067647735c111Greg Clayton    if (decl_ctx == NULL)
1744b01000fd063629facd45044f137446fb748ee179Greg Clayton        decl_ctx = ast->getTranslationUnitDecl();
174584f8075072eef306234f8109573067647735c111Greg Clayton
1746b01000fd063629facd45044f137446fb748ee179Greg Clayton    ObjCInterfaceDecl *decl = ObjCInterfaceDecl::Create (*ast,
174784f8075072eef306234f8109573067647735c111Greg Clayton                                                         decl_ctx,
174884f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
1749b01000fd063629facd45044f137446fb748ee179Greg Clayton                                                         &ast->Idents.get(name),
17508f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                         NULL,
175184f8075072eef306234f8109573067647735c111Greg Clayton                                                         SourceLocation(),
17528f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan                                                         /*isForwardDecl,*/
175384f8075072eef306234f8109573067647735c111Greg Clayton                                                         isInternal);
17549488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
1755a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    if (decl && metadata)
1756017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton        SetMetadata(ast, decl, *metadata);
1757a4974db9b26cc4f33e16c990304b51f4a1d38611Sean Callanan
175852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType (ast, ast->getObjCInterfaceType(decl));
175984f8075072eef306234f8109573067647735c111Greg Clayton}
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176152f792329be5db8e38961350589e97e8f2823acdGreg Claytonstatic inline bool
176252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonBaseSpecifierIsEmpty (const CXXBaseSpecifier *b)
176352f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
176452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTContext::RecordHasFields(b->getType()->getAsCXXRecordDecl()) == false;
176552f792329be5db8e38961350589e97e8f2823acdGreg Clayton}
176652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
176752f792329be5db8e38961350589e97e8f2823acdGreg Claytonuint32_t
176852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetNumBaseClasses (const CXXRecordDecl *cxx_record_decl, bool omit_empty_base_classes)
176984f8075072eef306234f8109573067647735c111Greg Clayton{
177052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    uint32_t num_bases = 0;
177152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (cxx_record_decl)
177284f8075072eef306234f8109573067647735c111Greg Clayton    {
177352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (omit_empty_base_classes)
177484f8075072eef306234f8109573067647735c111Greg Clayton        {
177552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            CXXRecordDecl::base_class_const_iterator base_class, base_class_end;
177652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end();
177752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 base_class != base_class_end;
177852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                 ++base_class)
177984f8075072eef306234f8109573067647735c111Greg Clayton            {
178052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // Skip empty base classes
178152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (omit_empty_base_classes)
178284f8075072eef306234f8109573067647735c111Greg Clayton                {
178352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    if (BaseSpecifierIsEmpty (base_class))
178452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                        continue;
178584f8075072eef306234f8109573067647735c111Greg Clayton                }
178652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                ++num_bases;
178784f8075072eef306234f8109573067647735c111Greg Clayton            }
178884f8075072eef306234f8109573067647735c111Greg Clayton        }
178952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else
179052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            num_bases = cxx_record_decl->getNumBases();
179184f8075072eef306234f8109573067647735c111Greg Clayton    }
179252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return num_bases;
179384f8075072eef306234f8109573067647735c111Greg Clayton}
179484f8075072eef306234f8109573067647735c111Greg Clayton
179584f8075072eef306234f8109573067647735c111Greg Clayton
179652f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Namespace Declarations
179784f8075072eef306234f8109573067647735c111Greg Clayton
179852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonNamespaceDecl *
179952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::GetUniqueNamespaceDeclaration (const char *name, DeclContext *decl_ctx)
180052f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
180152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    NamespaceDecl *namespace_decl = NULL;
180252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = getASTContext();
180352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    TranslationUnitDecl *translation_unit_decl = ast->getTranslationUnitDecl ();
180452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (decl_ctx == NULL)
180552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        decl_ctx = translation_unit_decl;
18062546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham
180752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (name)
180884f8075072eef306234f8109573067647735c111Greg Clayton    {
180952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        IdentifierInfo &identifier_info = ast->Idents.get(name);
181052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        DeclarationName decl_name (&identifier_info);
181152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        clang::DeclContext::lookup_result result = decl_ctx->lookup(decl_name);
181252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        for (NamedDecl *decl : result)
181384f8075072eef306234f8109573067647735c111Greg Clayton        {
181452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            namespace_decl = dyn_cast<clang::NamespaceDecl>(decl);
181552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (namespace_decl)
181652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return namespace_decl;
18172546fd2a7adb2081e77ce6779e25646c0e3498a9Jim Ingham        }
18189488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
181952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        namespace_decl = NamespaceDecl::Create(*ast,
182052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               decl_ctx,
182152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               false,
182252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               SourceLocation(),
182352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               SourceLocation(),
182452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               &identifier_info,
182552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                               NULL);
18269488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton
182752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        decl_ctx->addDecl (namespace_decl);
18281d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
182952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
18301d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
183152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (decl_ctx == translation_unit_decl)
18321d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton        {
183352f792329be5db8e38961350589e97e8f2823acdGreg Clayton            namespace_decl = translation_unit_decl->getAnonymousNamespace();
183452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (namespace_decl)
183552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return namespace_decl;
183652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
183752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            namespace_decl = NamespaceDecl::Create(*ast,
183852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   decl_ctx,
183952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   false,
18401d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   SourceLocation(),
1841279584cdea3dfda933480ed0fe948df2697ab512Sean Callanan                                                   SourceLocation(),
18421d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton                                                   NULL,
184352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                   NULL);
184452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            translation_unit_decl->setAnonymousNamespace (namespace_decl);
184552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            translation_unit_decl->addDecl (namespace_decl);
184652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            assert (namespace_decl == translation_unit_decl->getAnonymousNamespace());
18473eeaf6e715784499520885535236ccff1ba56d1cGreg Clayton        }
184852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else
184904325065a00f646527db85e9bc751da29ac53b23Sean Callanan        {
185052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            NamespaceDecl *parent_namespace_decl = cast<NamespaceDecl>(decl_ctx);
185152f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (parent_namespace_decl)
1852f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
185352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                namespace_decl = parent_namespace_decl->getAnonymousNamespace();
185452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                if (namespace_decl)
185552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                    return namespace_decl;
185652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                namespace_decl = NamespaceDecl::Create(*ast,
185752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       decl_ctx,
185852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       false,
185952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       SourceLocation(),
186052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       SourceLocation(),
186152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       NULL,
186252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                       NULL);
186352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                parent_namespace_decl->setAnonymousNamespace (namespace_decl);
186452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                parent_namespace_decl->addDecl (namespace_decl);
186552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                assert (namespace_decl == parent_namespace_decl->getAnonymousNamespace());
1866f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
186752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            else
1868f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            {
186952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                // BAD!!!
1870f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton            }
1871f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        }
187252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
1873f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton
187452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (namespace_decl)
1875f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        {
187652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // If we make it here, we are creating the anonymous namespace decl
187752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // for the first time, so we need to do the using directive magic
187852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            // like SEMA does
187952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            UsingDirectiveDecl* using_directive_decl = UsingDirectiveDecl::Create (*ast,
188052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   decl_ctx,
188152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   SourceLocation(),
188252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   SourceLocation(),
188352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   NestedNameSpecifierLoc(),
188452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   SourceLocation(),
188552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   namespace_decl,
188652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                                   decl_ctx);
188752f792329be5db8e38961350589e97e8f2823acdGreg Clayton            using_directive_decl->setImplicit();
188852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            decl_ctx->addDecl(using_directive_decl);
1889f95fc9e09fa0a32de0a3904a1517266df37e8bffGreg Clayton        }
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1891c6d161e3ed961e40242b5a0482a3354848c7cd57Sean Callanan#ifdef LLDB_CONFIGURATION_DEBUG
189252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    VerifyDecl(namespace_decl);
189352f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
189452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return namespace_decl;
18959762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata}
18969762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
18979762e10787a7efc2f0d822590cab42ca23d5e4f9Enrico Granata
189852f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Function Types
1899bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
190052f792329be5db8e38961350589e97e8f2823acdGreg ClaytonFunctionDecl *
190152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::CreateFunctionDeclaration (DeclContext *decl_ctx,
190252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            const char *name,
190352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            const ClangASTType &function_clang_type,
190452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            int storage,
190552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            bool is_inline)
1906bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton{
190752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    FunctionDecl *func_decl = NULL;
190852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = getASTContext();
190952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (decl_ctx == NULL)
191052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        decl_ctx = ast->getTranslationUnitDecl();
1911bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
191252f792329be5db8e38961350589e97e8f2823acdGreg Clayton
191352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const bool hasWrittenPrototype = true;
191452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const bool isConstexprSpecified = false;
1915bf8e42b9da0e1c6349a727d644ad37610b00d556Greg Clayton
191652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (name && name[0])
19171d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    {
191852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        func_decl = FunctionDecl::Create (*ast,
191952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          decl_ctx,
192052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
192152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
192252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          DeclarationName (&ast->Idents.get(name)),
192352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          function_clang_type.GetQualType(),
192452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          NULL,
192552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          (FunctionDecl::StorageClass)storage,
192652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          is_inline,
192752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          hasWrittenPrototype,
192852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          isConstexprSpecified);
19291d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton    }
193052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    else
19319f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton    {
193252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        func_decl = FunctionDecl::Create (*ast,
193352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          decl_ctx,
193452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
193552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          SourceLocation(),
193652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          DeclarationName (),
193752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          function_clang_type.GetQualType(),
193852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          NULL,
193952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          (FunctionDecl::StorageClass)storage,
194052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          is_inline,
194152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          hasWrittenPrototype,
194252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                          isConstexprSpecified);
19439f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton    }
194452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (func_decl)
194552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        decl_ctx->addDecl (func_decl);
194652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
194752f792329be5db8e38961350589e97e8f2823acdGreg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
194852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    VerifyDecl(func_decl);
194952f792329be5db8e38961350589e97e8f2823acdGreg Clayton#endif
195052f792329be5db8e38961350589e97e8f2823acdGreg Clayton
195152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return func_decl;
19529f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton}
19539f54ab7b1fb850e31c82c53d7e6967be8547e7abGreg Clayton
195452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
195552f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::CreateFunctionType (ASTContext *ast,
195652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     const ClangASTType& result_type,
195752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     const ClangASTType *args,
195852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     unsigned num_args,
195952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     bool is_variadic,
196052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                     unsigned type_quals)
19611d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton{
196252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    assert (ast != NULL);
196352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    std::vector<QualType> qual_type_args;
196452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    for (unsigned i=0; i<num_args; ++i)
196552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        qual_type_args.push_back (args[i].GetQualType());
19661d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
196752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // TODO: Detect calling convention in DWARF?
196852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    FunctionProtoType::ExtProtoInfo proto_info;
196952f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.Variadic = is_variadic;
197052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.ExceptionSpecType = EST_None;
197152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.TypeQuals = type_quals;
197252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.RefQualifier = RQ_None;
197352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.NumExceptions = 0;
197452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    proto_info.Exceptions = NULL;
197552f792329be5db8e38961350589e97e8f2823acdGreg Clayton
197652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType (ast, ast->getFunctionType (result_type.GetQualType(),
197752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    qual_type_args,
197852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                    proto_info).getAsOpaquePtr());
1979931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan}
1980931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan
198152f792329be5db8e38961350589e97e8f2823acdGreg ClaytonParmVarDecl *
198252f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::CreateParameterDeclaration (const char *name, const ClangASTType &param_type, int storage)
1983931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan{
198452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = getASTContext();
198552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    assert (ast != NULL);
198652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ParmVarDecl::Create(*ast,
198752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                ast->getTranslationUnitDecl(),
198852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                SourceLocation(),
198952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                SourceLocation(),
199052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                name && name[0] ? &ast->Idents.get(name) : NULL,
199152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                param_type.GetQualType(),
199252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                NULL,
199352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                (VarDecl::StorageClass)storage,
199452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                0);
1995931acecd4e3af534028936431dc0f75a9fd6eb02Sean Callanan}
19961d8173f1b622482bd6610cc34ffd5668b75cf7bdGreg Clayton
199752f792329be5db8e38961350589e97e8f2823acdGreg Claytonvoid
199852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::SetFunctionParameters (FunctionDecl *function_decl, ParmVarDecl **params, unsigned num_params)
1999f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton{
200052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (function_decl)
200152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        function_decl->setParams (ArrayRef<ParmVarDecl*>(params, num_params));
2002f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton}
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2004f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton
200552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Array Types
200652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
200752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
200852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::CreateArrayType (const ClangASTType &element_type,
200952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                  size_t element_count,
201052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                  bool is_vector)
201152f792329be5db8e38961350589e97e8f2823acdGreg Clayton{
201252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (element_type.IsValid())
201324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
201452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ASTContext *ast = getASTContext();
201552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        assert (ast != NULL);
201652f792329be5db8e38961350589e97e8f2823acdGreg Clayton
201752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (is_vector)
201852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        {
201952f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType (ast, ast->getExtVectorType(element_type.GetQualType(), element_count).getAsOpaquePtr());
202052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        }
202152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        else
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
202352f792329be5db8e38961350589e97e8f2823acdGreg Clayton
202452f792329be5db8e38961350589e97e8f2823acdGreg Clayton            llvm::APInt ap_element_count (64, element_count);
202552f792329be5db8e38961350589e97e8f2823acdGreg Clayton            if (element_count == 0)
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
202752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (ast, ast->getIncompleteArrayType (element_type.GetQualType(),
202852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       ArrayType::Normal,
202952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                       0).getAsOpaquePtr());
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
2031f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton            else
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
203352f792329be5db8e38961350589e97e8f2823acdGreg Clayton                return ClangASTType (ast, ast->getConstantArrayType (element_type.GetQualType(),
203452f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     ap_element_count,
203552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     ArrayType::Normal,
203652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                                                     0).getAsOpaquePtr());
203703e0f97cfa469792dd69b36f782d33a014225788Greg Clayton            }
203803e0f97cfa469792dd69b36f782d33a014225788Greg Clayton        }
203903e0f97cfa469792dd69b36f782d33a014225788Greg Clayton    }
204052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
204103e0f97cfa469792dd69b36f782d33a014225788Greg Clayton}
204203e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
204359e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
2044efc7e55e58ee54ffda4b8d95add7918291236e80Enrico Granata
204552f792329be5db8e38961350589e97e8f2823acdGreg Clayton#pragma mark Enumeration Types
204603e0f97cfa469792dd69b36f782d33a014225788Greg Clayton
204752f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
204852f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTContext::CreateEnumerationType
204952f792329be5db8e38961350589e97e8f2823acdGreg Clayton(
205052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const char *name,
205152f792329be5db8e38961350589e97e8f2823acdGreg Clayton    DeclContext *decl_ctx,
205252f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const Declaration &decl,
205352f792329be5db8e38961350589e97e8f2823acdGreg Clayton    const ClangASTType &integer_clang_type
205452f792329be5db8e38961350589e97e8f2823acdGreg Clayton)
205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
205652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // TODO: Do something intelligent with the Declaration object passed in
205752f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // like maybe filling in the SourceLocation with it...
205852f792329be5db8e38961350589e97e8f2823acdGreg Clayton    ASTContext *ast = getASTContext();
205952f792329be5db8e38961350589e97e8f2823acdGreg Clayton
206052f792329be5db8e38961350589e97e8f2823acdGreg Clayton    // TODO: ask about these...
206152f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    const bool IsScoped = false;
206252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//    const bool IsFixed = false;
206359e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
206452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    EnumDecl *enum_decl = EnumDecl::Create (*ast,
206552f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            decl_ctx,
206652f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            SourceLocation(),
206752f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            SourceLocation(),
206852f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            name && name[0] ? &ast->Idents.get(name) : NULL,
206952f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            NULL,
207052f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            false,  // IsScoped
207152f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            false,  // IsScopedUsingClassTag
207252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                                            false); // IsFixed
207359e093da47e46146dd5b8cddd4dd8dcfcfa31a65Greg Clayton
2074c613971c0016484053b60db95d01648a3f6ea849Sean Callanan
207552f792329be5db8e38961350589e97e8f2823acdGreg Clayton    if (enum_decl)
207624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
207752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        // TODO: check if we should be setting the promotion type too?
207852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        enum_decl->setIntegerType(integer_clang_type.GetQualType());
2079864bfdb96d427a67e585db047fea14eb15fe42a7Sean Callanan
208052f792329be5db8e38961350589e97e8f2823acdGreg Clayton        enum_decl->setAccess(AS_public); // TODO respect what's in the debug info
208152f792329be5db8e38961350589e97e8f2823acdGreg Clayton
208252f792329be5db8e38961350589e97e8f2823acdGreg Clayton        return ClangASTType (ast, ast->getTagDeclType(enum_decl).getAsOpaquePtr());
208324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
208452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
208524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
208624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
208724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Disable this for now since I can't seem to get a nicely formatted float
208824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// out of the APFloat class without just getting the float, double or quad
208924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and then using a formatted print on it which defeats the purpose. We ideally
209024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// would like to get perfect string values for any kind of float semantics
209124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// so we can support remote targets. The code below also requires a patch to
209224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// llvm::APInt.
209324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//bool
2094b01000fd063629facd45044f137446fb748ee179Greg Clayton//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)
209524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
209624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  uint32_t count = 0;
209724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  bool is_complex = false;
209824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (ClangASTContext::IsFloatingPointType (clang_type, count, is_complex))
209924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  {
210024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bytes_per_float = byte_size / count;
210124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      unsigned num_bits_per_float = num_bytes_per_float * 8;
210224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
210324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      float_str.clear();
210424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      uint32_t i;
210524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      for (i=0; i<count; i++)
210624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      {
210724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APInt ap_int(num_bits_per_float, bytes + i * num_bytes_per_float, (APInt::ByteOrder)apint_byte_order);
210824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool is_ieee = false;
210924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          APFloat ap_float(ap_int, is_ieee);
211024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          char s[1024];
211124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          unsigned int hex_digits = 0;
211224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          bool upper_case = false;
211324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
211424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          if (ap_float.convertToHexString(s, hex_digits, upper_case, APFloat::rmNearestTiesToEven) > 0)
211524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          {
211624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i > 0)
211724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(", ");
211824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              float_str.append(s);
211924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//              if (i == 1 && is_complex)
212024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                  float_str.append(1, 'i');
212124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//          }
212224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      }
212324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return !float_str.empty();
212424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  }
212524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return false;
212624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
212724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2128a751f7b1baa037ab6e9398f7bf5eb3a36a84e984Sean Callanan
212952f792329be5db8e38961350589e97e8f2823acdGreg ClaytonClangASTType
2130a9dc882693ef65ee3657b96f018fec3685d37282Greg ClaytonClangASTContext::GetFloatTypeFromBitSize (clang::ASTContext *ast,
2131a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton                                          size_t bit_size)
2132a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton{
2133a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    if (ast)
2134a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    {
2135a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton        if (bit_size == ast->getTypeSize(ast->FloatTy))
213652f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(ast, ast->FloatTy.getAsOpaquePtr());
2137a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton        else if (bit_size == ast->getTypeSize(ast->DoubleTy))
213852f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(ast, ast->DoubleTy.getAsOpaquePtr());
2139a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton        else if (bit_size == ast->getTypeSize(ast->LongDoubleTy))
214052f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(ast, ast->LongDoubleTy.getAsOpaquePtr());
2141a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton        else if (bit_size == ast->getTypeSize(ast->HalfTy))
214252f792329be5db8e38961350589e97e8f2823acdGreg Clayton            return ClangASTType(ast, ast->HalfTy.getAsOpaquePtr());
2143a9dc882693ef65ee3657b96f018fec3685d37282Greg Clayton    }
214452f792329be5db8e38961350589e97e8f2823acdGreg Clayton    return ClangASTType();
2145d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata}
2146d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granata
2147d44c9d31d23d0b44ce40325ad69226889a9638bcEnrico Granatabool
2148e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg ClaytonClangASTContext::GetCompleteDecl (clang::ASTContext *ast,
2149e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton                                  clang::Decl *decl)
2150e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton{
2151e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!decl)
2152e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
2153e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2154e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    ExternalASTSource *ast_source = ast->getExternalSource();
2155e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2156e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (!ast_source)
2157e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
2158e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2159e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    if (clang::TagDecl *tag_decl = llvm::dyn_cast<clang::TagDecl>(decl))
2160e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
21613356d4f89e85301e5ddec2301c75b0626d50703fGreg Clayton        if (tag_decl->isCompleteDefinition())
2162e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
2163e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2164e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!tag_decl->hasExternalLexicalStorage())
2165e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
2166e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2167e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(tag_decl);
2168e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2169e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return !tag_decl->getTypeForDecl()->isIncompleteType();
2170e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2171e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else if (clang::ObjCInterfaceDecl *objc_interface_decl = llvm::dyn_cast<clang::ObjCInterfaceDecl>(decl))
2172e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
21738f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        if (objc_interface_decl->getDefinition())
2174e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return true;
2175e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2176e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        if (!objc_interface_decl->hasExternalLexicalStorage())
2177e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton            return false;
2178e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2179e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        ast_source->CompleteType(objc_interface_decl);
2180e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
21818f2e392e8937aaf66f91201dc5f4190d61902c67Sean Callanan        return !objc_interface_decl->getTypeForDecl()->isIncompleteType();
2182e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2183e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    else
2184e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    {
2185e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton        return false;
2186e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton    }
2187e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton}
2188e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton
2189fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callananvoid
2190017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg ClaytonClangASTContext::SetMetadataAsUserID (const void *object,
2191a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                                      user_id_t user_id)
2192a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham{
2193a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    ClangASTMetadata meta_data;
2194a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    meta_data.SetUserID (user_id);
2195a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham    SetMetadata (object, meta_data);
2196a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham}
2197a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham
2198a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Inghamvoid
2199fafffe000eb4a3902ecefc82446d11e6838167c6Sean CallananClangASTContext::SetMetadata (clang::ASTContext *ast,
2200017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton                              const void *object,
2201a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                              ClangASTMetadata &metadata)
2202fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan{
2203fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    ClangExternalASTSourceCommon *external_source =
2204fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan        static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
2205fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
2206fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    if (external_source)
2207fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan        external_source->SetMetadata(object, metadata);
2208fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan}
2209fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
2210a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim InghamClangASTMetadata *
2211fafffe000eb4a3902ecefc82446d11e6838167c6Sean CallananClangASTContext::GetMetadata (clang::ASTContext *ast,
2212017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton                              const void *object)
2213fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan{
2214fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    ClangExternalASTSourceCommon *external_source =
2215fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan        static_cast<ClangExternalASTSourceCommon*>(ast->getExternalSource());
2216fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
2217fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    if (external_source && external_source->HasMetadata(object))
2218fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan        return external_source->GetMetadata(object);
2219fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan    else
2220a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham        return NULL;
2221fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan}
2222fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan
2223a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext *
2224a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::CXXMethodDecl *cxx_method_decl)
2225a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{
2226cbfc0ea71785f0affc7ea9ada6d344f822455d47Sean Callanan    return llvm::dyn_cast<clang::DeclContext>(cxx_method_decl);
2227a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton}
2228a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
2229a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Claytonclang::DeclContext *
2230a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg ClaytonClangASTContext::GetAsDeclContext (clang::ObjCMethodDecl *objc_method_decl)
2231a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton{
2232cbfc0ea71785f0affc7ea9ada6d344f822455d47Sean Callanan    return llvm::dyn_cast<clang::DeclContext>(objc_method_decl);
2233a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton}
2234a83f8779ac614263d92959d2338e6e9f08d8f9fbGreg Clayton
2235b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2236b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Claytonbool
2237b3a1a2bba41281ba56a99fe64887a8a04760784cGreg ClaytonClangASTContext::GetClassMethodInfoForDeclContext (clang::DeclContext *decl_ctx,
2238b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                   lldb::LanguageType &language,
2239b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                   bool &is_instance_method,
2240b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                                                   ConstString &language_object_name)
2241b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton{
2242b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    language_object_name.Clear();
2243b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    language = eLanguageTypeUnknown;
2244b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    is_instance_method = false;
2245b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2246b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    if (decl_ctx)
2247b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    {
2248b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        if (clang::CXXMethodDecl *method_decl = llvm::dyn_cast<clang::CXXMethodDecl>(decl_ctx))
2249b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        {
2250b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (method_decl->isStatic())
2251b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            {
2252b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                is_instance_method = false;
2253b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            }
2254b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            else
2255b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            {
2256b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                language_object_name.SetCString("this");
2257b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                is_instance_method = true;
2258b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            }
2259b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            language = eLanguageTypeC_plus_plus;
2260b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            return true;
2261b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        }
2262b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        else if (clang::ObjCMethodDecl *method_decl = llvm::dyn_cast<clang::ObjCMethodDecl>(decl_ctx))
2263b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        {
2264b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            // Both static and instance methods have a "self" object in objective C
2265b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            language_object_name.SetCString("self");
2266b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            if (method_decl->isInstanceMethod())
2267b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            {
2268b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                is_instance_method = true;
2269b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            }
2270b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            else
2271b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            {
2272b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton                is_instance_method = false;
2273b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            }
2274b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            language = eLanguageTypeObjC;
2275b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton            return true;
2276b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton        }
2277a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham        else if (clang::FunctionDecl *function_decl = llvm::dyn_cast<clang::FunctionDecl>(decl_ctx))
2278a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham        {
2279017c16aa483e6edabdbbee1bdcd1ce3f8e8a12d1Greg Clayton            ClangASTMetadata *metadata = GetMetadata (&decl_ctx->getParentASTContext(), function_decl);
2280a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham            if (metadata && metadata->HasObjectPtr())
2281a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham            {
2282a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                language_object_name.SetCString (metadata->GetObjectPtrName());
2283a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                language = eLanguageTypeObjC;
2284a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham                is_instance_method = true;
2285a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham            }
2286a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham            return true;
2287a32c5a5aa1fec0f9bc2a5b123f07ff6b8c979999Jim Ingham        }
2288b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    }
2289b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton    return false;
2290b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton}
2291b3a1a2bba41281ba56a99fe64887a8a04760784cGreg Clayton
2292