1 //===--- MangleNumberingContext.cpp - Context for mangling numbers --------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the LambdaMangleContext class, which keeps track of 11 // the Itanium C++ ABI mangling numbers for lambda expressions. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "clang/AST/MangleNumberingContext.h" 16 #include "clang/AST/ASTContext.h" 17 #include "clang/AST/DeclCXX.h" 18 19 using namespace clang; 20 21 unsigned getManglingNumber(const CXXMethodDecl * CallOperator)22MangleNumberingContext::getManglingNumber(const CXXMethodDecl *CallOperator) { 23 const FunctionProtoType *Proto 24 = CallOperator->getType()->getAs<FunctionProtoType>(); 25 ASTContext &Context = CallOperator->getASTContext(); 26 27 QualType Key = Context.getFunctionType(Context.VoidTy, Proto->getArgTypes(), 28 FunctionProtoType::ExtProtoInfo()); 29 Key = Context.getCanonicalType(Key); 30 return ++ManglingNumbers[Key->castAs<FunctionProtoType>()]; 31 } 32 33 unsigned getManglingNumber(const BlockDecl * BD)34MangleNumberingContext::getManglingNumber(const BlockDecl *BD) { 35 // FIXME: Compute a BlockPointerType? Not obvious how. 36 const Type *Ty = 0; 37 return ++ManglingNumbers[Ty]; 38 } 39 40 unsigned getManglingNumber(const VarDecl * VD)41MangleNumberingContext::getManglingNumber(const VarDecl *VD) { 42 return ++VarManglingNumbers[VD->getIdentifier()]; 43 } 44 45 unsigned getManglingNumber(const TagDecl * TD)46MangleNumberingContext::getManglingNumber(const TagDecl *TD) { 47 return ++TagManglingNumbers[TD->getIdentifier()]; 48 } 49