MangleNumberingContext.h revision 942f9fe11d3a9583eef6bc4ca2549b1f0d1694da
1//=== MangleNumberingContext.h - Context for mangling numbers ---*- C++ -*-===// 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 LambdaBlockMangleContext interface, which keeps track 11// of the Itanium C++ ABI mangling numbers for lambda expressions and block 12// literals. 13// 14//===----------------------------------------------------------------------===// 15#ifndef LLVM_CLANG_MANGLENUMBERINGCONTEXT_H 16#define LLVM_CLANG_MANGLENUMBERINGCONTEXT_H 17 18#include "clang/Basic/LLVM.h" 19#include "llvm/ADT/DenseMap.h" 20#include "llvm/ADT/IntrusiveRefCntPtr.h" 21 22namespace clang { 23 24class BlockDecl; 25class CXXMethodDecl; 26class IdentifierInfo; 27class TagDecl; 28class Type; 29class VarDecl; 30 31/// \brief Keeps track of the mangled names of lambda expressions and block 32/// literals within a particular context. 33class MangleNumberingContext 34 : public RefCountedBase<MangleNumberingContext> { 35 llvm::DenseMap<const Type *, unsigned> ManglingNumbers; 36 llvm::DenseMap<IdentifierInfo*, unsigned> TagManglingNumbers; 37 38public: 39 virtual ~MangleNumberingContext() {} 40 41 /// \brief Retrieve the mangling number of a new lambda expression with the 42 /// given call operator within this context. 43 unsigned getManglingNumber(const CXXMethodDecl *CallOperator); 44 45 /// \brief Retrieve the mangling number of a new block literal within this 46 /// context. 47 unsigned getManglingNumber(const BlockDecl *BD); 48 49 /// \brief Retrieve the mangling number of a static local variable within 50 /// this context. 51 virtual unsigned getManglingNumber(const VarDecl *VD) = 0; 52 53 /// \brief Retrieve the mangling number of a static local variable within 54 /// this context. 55 unsigned getManglingNumber(const TagDecl *TD); 56}; 57 58} // end namespace clang 59#endif 60