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