107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman//===--- MangleNumberingContext.cpp - Context for mangling numbers --------===// 29e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// 39e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// The LLVM Compiler Infrastructure 49e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// 59e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// This file is distributed under the University of Illinois Open Source 69e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// License. See LICENSE.TXT for details. 79e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// 89e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor//===----------------------------------------------------------------------===// 99e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// 109e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// This file defines the LambdaMangleContext class, which keeps track of 119e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// the Itanium C++ ABI mangling numbers for lambda expressions. 129e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor// 139e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor//===----------------------------------------------------------------------===// 14478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer 1507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman#include "clang/AST/MangleNumberingContext.h" 16478851c3ed6bd784e7377dffd8e57b200c1b9ba9Benjamin Kramer#include "clang/AST/ASTContext.h" 179e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor#include "clang/AST/DeclCXX.h" 189e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 199e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorusing namespace clang; 209e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor 2107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanunsigned 225e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli FriedmanMangleNumberingContext::getManglingNumber(const CXXMethodDecl *CallOperator) { 239e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor const FunctionProtoType *Proto 249e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor = CallOperator->getType()->getAs<FunctionProtoType>(); 259e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor ASTContext &Context = CallOperator->getASTContext(); 260567a79130a251bf464ce21ecf3f8b9fb5207900Reid Kleckner 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines QualType Key = Context.getFunctionType(Context.VoidTy, Proto->getParamTypes(), 280567a79130a251bf464ce21ecf3f8b9fb5207900Reid Kleckner FunctionProtoType::ExtProtoInfo()); 299e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor Key = Context.getCanonicalType(Key); 309e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor return ++ManglingNumbers[Key->castAs<FunctionProtoType>()]; 319e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} 3207369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman 3307369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanunsigned 345e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli FriedmanMangleNumberingContext::getManglingNumber(const BlockDecl *BD) { 3507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman // FIXME: Compute a BlockPointerType? Not obvious how. 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Type *Ty = nullptr; 3707369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman return ++ManglingNumbers[Ty]; 3807369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman} 395e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman 405e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedmanunsigned 41651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMangleNumberingContext::getStaticLocalNumber(const VarDecl *VD) { 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // FIXME: Compute a BlockPointerType? Not obvious how. 436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const Type *Ty = nullptr; 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return ++ManglingNumbers[Ty]; 455e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman} 46