119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- PTXMFInfoExtract.cpp - Extract PTX machine function info ----------===// 219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// The LLVM Compiler Infrastructure 419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source 619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details. 719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file defines an information extractor for PTX machine functions. 1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// 1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===// 1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define DEBUG_TYPE "ptx-mf-info-extract" 1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTX.h" 1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTXTargetMachine.h" 1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "PTXMachineFunctionInfo.h" 1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineFunctionPass.h" 2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/CodeGen/MachineRegisterInfo.h" 2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/Debug.h" 2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/ErrorHandling.h" 2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h" 2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// NOTE: PTXMFInfoExtract must after register allocation! 2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm { 2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// PTXMFInfoExtract - PTX specific code to extract of PTX machine 2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// function information for PTXAsmPrinter 3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman /// 3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman class PTXMFInfoExtract : public MachineFunctionPass { 3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman private: 3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman static char ID; 3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman public: 3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXMFInfoExtract(PTXTargetMachine &TM, CodeGenOpt::Level OptLevel) 3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman : MachineFunctionPass(ID) {} 3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman virtual bool runOnMachineFunction(MachineFunction &MF); 4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman virtual const char *getPassName() const { 4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return "PTX Machine Function Info Extractor"; 4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman }; // class PTXMFInfoExtract 4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // namespace llvm 4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm; 4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar PTXMFInfoExtract::ID = 0; 5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanbool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) { 5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>(); 5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MachineRegisterInfo &MRI = MF.getRegInfo(); 5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman // Generate list of all virtual registers used in this function 5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman for (unsigned i = 0; i < MRI.getNumVirtRegs(); ++i) { 5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman unsigned Reg = TargetRegisterInfo::index2VirtReg(i); 5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman const TargetRegisterClass *TRC = MRI.getRegClass(Reg); 5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman MFI->addVirtualRegister(TRC, Reg); 6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman } 6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return false; 6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman 6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createPTXMFInfoExtract(PTXTargetMachine &TM, 6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman CodeGenOpt::Level OptLevel) { 6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman return new PTXMFInfoExtract(TM, OptLevel); 6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} 69