diff options
| author | David Greene <greened@obbligato.org> | 2009-08-10 16:38:07 +0000 |
|---|---|---|
| committer | David Greene <greened@obbligato.org> | 2009-08-10 16:38:07 +0000 |
| commit | b71d1b2fe2c0673005283b48be2f37c750ce367b (patch) | |
| tree | 6084b46fedf4f66c5bac4c2c0ed1c690239468c0 /lib/CodeGen/AsmPrinter/AsmPrinter.cpp | |
| parent | 468857f22f1ec0e18d48c0c33b82cd31bb3c6574 (diff) | |
Add support for printing loop structure information in asm comments.
This definitely slows down asm output so put it under an -asm-exuberant
flag.
This information is useful when doing static analysis of performance
issues.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/AsmPrinter.cpp')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 102 |
1 files changed, 99 insertions, 3 deletions
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 61577a5707..8e59550028 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -19,6 +19,7 @@ #include "llvm/CodeGen/GCMetadataPrinter.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/DwarfWriter.h" #include "llvm/Analysis/DebugInfo.h" @@ -29,6 +30,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormattedStream.h" +#include "llvm/Support/IOManip.h" #include "llvm/Support/Mangler.h" #include "llvm/Target/TargetAsmInfo.h" #include "llvm/Target/TargetData.h" @@ -46,6 +48,10 @@ static cl::opt<cl::boolOrDefault> AsmVerbose("asm-verbose", cl::desc("Add comments to directives."), cl::init(cl::BOU_UNSET)); +static cl::opt<cl::boolOrDefault> +AsmExuberant("asm-exuberant", cl::desc("Add many comments."), + cl::init(cl::BOU_FALSE)); + char AsmPrinter::ID = 0; AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, const TargetAsmInfo *T, bool VDef) @@ -64,6 +70,11 @@ AsmPrinter::AsmPrinter(formatted_raw_ostream &o, TargetMachine &tm, case cl::BOU_TRUE: VerboseAsm = true; break; case cl::BOU_FALSE: VerboseAsm = false; break; } + switch (AsmExuberant) { + case cl::BOU_UNSET: ExuberantAsm = false; break; + case cl::BOU_TRUE: ExuberantAsm = true; break; + case cl::BOU_FALSE: ExuberantAsm = false; break; + } } AsmPrinter::~AsmPrinter() { @@ -101,6 +112,9 @@ void AsmPrinter::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); MachineFunctionPass::getAnalysisUsage(AU); AU.addRequired<GCModuleInfo>(); + if (ExuberantAsm) { + AU.addRequired<MachineLoopInfo>(); + } } bool AsmPrinter::doInitialization(Module &M) { @@ -233,6 +247,10 @@ void AsmPrinter::SetupMachineFunction(MachineFunction &MF) { // What's my mangled name? CurrentFnName = Mang->getMangledName(MF.getFunction()); IncrementFunctionNumber(); + + if (ExuberantAsm) { + LI = &getAnalysis<MachineLoopInfo>(); + } } namespace { @@ -1558,9 +1576,16 @@ void AsmPrinter::printBasicBlockLabel(const MachineBasicBlock *MBB, << MBB->getNumber(); if (printColon) O << ':'; - if (printComment && MBB->getBasicBlock()) - O << '\t' << TAI->getCommentString() << ' ' - << MBB->getBasicBlock()->getNameStr(); + if (printComment) { + O.PadToColumn(TAI->getCommentColumn(), 1); + + if (MBB->getBasicBlock()) + O << '\t' << TAI->getCommentString() << ' ' + << MBB->getBasicBlock()->getNameStr(); + + if (printColon) + EmitComments(*MBB); + } } /// printPICJumpTableSetLabel - This method prints a set label for the @@ -1720,3 +1745,74 @@ void AsmPrinter::EmitComments(const MCInst &MI) const } } } + +/// EmitComments - Pretty-print comments for basic blocks +void AsmPrinter::EmitComments(const MachineBasicBlock &MBB) const +{ + if (ExuberantAsm) { + // Add loop depth information + const MachineLoop *loop = LI->getLoopFor(&MBB); + + if (loop) { + // Print a newline after bb# annotation. + O << "\n"; + O.PadToColumn(TAI->getCommentColumn(), 1); + O << TAI->getCommentString() << " Loop Depth " << loop->getLoopDepth() + << '\n'; + + O.PadToColumn(TAI->getCommentColumn(), 1); + + MachineBasicBlock *Header = loop->getHeader(); + assert(Header && "No header for loop"); + + if (Header == &MBB) { + O << TAI->getCommentString() << " Loop Header"; + PrintChildLoopComment(loop); + } + else { + O << TAI->getCommentString() << " Loop Header is BB" + << getFunctionNumber() << "_" << loop->getHeader()->getNumber(); + } + + if (loop->empty()) { + O << '\n'; + O.PadToColumn(TAI->getCommentColumn(), 1); + O << TAI->getCommentString() << " Inner Loop"; + } + + // Add parent loop information + for (const MachineLoop *CurLoop = loop->getParentLoop(); + CurLoop; + CurLoop = CurLoop->getParentLoop()) { + MachineBasicBlock *Header = CurLoop->getHeader(); + assert(Header && "No header for loop"); + + O << '\n'; + O.PadToColumn(TAI->getCommentColumn(), 1); + O << TAI->getCommentString() << Indent(CurLoop->getLoopDepth()-1) + << " Inside Loop BB" << getFunctionNumber() << "_" + << Header->getNumber() << " Depth " << CurLoop->getLoopDepth(); + } + } + } +} + +void AsmPrinter::PrintChildLoopComment(const MachineLoop *loop) const { + // Add child loop information + for(MachineLoop::iterator cl = loop->begin(), + clend = loop->end(); + cl != clend; + ++cl) { + MachineBasicBlock *Header = (*cl)->getHeader(); + assert(Header && "No header for loop"); + + O << '\n'; + O.PadToColumn(TAI->getCommentColumn(), 1); + + O << TAI->getCommentString() << Indent((*cl)->getLoopDepth()-1) + << " Child Loop BB" << getFunctionNumber() << "_" + << Header->getNumber() << " Depth " << (*cl)->getLoopDepth(); + + PrintChildLoopComment(*cl); + } +} |
