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