17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- ASTCommon.cpp - Common stuff for ASTReader/ASTWriter----*- C++ -*-===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file defines common functions that both ASTReader and ASTWriter use. 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "ASTCommon.h" 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#include "clang/AST/DeclCXX.h" 165a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor#include "clang/AST/DeclObjC.h" 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/IdentifierTable.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Serialization/ASTDeserializationListener.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Give ASTDeserializationListener's VTable a home. 247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiASTDeserializationListener::~ASTDeserializationListener() { } 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeIdx 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiserialization::TypeIdxFromBuiltin(const BuiltinType *BT) { 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned ID = 0; 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (BT->getKind()) { 3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Void: 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_VOID_ID; 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Bool: 3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_BOOL_ID; 3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Char_U: 3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_CHAR_U_ID; 3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::UChar: 4087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_UCHAR_ID; 4187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 4287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::UShort: 4387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_USHORT_ID; 4487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 4587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::UInt: 4687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_UINT_ID; 4787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 4887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::ULong: 4987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_ULONG_ID; 5087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 5187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::ULongLong: 5287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_ULONGLONG_ID; 5387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::UInt128: 5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_UINT128_ID; 5687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 5787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Char_S: 5887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_CHAR_S_ID; 5987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 6087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::SChar: 6187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_SCHAR_ID; 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 6487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::WChar_U: 6587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_WCHAR_ID; 6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 6787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Short: 6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_SHORT_ID; 6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Int: 7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_INT_ID; 7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Long: 7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_LONG_ID; 7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 7687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::LongLong: 7787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_LONGLONG_ID; 7887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 7987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Int128: 8087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_INT128_ID; 8187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 8287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Half: 8387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_HALF_ID; 8487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 8587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Float: 8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_FLOAT_ID; 8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 8887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Double: 8987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_DOUBLE_ID; 9087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 9187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::LongDouble: 9287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_LONGDOUBLE_ID; 9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Float128: 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ID = PREDEF_TYPE_FLOAT128_ID; 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar break; 9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::NullPtr: 9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_NULLPTR_ID; 9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 10087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Char16: 10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_CHAR16_ID; 10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Char32: 10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_CHAR32_ID; 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Overload: 10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_OVERLOAD_ID; 10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::BoundMember: 11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_BOUND_MEMBER; 11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::PseudoObject: 11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_PSEUDO_OBJECT; 11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 11587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::Dependent: 11687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_DEPENDENT_ID; 11787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 11887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::UnknownAny: 11987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_UNKNOWN_ANY; 12087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ARCUnbridgedCast: 12287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_ARC_UNBRIDGED_CAST; 12387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 12487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::ObjCId: 12587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_OBJC_ID; 12687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 12787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::ObjCClass: 12887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_OBJC_CLASS; 12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::ObjCSel: 13187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_OBJC_SEL; 13287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \ 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case BuiltinType::Id: \ 1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ID = PREDEF_TYPE_##Id##_ID; \ 13687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Basic/OpenCLImageTypes.def" 13887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLSampler: 13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_SAMPLER_ID; 14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLEvent: 14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_EVENT_ID; 14387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLClkEvent: 14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_CLK_EVENT_ID; 14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLQueue: 14887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_QUEUE_ID; 14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 15087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLNDRange: 15187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_NDRANGE_ID; 15287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OCLReserveID: 15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_RESERVE_ID_ID; 15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 1567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::BuiltinFn: 15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_BUILTIN_FN; 15887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 15987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case BuiltinType::OMPArraySection: 16087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar ID = PREDEF_TYPE_OMP_ARRAY_SECTION; 16187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar break; 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TypeIdx(ID); 1657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiunsigned serialization::ComputeHash(Selector Sel) { 1687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = Sel.getNumArgs(); 1697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N == 0) 1707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++N; 1717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned R = 5381; 1727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) 1737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IdentifierInfo *II = Sel.getIdentifierInfoForSlot(I)) 1747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei R = llvm::HashString(II->getName(), R); 1757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return R; 1767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1775a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 178e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregorconst DeclContext * 179e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregorserialization::getDefinitiveDeclContext(const DeclContext *DC) { 1805a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor switch (DC->getDeclKind()) { 1815a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // These entities may have multiple definitions. 1825a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::TranslationUnit: 1833ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case Decl::ExternCContext: 1845a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::Namespace: 1855a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::LinkageSpec: 1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1875a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 1885a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // C/C++ tag types can only be defined in one place. 1895a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::Enum: 1905a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::Record: 1915a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor if (const TagDecl *Def = cast<TagDecl>(DC)->getDefinition()) 1925a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor return Def; 1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 1945a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 1955a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // FIXME: These can be defined in one place... except special member 1965a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // functions and out-of-line definitions. 1975a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::CXXRecord: 1985a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ClassTemplateSpecialization: 1995a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ClassTemplatePartialSpecialization: 2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2015a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 2025a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // Each function, method, and block declaration is its own DeclContext. 2035a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::Function: 2045a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::CXXMethod: 2055a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::CXXConstructor: 2065a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::CXXDestructor: 2075a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::CXXConversion: 2085a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCMethod: 2095a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::Block: 2106afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj case Decl::Captured: 2115a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // Objective C categories, category implementations, and class 2125a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // implementations can only be defined in one place. 2135a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCCategory: 2145a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCCategoryImpl: 2155a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCImplementation: 216e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor return DC; 2175a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 2185a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCProtocol: 2195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor if (const ObjCProtocolDecl *Def 2205a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor = cast<ObjCProtocolDecl>(DC)->getDefinition()) 2215a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor return Def; 2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2235a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 2245a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // FIXME: These are defined in one place, but properties in class extensions 2255a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // end up being back-patched into the main interface. See 2265a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor // Sema::HandlePropertyInClassExtension for the offending code. 2275a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor case Decl::ObjCInterface: 2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2305a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor default: 2315a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor llvm_unreachable("Unhandled DeclContext in AST reader"); 2325a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor } 2335a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 234e0d2066ab8812cbaa16d79af5f2c9fb6bd52d2e2Douglas Gregor llvm_unreachable("Unhandled decl kind"); 2359cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor} 2369cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor 2379cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregorbool serialization::isRedeclarableDeclKind(unsigned Kind) { 2389cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor switch (static_cast<Decl::Kind>(Kind)) { 2393ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case Decl::TranslationUnit: 2403ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar case Decl::ExternCContext: 2413ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // Special case of a "merged" declaration. 2423ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar return true; 2433ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar 2449cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Namespace: 245176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case Decl::NamespaceAlias: 2469cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Typedef: 2479cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::TypeAlias: 2489cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Enum: 2499cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Record: 2509cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::CXXRecord: 2519cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ClassTemplateSpecialization: 2529cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ClassTemplatePartialSpecialization: 253ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo case Decl::VarTemplateSpecialization: 254ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo case Decl::VarTemplatePartialSpecialization: 2559cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Function: 2569cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::CXXMethod: 2579cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::CXXConstructor: 2589cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::CXXDestructor: 2599cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::CXXConversion: 260f06a2893bc9778857295c64ee32b4a899a338480Richard Smith case Decl::UsingShadow: 2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Decl::ConstructorUsingShadow: 2629cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Var: 2639cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::FunctionTemplate: 2649cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ClassTemplate: 265ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo case Decl::VarTemplate: 2669cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::TypeAliasTemplate: 2679cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCProtocol: 2689cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCInterface: 269684aa73192d92850a926870be62a1787eb5b7ed9Michael Han case Decl::Empty: 2709cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor return true; 2719cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor 2729cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor // Never redeclarable. 2739cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::UsingDirective: 2749cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Label: 2759cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::UnresolvedUsingTypename: 2769cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::TemplateTypeParm: 2779cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::EnumConstant: 2789cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::UnresolvedUsingValue: 2799cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::IndirectField: 2809cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Field: 28176da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall case Decl::MSProperty: 2829cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCIvar: 2839cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCAtDefsField: 2849cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::NonTypeTemplateParm: 2859cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::TemplateTemplateParm: 2869cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Using: 2879cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCMethod: 2889cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCCategory: 2899cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCCategoryImpl: 2909cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCImplementation: 2919cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCProperty: 2929cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCCompatibleAlias: 2939cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::LinkageSpec: 2949cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ObjCPropertyImpl: 2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Decl::PragmaComment: 2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Decl::PragmaDetectMismatch: 2979cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::FileScopeAsm: 2989cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::AccessSpec: 2999cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Friend: 3009cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::FriendTemplate: 3019cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::StaticAssert: 3029cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Block: 3036afcf8875d4e447645cd7bf3733dd8e2eb8455dcTareq A. Siraj case Decl::Captured: 3049cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::ClassScopeFunctionSpecialization: 3059cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor case Decl::Import: 306c640058aa7f224a71ce3b1d2601d84e1b57f82d3Alexey Bataev case Decl::OMPThreadPrivate: 3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Decl::OMPCapturedExpr: 3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar case Decl::OMPDeclareReduction: 30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case Decl::BuiltinTemplate: 3109cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor return false; 311176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 312176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // These indirectly derive from Redeclarable<T> but are not actually 313176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // redeclarable. 314176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case Decl::ImplicitParam: 315176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines case Decl::ParmVar: 31687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar case Decl::ObjCTypeParam: 317176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 3189cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor } 3195a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor 3209cfdc03fe7abab2f413bb7fdc59e9be15c382a74Douglas Gregor llvm_unreachable("Unhandled declaration kind"); 3215a04f9fc2b000da98fd903c8156034304bdadb2fDouglas Gregor} 322176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 323176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesbool serialization::needsAnonymousDeclarationNumber(const NamedDecl *D) { 3240e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Friend declarations in dependent contexts aren't anonymous in the usual 3250e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // sense, but they cannot be found by name lookup in their semantic context 3260e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // (or indeed in any context), so we treat them as anonymous. 3270e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // 3280e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // This doesn't apply to friend tag decls; Sema makes those available to name 3290e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // lookup in the surrounding context. 3300e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (D->getFriendObjectKind() && 3310e2c34f92f00628d48968dfea096d36381f494cbStephen Hines D->getLexicalDeclContext()->isDependentContext() && !isa<TagDecl>(D)) { 3320e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // For function templates and class templates, the template is numbered and 3330e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // not its pattern. 3340e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (auto *FD = dyn_cast<FunctionDecl>(D)) 3350e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return !FD->getDescribedFunctionTemplate(); 3360e2c34f92f00628d48968dfea096d36381f494cbStephen Hines if (auto *RD = dyn_cast<CXXRecordDecl>(D)) 3370e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return !RD->getDescribedClassTemplate(); 3380e2c34f92f00628d48968dfea096d36381f494cbStephen Hines return true; 3390e2c34f92f00628d48968dfea096d36381f494cbStephen Hines } 3400e2c34f92f00628d48968dfea096d36381f494cbStephen Hines 3410e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // Otherwise, we only care about anonymous class members. 342176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines if (D->getDeclName() || !isa<CXXRecordDecl>(D->getLexicalDeclContext())) 343176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return false; 344176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return isa<TagDecl>(D) || isa<FieldDecl>(D); 345176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 347