[llvm-commits] [PATCH] Dump with LI Indices

Evan Cheng evan.cheng at apple.com
Sat Aug 1 17:57:15 PDT 2009


Do we really need Dump.h? Since it's Machine specific, perhaps it's ok  
just put it in MachineFunction.h?

Evan

On Jul 30, 2009, at 3:10 PM, David Greene wrote:

> Here's a repost of a patch to dump LiveInterval indices when
> calling print on a MachineFunction.
>
> I'm sure there are changes that have or will be requested that
> I've long since forgotten.  :)
>
> Feedback needed.
>
>                                  -Dave
>
> Index: include/llvm/CodeGen/LiveIntervalAnalysis.h
> ===================================================================
> --- include/llvm/CodeGen/LiveIntervalAnalysis.h	(revision 77464)
> +++ include/llvm/CodeGen/LiveIntervalAnalysis.h	(working copy)
> @@ -538,6 +538,37 @@
>     void printRegName(unsigned reg) const;
>   };
>
> +  /// IntervalPrefixPrinter - Print live interval indices before each
> +  /// instruction.
> +  class IntervalPrefixPrinter : public PrefixPrinter {
> +  private:
> +    const LiveIntervals &liinfo;
> +
> +  public:
> +    IntervalPrefixPrinter(const LiveIntervals &lii)
> +        : liinfo(lii) {};
> +
> +    // We need null implementations of the other virtual functions to
> +    // avoid warnings about hidden virtual functions.
> +
> +    raw_ostream &operator()(raw_ostream &out,
> +                            const MachineBasicBlock &instr) const {
> +      return out;
> +    }
> +
> +    raw_ostream &operator()(raw_ostream &out,
> +                            const MachineInstr &instr) const;
> +
> +    std::ostream &operator()(std::ostream &out,
> +                             const MachineBasicBlock &instr) const {
> +      return out;
> +    }
> +
> +    std::ostream &operator()(std::ostream &out,
> +                             const MachineInstr &instr) const {
> +      return out;
> +    }
> +  };
> } // End llvm namespace
>
> #endif
> Index: include/llvm/CodeGen/MachineBasicBlock.h
> ===================================================================
> --- include/llvm/CodeGen/MachineBasicBlock.h	(revision 77464)
> +++ include/llvm/CodeGen/MachineBasicBlock.h	(working copy)
> @@ -16,6 +16,7 @@
>
> #include "llvm/CodeGen/MachineInstr.h"
> #include "llvm/ADT/GraphTraits.h"
> +#include "llvm/Support/Dump.h"
>
> namespace llvm {
>
> @@ -310,10 +311,18 @@
>
>   // Debugging methods.
>   void dump() const;
> -  void print(std::ostream &OS) const;
> -  void print(std::ostream *OS) const { if (OS) print(*OS); }
> -  void print(raw_ostream &OS) const;
> -  void print(raw_ostream *OS) const { if (OS) print(*OS); }
> +  void print(std::ostream &OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const;
> +  void print(std::ostream *OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const {
> +    if (OS) print(*OS, prefix);
> +  }
> +  void print(raw_ostream &OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const;
> +  void print(raw_ostream *OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const {
> +    if (OS) print(*OS, prefix);
> +  }
>
>   /// getNumber - MachineBasicBlocks are uniquely numbered at the  
> function
>   /// level, unless they're not in a MachineFunction yet, in which  
> case this
> Index: include/llvm/CodeGen/MachineFunction.h
> ===================================================================
> --- include/llvm/CodeGen/MachineFunction.h	(revision 77464)
> +++ include/llvm/CodeGen/MachineFunction.h	(working copy)
> @@ -20,6 +20,7 @@
>
> #include "llvm/ADT/ilist.h"
> #include "llvm/Support/DebugLoc.h"
> +#include "llvm/Support/Dump.h"
> #include "llvm/CodeGen/MachineBasicBlock.h"
> #include "llvm/Support/Annotation.h"
> #include "llvm/Support/Allocator.h"
> @@ -207,8 +208,12 @@
>   /// print - Print out the MachineFunction in a format suitable for
> debugging
>   /// to the specified stream.
>   ///
> -  void print(std::ostream &OS) const;
> -  void print(std::ostream *OS) const { if (OS) print(*OS); }
> +  void print(std::ostream &OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const;
> +  void print(std::ostream *OS,
> +             const PrefixPrinter &prefix = PrefixPrinter()) const {
> +    if (OS) print(*OS, prefix);
> +  }
>
>   /// viewCFG - This function is meant for use from the debugger.   
> You can
> just
>   /// say 'call F->viewCFG()' and a ghostview window should pop up  
> from the
> Index: include/llvm/Support/Dump.h
> ===================================================================
> --- include/llvm/Support/Dump.h	(revision 0)
> +++ include/llvm/Support/Dump.h	(revision 0)
> @@ -0,0 +1,60 @@
> +//===- llvm/Support/Dump.h - Easy way to tailor dump output -----*-  
> C++
> -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open  
> Source
> +// License. See LICENSE.TXT for details.
> +//
> +// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +//
> +// This file provides the PrefixPrinter interface to pass to  
> MachineFunction
> +// and MachineBasicBlock print methods to output additional  
> information
> before
> +// blocks and instructions are printed.
> +//
> +// 
> = 
> = 
> = 
> ----------------------------------------------------------------------= 
> ==//
> +
> +#ifndef LLVM_SUPPORT_DUMP_H
> +#define LLVM_SUPPORT_DUMP_H
> +
> +#include <iosfwd>
> +
> +namespace llvm {
> +
> +class MachineBasicBlock;
> +class MachineInstr;
> +class raw_ostream;
> +
> +/// PrefixPrinter - Print some additional information before printing
> +/// basic blocks and instructions.
> +class PrefixPrinter {
> +public:
> +  virtual ~PrefixPrinter();
> +
> +  /// operator() - Print a prefix before each MachineBasicBlock
> +  virtual raw_ostream &operator()(raw_ostream &out,
> +                                  const MachineBasicBlock &) const {
> +    return out;
> +  }
> +
> +  /// operator() - Print a prefix before each MachineInstr
> +  virtual raw_ostream &operator()(raw_ostream &out,
> +                                  const MachineInstr &) const {
> +    return out;
> +  }
> +
> +  /// operator() - Print a prefix before each MachineBasicBlock
> +  virtual std::ostream &operator()(std::ostream &out,
> +                                   const MachineBasicBlock &) const {
> +    return out;
> +  }
> +
> +  /// operator() - Print a prefix before each MachineInstr
> +  virtual std::ostream &operator()(std::ostream &out,
> +                                   const MachineInstr &) const {
> +    return out;
> +  }
> +};
> +
> +} // End llvm namespace
> +
> +#endif
> Index: lib/CodeGen/LiveIntervalAnalysis.cpp
> ===================================================================
> --- lib/CodeGen/LiveIntervalAnalysis.cpp	(revision 77464)
> +++ lib/CodeGen/LiveIntervalAnalysis.cpp	(working copy)
> @@ -2500,3 +2500,9 @@
>
>   return LR;
> }
> +
> +raw_ostream &
> +IntervalPrefixPrinter::operator()(raw_ostream &out,
> +                                  const MachineInstr &instr) const {
> +      return out << liinfo.getInstructionIndex(&instr);
> +}
> Index: lib/CodeGen/MachineBasicBlock.cpp
> ===================================================================
> --- lib/CodeGen/MachineBasicBlock.cpp	(revision 77464)
> +++ lib/CodeGen/MachineBasicBlock.cpp	(working copy)
> @@ -153,12 +153,14 @@
>     os << " %reg" << RegNo;
> }
>
> -void MachineBasicBlock::print(std::ostream &OS) const {
> +void MachineBasicBlock::print(std::ostream &OS,
> +                              const PrefixPrinter &prefix) const {
>   raw_os_ostream RawOS(OS);
> -  print(RawOS);
> +  print(RawOS, prefix);
> }
>
> -void MachineBasicBlock::print(raw_ostream &OS) const {
> +void MachineBasicBlock::print(raw_ostream &OS,
> +                              const PrefixPrinter &prefix) const {
>   const MachineFunction *MF = getParent();
>   if(!MF) {
>     OS << "Can't print out MachineBasicBlock because parent  
> MachineFunction"
> @@ -191,7 +193,7 @@
>   }
>
>   for (const_iterator I = begin(); I != end(); ++I) {
> -    OS << "\t";
> +    prefix(OS, *I) << "\t";
>     I->print(OS, &getParent()->getTarget());
>   }
>
> Index: lib/CodeGen/MachineFunction.cpp
> ===================================================================
> --- lib/CodeGen/MachineFunction.cpp	(revision 77464)
> +++ lib/CodeGen/MachineFunction.cpp	(working copy)
> @@ -252,7 +252,8 @@
>   print(*cerr.stream());
> }
>
> -void MachineFunction::print(std::ostream &OS) const {
> +void MachineFunction::print(std::ostream &OS,
> +                            const PrefixPrinter &prefix) const {
>   OS << "# Machine code for " << Fn->getNameStr () << "():\n";
>
>   // Print Frame Information
> @@ -294,8 +295,10 @@
>     OS << "\n";
>   }
>
> -  for (const_iterator BB = begin(); BB != end(); ++BB)
> -    BB->print(OS);
> +  for (const_iterator BB = begin(); BB != end(); ++BB) {
> +    prefix(OS, *BB);
> +    BB->print(OS, prefix);
> +  }
>
>   OS << "\n# End machine code for " << Fn->getNameStr () << "().\n\n";
> }
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list