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 ¶m_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