clang API Documentation
00001 //===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===// 00002 // 00003 // The LLVM Compiler Infrastructure 00004 // 00005 // This file is distributed under the University of Illinois Open Source 00006 // License. See LICENSE.TXT for details. 00007 // 00008 //===----------------------------------------------------------------------===// 00009 // 00010 // This file defines common functions that both ASTReader and ASTWriter use. 00011 // 00012 //===----------------------------------------------------------------------===// 00013 00014 #include "ASTCommon.h" 00015 #include "clang/Serialization/ASTDeserializationListener.h" 00016 #include "clang/Basic/IdentifierTable.h" 00017 #include "llvm/ADT/StringExtras.h" 00018 00019 using namespace clang; 00020 00021 // Give ASTDeserializationListener's VTable a home. 00022 ASTDeserializationListener::~ASTDeserializationListener() { } 00023 00024 serialization::TypeIdx 00025 serialization::TypeIdxFromBuiltin(const BuiltinType *BT) { 00026 unsigned ID = 0; 00027 switch (BT->getKind()) { 00028 case BuiltinType::Void: ID = PREDEF_TYPE_VOID_ID; break; 00029 case BuiltinType::Bool: ID = PREDEF_TYPE_BOOL_ID; break; 00030 case BuiltinType::Char_U: ID = PREDEF_TYPE_CHAR_U_ID; break; 00031 case BuiltinType::UChar: ID = PREDEF_TYPE_UCHAR_ID; break; 00032 case BuiltinType::UShort: ID = PREDEF_TYPE_USHORT_ID; break; 00033 case BuiltinType::UInt: ID = PREDEF_TYPE_UINT_ID; break; 00034 case BuiltinType::ULong: ID = PREDEF_TYPE_ULONG_ID; break; 00035 case BuiltinType::ULongLong: ID = PREDEF_TYPE_ULONGLONG_ID; break; 00036 case BuiltinType::UInt128: ID = PREDEF_TYPE_UINT128_ID; break; 00037 case BuiltinType::Char_S: ID = PREDEF_TYPE_CHAR_S_ID; break; 00038 case BuiltinType::SChar: ID = PREDEF_TYPE_SCHAR_ID; break; 00039 case BuiltinType::WChar_S: 00040 case BuiltinType::WChar_U: ID = PREDEF_TYPE_WCHAR_ID; break; 00041 case BuiltinType::Short: ID = PREDEF_TYPE_SHORT_ID; break; 00042 case BuiltinType::Int: ID = PREDEF_TYPE_INT_ID; break; 00043 case BuiltinType::Long: ID = PREDEF_TYPE_LONG_ID; break; 00044 case BuiltinType::LongLong: ID = PREDEF_TYPE_LONGLONG_ID; break; 00045 case BuiltinType::Int128: ID = PREDEF_TYPE_INT128_ID; break; 00046 case BuiltinType::Half: ID = PREDEF_TYPE_HALF_ID; break; 00047 case BuiltinType::Float: ID = PREDEF_TYPE_FLOAT_ID; break; 00048 case BuiltinType::Double: ID = PREDEF_TYPE_DOUBLE_ID; break; 00049 case BuiltinType::LongDouble: ID = PREDEF_TYPE_LONGDOUBLE_ID; break; 00050 case BuiltinType::NullPtr: ID = PREDEF_TYPE_NULLPTR_ID; break; 00051 case BuiltinType::Char16: ID = PREDEF_TYPE_CHAR16_ID; break; 00052 case BuiltinType::Char32: ID = PREDEF_TYPE_CHAR32_ID; break; 00053 case BuiltinType::Overload: ID = PREDEF_TYPE_OVERLOAD_ID; break; 00054 case BuiltinType::BoundMember:ID = PREDEF_TYPE_BOUND_MEMBER; break; 00055 case BuiltinType::PseudoObject:ID = PREDEF_TYPE_PSEUDO_OBJECT;break; 00056 case BuiltinType::Dependent: ID = PREDEF_TYPE_DEPENDENT_ID; break; 00057 case BuiltinType::UnknownAny: ID = PREDEF_TYPE_UNKNOWN_ANY; break; 00058 case BuiltinType::ARCUnbridgedCast: 00059 ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; break; 00060 case BuiltinType::ObjCId: ID = PREDEF_TYPE_OBJC_ID; break; 00061 case BuiltinType::ObjCClass: ID = PREDEF_TYPE_OBJC_CLASS; break; 00062 case BuiltinType::ObjCSel: ID = PREDEF_TYPE_OBJC_SEL; break; 00063 } 00064 00065 return TypeIdx(ID); 00066 } 00067 00068 unsigned serialization::ComputeHash(Selector Sel) { 00069 unsigned N = Sel.getNumArgs(); 00070 if (N == 0) 00071 ++N; 00072 unsigned R = 5381; 00073 for (unsigned I = 0; I != N; ++I) 00074 if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I)) 00075 R = llvm::HashString(II->getName(), R); 00076 return R; 00077 }