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