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 20 namespace llvm { 21 class NVPTXMachineFunctionInfo : public MachineFunctionInfo { 22 private: 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 27 public: 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>(*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(Symbol.str()); 47 return ImageHandleList.size()-1; 48 } 49 50 /// Returns the symbol name at the given index. 51 StringRef getImageHandleSymbol(unsigned Idx) const { 52 assert(ImageHandleList.size() > Idx && "Bad index"); 53 return ImageHandleList[Idx]; 54 } 55 56 /// Check if the symbol has a mapping. Having a mapping means the handle is 57 /// replaced with a reference 58 bool checkImageHandleSymbol(StringRef Symbol) const { 59 return ImageHandleList.end() != 60 std::find(ImageHandleList.begin(), ImageHandleList.end(), Symbol); 61 } 62 }; 63 } 64 65 #endif 66