1//===-- NVPTXMachineFunctionInfo.h - NVPTX-specific Function Info --------===//
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 class is attached to a MachineFunction instance and tracks target-
10// dependent information
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXMACHINEFUNCTIONINFO_H
15#define LLVM_LIB_TARGET_NVPTX_NVPTXMACHINEFUNCTIONINFO_H
16
17#include "llvm/ADT/StringRef.h"
18#include "llvm/CodeGen/MachineFunction.h"
19
20namespace llvm {
21class NVPTXMachineFunctionInfo : public MachineFunctionInfo {
22private:
23 /// Stores a mapping from index to symbol name for image handles that are
24 /// replaced with image references
25 SmallVector<std::string, 8> ImageHandleList;
26
27public:
28 NVPTXMachineFunctionInfo(const Function &F, const TargetSubtargetInfo *STI) {}
29
30 MachineFunctionInfo *
31 clone(BumpPtrAllocator &Allocator, MachineFunction &DestMF,
32 const DenseMap<MachineBasicBlock *, MachineBasicBlock *> &Src2DstMBB)
33 const override {
34 return DestMF.cloneInfo<NVPTXMachineFunctionInfo>(Old: *this);
35 }
36
37 /// Returns the index for the symbol \p Symbol. If the symbol was previously,
38 /// added, the same index is returned. Otherwise, the symbol is added and the
39 /// new index is returned.
40 unsigned getImageHandleSymbolIndex(StringRef Symbol) {
41 // Is the symbol already present?
42 for (unsigned i = 0, e = ImageHandleList.size(); i != e; ++i)
43 if (ImageHandleList[i] == Symbol)
44 return i;
45 // Nope, insert it
46 ImageHandleList.push_back(Elt: Symbol.str());
47 return ImageHandleList.size()-1;
48 }
49
50 /// Check if the symbol has a mapping. Having a mapping means the handle is
51 /// replaced with a reference
52 bool checkImageHandleSymbol(StringRef Symbol) const {
53 return llvm::is_contained(Range: ImageHandleList, Element: Symbol);
54 }
55};
56}
57
58#endif
59