1//=== MangleNumberingContext.h - Context for mangling numbers ---*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the LambdaBlockMangleContext interface, which keeps track 10// of the Itanium C++ ABI mangling numbers for lambda expressions and block 11// literals. 12// 13//===----------------------------------------------------------------------===// 14#ifndef LLVM_CLANG_AST_MANGLENUMBERINGCONTEXT_H 15#define LLVM_CLANG_AST_MANGLENUMBERINGCONTEXT_H 16 17#include "clang/Basic/LLVM.h" 18#include "llvm/ADT/IntrusiveRefCntPtr.h" 19 20namespace clang { 21 22class BlockDecl; 23class CXXMethodDecl; 24class TagDecl; 25class VarDecl; 26 27/// Keeps track of the mangled names of lambda expressions and block 28/// literals within a particular context. 29class MangleNumberingContext { 30public: 31 virtual ~MangleNumberingContext() {} 32 33 /// Retrieve the mangling number of a new lambda expression with the 34 /// given call operator within this context. 35 virtual unsigned getManglingNumber(const CXXMethodDecl *CallOperator) = 0; 36 37 /// Retrieve the mangling number of a new block literal within this 38 /// context. 39 virtual unsigned getManglingNumber(const BlockDecl *BD) = 0; 40 41 /// Static locals are numbered by source order. 42 virtual unsigned getStaticLocalNumber(const VarDecl *VD) = 0; 43 44 /// Retrieve the mangling number of a static local variable within 45 /// this context. 46 virtual unsigned getManglingNumber(const VarDecl *VD, 47 unsigned MSLocalManglingNumber) = 0; 48 49 /// Retrieve the mangling number of a static local variable within 50 /// this context. 51 virtual unsigned getManglingNumber(const TagDecl *TD, 52 unsigned MSLocalManglingNumber) = 0; 53 54 /// Retrieve the mangling number of a new lambda expression with the 55 /// given call operator within the device context. No device number is 56 /// assigned if there's no device numbering context is associated. 57 virtual unsigned getDeviceManglingNumber(const CXXMethodDecl *) { return 0; } 58}; 59 60} // end namespace clang 61#endif 62