84 lines · c
1//===- NVPTXRegisterInfo.h - NVPTX Register Information Impl ----*- 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-exception6//7//===----------------------------------------------------------------------===//8//9// This file contains the NVPTX implementation of the TargetRegisterInfo class.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_NVPTX_NVPTXREGISTERINFO_H14#define LLVM_LIB_TARGET_NVPTX_NVPTXREGISTERINFO_H15 16#include "llvm/CodeGen/TargetRegisterInfo.h"17#include "llvm/Support/StringSaver.h"18#include <sstream>19 20#define GET_REGINFO_HEADER21#include "NVPTXGenRegisterInfo.inc"22 23namespace llvm {24class NVPTXRegisterInfo : public NVPTXGenRegisterInfo {25private:26 // Hold Strings that can be free'd all together with NVPTXRegisterInfo27 BumpPtrAllocator StrAlloc;28 UniqueStringSaver StrPool;29 // State for debug register mapping that can be mutated even through a const30 // pointer so that we can get the proper dwarf register encoding during ASM31 // emission.32 mutable DenseMap<uint64_t, uint64_t> debugRegisterMap;33 34public:35 NVPTXRegisterInfo();36 37 //------------------------------------------------------38 // Pure virtual functions from TargetRegisterInfo39 //------------------------------------------------------40 41 // NVPTX callee saved registers42 const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;43 44 BitVector getReservedRegs(const MachineFunction &MF) const override;45 46 bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj,47 unsigned FIOperandNum,48 RegScavenger *RS = nullptr) const override;49 50 Register getFrameRegister(const MachineFunction &MF) const override;51 Register getFrameLocalRegister(const MachineFunction &MF) const;52 53 UniqueStringSaver &getStrPool() const {54 return const_cast<UniqueStringSaver &>(StrPool);55 }56 57 const char *getName(unsigned RegNo) const {58 std::stringstream O;59 O << "reg" << RegNo;60 return getStrPool().save(O.str()).data();61 }62 63 // Manage the debugRegisterMap. PTX virtual registers for DebugInfo are64 // encoded using the names used in the emitted text of the PTX assembly. This65 // mapping must be managed during assembly emission.66 //67 // These are marked const because the interfaces used to access this68 // RegisterInfo object are all const, but we need to communicate some state69 // here, because the proper encoding for debug registers is available only70 // temporarily during ASM emission.71 void addToDebugRegisterMap(uint64_t preEncodedVirtualRegister,72 StringRef RegisterName) const;73 void clearDebugRegisterMap() const;74 int64_t getDwarfRegNum(MCRegister RegNum, bool isEH) const override;75 int64_t getDwarfRegNumForVirtReg(Register RegNum, bool isEH) const override;76};77 78StringRef getNVPTXRegClassName(const TargetRegisterClass *RC);79StringRef getNVPTXRegClassStr(const TargetRegisterClass *RC);80 81} // end namespace llvm82 83#endif84