llvm-bcanalyzer.cpp revision 3ed469ccd7b028a030b550d84b7336d146f5d8fa
1//===-- llvm-bcanalyzer.cpp - Byte Code Analyzer --------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Reid Spencer and is distributed under the 6// University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This tool may be invoked in the following manner: 11// llvm-bcanalyzer [options] - Read LLVM bytecode from stdin 12// llvm-bcanalyzer [options] x.bc - Read LLVM bytecode from the x.bc file 13// 14// Options: 15// --help - Output information about command line switches 16// --nodetails - Don't print out detailed informaton about individual 17// blocks and functions 18// --dump - Dump low-level bytecode structure in readable format 19// 20// This tool provides analytical information about a bytecode file. It is 21// intended as an aid to developers of bytecode reading and writing software. It 22// produces on std::out a summary of the bytecode file that shows various 23// statistics about the contents of the file. By default this information is 24// detailed and contains information about individual bytecode blocks and the 25// functions in the module. To avoid this more detailed output, use the 26// -nodetails option to limit the output to just module level information. 27// The tool is also able to print a bytecode file in a straight forward text 28// format that shows the containment and relationships of the information in 29// the bytecode file (-dump option). 30//===----------------------------------------------------------------------===// 31 32#include "llvm/Analysis/Verifier.h" 33#include "llvm/Bytecode/Analyzer.h" 34#include "llvm/Support/CommandLine.h" 35#include "llvm/System/Signals.h" 36#include <fstream> 37#include <iostream> 38 39using namespace llvm; 40 41static cl::opt<std::string> 42 InputFilename(cl::Positional, cl::desc("<input bytecode>"), cl::init("-")); 43 44static cl::opt<std::string> 45 OutputFilename("-o", cl::init("-"), cl::desc("<output file>")); 46 47static cl::opt<bool> NoDetails ("nodetails", cl::desc("Skip detailed output")); 48static cl::opt<bool> Dump ("dump", cl::desc("Dump low level bytecode trace")); 49static cl::opt<bool> Verify ("verify", cl::desc("Progressively verify module")); 50 51int 52main(int argc, char **argv) { 53 try { 54 cl::ParseCommandLineOptions(argc, argv, 55 " llvm-bcanalyzer Analysis of ByteCode Dumper\n"); 56 57 sys::PrintStackTraceOnErrorSignal(); 58 59 std::ostream* Out = &std::cout; // Default to printing to stdout... 60 std::string ErrorMessage; 61 BytecodeAnalysis bca; 62 63 /// Determine what to generate 64 bca.detailedResults = !NoDetails; 65 bca.progressiveVerify = Verify; 66 67 /// Analyze the bytecode file 68 Module* M = AnalyzeBytecodeFile(InputFilename, bca, &ErrorMessage, (Dump?Out:0)); 69 70 // All that bcanalyzer does is write the gathered statistics to the output 71 PrintBytecodeAnalysis(bca,*Out); 72 73 if ( M && Verify ) { 74 std::string verificationMsg; 75 if (verifyModule(*M, ReturnStatusAction, &verificationMsg)) 76 std::cerr << "Final Verification Message: " << verificationMsg << "\n"; 77 } 78 79 if (Out != &std::cout) { 80 ((std::ofstream*)Out)->close(); 81 delete Out; 82 } 83 return 0; 84 } catch (const std::string& msg) { 85 std::cerr << argv[0] << ": " << msg << "\n"; 86 } catch (...) { 87 std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n"; 88 } 89 return 1; 90} 91 92// vim: sw=2 93