107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman//=== MangleNumberingContext.h - Context for mangling numbers ---*- C++ -*-===//
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//
1007369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman//  This file defines the LambdaBlockMangleContext interface, which keeps track
1107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman//  of the Itanium C++ ABI mangling numbers for lambda expressions and block
1207369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman//  literals.
139e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor//
149e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor//===----------------------------------------------------------------------===//
1507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman#ifndef LLVM_CLANG_MANGLENUMBERINGCONTEXT_H
1607369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman#define LLVM_CLANG_MANGLENUMBERINGCONTEXT_H
179e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
18cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko#include "clang/Basic/LLVM.h"
199e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor#include "llvm/ADT/DenseMap.h"
20b6ad9b163d50827d4cd7eccadb20432cd3c089d5Argyrios Kyrtzidis#include "llvm/ADT/IntrusiveRefCntPtr.h"
219e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
229e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregornamespace clang {
239e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
2407369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanclass BlockDecl;
259e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorclass CXXMethodDecl;
265e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedmanclass IdentifierInfo;
275e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedmanclass TagDecl;
2807369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanclass Type;
295e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedmanclass VarDecl;
309e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
3107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman/// \brief Keeps track of the mangled names of lambda expressions and block
3207369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman/// literals within a particular context.
3307369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanclass MangleNumberingContext
3407369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman    : public RefCountedBase<MangleNumberingContext> {
3507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman  llvm::DenseMap<const Type *, unsigned> ManglingNumbers;
365e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman
379e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregorpublic:
38942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner  virtual ~MangleNumberingContext() {}
39942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner
409e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor  /// \brief Retrieve the mangling number of a new lambda expression with the
4107369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman  /// given call operator within this context.
425e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  unsigned getManglingNumber(const CXXMethodDecl *CallOperator);
4307369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman
4407369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman  /// \brief Retrieve the mangling number of a new block literal within this
4507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman  /// context.
465e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  unsigned getManglingNumber(const BlockDecl *BD);
475e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  /// Static locals are numbered by source order.
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  unsigned getStaticLocalNumber(const VarDecl *VD);
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
515e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  /// \brief Retrieve the mangling number of a static local variable within
525e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  /// this context.
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual unsigned getManglingNumber(const VarDecl *VD,
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                     unsigned MSLocalManglingNumber) = 0;
555e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman
565e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  /// \brief Retrieve the mangling number of a static local variable within
575e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman  /// this context.
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  virtual unsigned getManglingNumber(const TagDecl *TD,
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                     unsigned MSLocalManglingNumber) = 0;
609e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor};
619e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor
629e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor} // end namespace clang
639e8c92a9c9b949bbb0408fbbd9a58e34894b6efcDouglas Gregor#endif
64