PTXMFInfoExtract.cpp revision ad83c1d3837d2a7786627c08df1208d1cf15a562
1//===-- PTXMFInfoExtract.cpp - Extract PTX machine function info ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines an information extractor for PTX machine functions. 11// 12//===----------------------------------------------------------------------===// 13 14#define DEBUG_TYPE "ptx-mf-info-extract" 15 16#include "PTX.h" 17#include "PTXTargetMachine.h" 18#include "PTXMachineFunctionInfo.h" 19#include "llvm/CodeGen/MachineFunctionPass.h" 20#include "llvm/CodeGen/MachineRegisterInfo.h" 21#include "llvm/Support/Debug.h" 22#include "llvm/Support/ErrorHandling.h" 23#include "llvm/Support/raw_ostream.h" 24 25// NOTE: PTXMFInfoExtract must after register allocation! 26 27namespace llvm { 28 /// PTXMFInfoExtract - PTX specific code to extract of PTX machine 29 /// function information for PTXAsmPrinter 30 /// 31 class PTXMFInfoExtract : public MachineFunctionPass { 32 private: 33 static char ID; 34 35 public: 36 PTXMFInfoExtract(PTXTargetMachine &TM, CodeGenOpt::Level OptLevel) 37 : MachineFunctionPass(ID) {} 38 39 virtual bool runOnMachineFunction(MachineFunction &MF); 40 41 virtual const char *getPassName() const { 42 return "PTX Machine Function Info Extractor"; 43 } 44 }; // class PTXMFInfoExtract 45} // namespace llvm 46 47using namespace llvm; 48 49char PTXMFInfoExtract::ID = 0; 50 51bool PTXMFInfoExtract::runOnMachineFunction(MachineFunction &MF) { 52 PTXMachineFunctionInfo *MFI = MF.getInfo<PTXMachineFunctionInfo>(); 53 MachineRegisterInfo &MRI = MF.getRegInfo(); 54 55 DEBUG(dbgs() << "******** PTX FUNCTION LOCAL VAR REG DEF ********\n"); 56 57 unsigned retreg = MFI->retReg(); 58 59 DEBUG(dbgs() 60 << "PTX::NoRegister == " << PTX::NoRegister << "\n" 61 << "PTX::NUM_TARGET_REGS == " << PTX::NUM_TARGET_REGS << "\n"); 62 63 DEBUG(for (unsigned reg = PTX::NoRegister + 1; 64 reg < PTX::NUM_TARGET_REGS; ++reg) 65 if (MRI.isPhysRegUsed(reg)) 66 dbgs() << "Used Reg: " << reg << "\n";); 67 68 // FIXME: This is a slow linear scanning 69 for (unsigned reg = PTX::NoRegister + 1; reg < PTX::NUM_TARGET_REGS; ++reg) 70 if (MRI.isPhysRegUsed(reg) && reg != retreg && !MFI->isArgReg(reg)) 71 MFI->addLocalVarReg(reg); 72 73 // Notify MachineFunctionInfo that I've done adding local var reg 74 MFI->doneAddLocalVar(); 75 76 DEBUG(dbgs() << "Return Reg: " << retreg << "\n"); 77 78 DEBUG(for (PTXMachineFunctionInfo::reg_iterator 79 i = MFI->argRegBegin(), e = MFI->argRegEnd(); 80 i != e; ++i) 81 dbgs() << "Arg Reg: " << *i << "\n";); 82 83 DEBUG(for (PTXMachineFunctionInfo::reg_iterator 84 i = MFI->localVarRegBegin(), e = MFI->localVarRegEnd(); 85 i != e; ++i) 86 dbgs() << "Local Var Reg: " << *i << "\n";); 87 88 return false; 89} 90 91FunctionPass *llvm::createPTXMFInfoExtract(PTXTargetMachine &TM, 92 CodeGenOpt::Level OptLevel) { 93 return new PTXMFInfoExtract(TM, OptLevel); 94} 95