zcov: / tools/kleaver/main.cpp


Files: 1 Branches Taken: 63.6% 21 / 33
Generated: 2009-05-17 22:47 Branches Executed: 100.0% 33 / 33
Line Coverage: 93.9% 46 / 49


Programs: 1 Runs 3


       1                 : #include "expr/Lexer.h"
       2                 : #include "expr/Parser.h"
       3                 : 
       4                 : #include "klee/Expr.h"
       5                 : #include "klee/Solver.h"
       6                 : #include "klee/util/ExprPPrinter.h"
       7                 : #include "klee/util/ExprVisitor.h"
       8                 : 
       9                 : #include "llvm/ADT/StringExtras.h"
      10                 : #include "llvm/Support/CommandLine.h"
      11                 : #include "llvm/Support/ManagedStatic.h"
      12                 : #include "llvm/Support/MemoryBuffer.h"
      13                 : #include "llvm/Support/Streams.h"
      14                 : #include "llvm/System/Signals.h"
      15                 : 
      16                 : #include <iomanip>
      17                 : #include <sstream>
      18                 : 
      19                 : using namespace llvm;
      20                 : using namespace klee;
      21                 : using namespace klee::expr;
      22                 : 
      23                 : namespace {
      24                 :   llvm::cl::opt<std::string>
      25                3:   InputFile(llvm::cl::desc("<input query log>"), llvm::cl::Positional,
      26                3:             llvm::cl::init("-"));
      27                 : 
      28                 :   enum ToolActions {
      29                 :     PrintTokens,
      30                 :     PrintAST
      31                 :   };
      32                 : 
      33                 :   static llvm::cl::opt<ToolActions> 
      34                3:   ToolAction(llvm::cl::desc("Tool actions:"),
      35                 :              llvm::cl::init(PrintTokens),
      36                 :              llvm::cl::values(
      37                 :              clEnumValN(PrintTokens, "print-tokens",
      38                 :                         "Print tokens from the input file."),
      39                 :              clEnumValN(PrintAST, "print-ast",
      40                 :                         "Print parsed AST nodes from the input file."),
      41                3:              clEnumValEnd));
      42                 : }
      43                 : 
      44               65: static std::string escapedString(const char *start, unsigned length) {
      45               65:   std::stringstream s;
                     1848: branch 0 taken
                       65: branch 1 taken
      46             1913:   for (unsigned i=0; i<length; ++i) {
      47             1848:     char c = start[i];
                     1812: branch 1 taken
                       36: branch 2 taken
      48             1848:     if (isprint(c)) {
      49             1812:       s << c;
                       36: branch 0 taken
                        0: branch 1 not taken
      50               36:     } else if (c == '\n') {
      51               36:       s << "\\n";
      52                 :     } else {
      53                0:       s << "\\x" << hexdigit(((unsigned char) c >> 4) & 0xF) << hexdigit((unsigned char) c & 0xF);
      54                 :     }
      55                 :   }
      56               65:   return s.str();
      57                 : }
      58                 : 
      59                1: static void PrintInputTokens(const MemoryBuffer *MB) {
      60                1:   Lexer L(MB);
      61                 :   Token T;
                       64: branch 0 taken
                        1: branch 1 taken
      62               65:   do {
      63               65:     L.Lex(T);
      64                 :     llvm::cout << "(Token \"" << T.getKindName() << "\" "
      65                 :                << "\"" << escapedString(T.start, T.length) << "\" "
      66                 :                << T.length << " "
      67              130:                << T.line << " " << T.column << ")\n";
      68                1:   } while (T.kind != Token::EndOfFile);
      69                1: }
      70                 : 
      71                 : static bool PrintInputAST(const char *Filename,
      72                2:                           const MemoryBuffer *MB) {
      73                2:   Parser *P = Parser::Create(Filename, MB);
      74                2:   P->SetMaxErrors(20);
                       18: branch 1 taken
                        2: branch 2 taken
      75               20:   while (Decl *D = P->ParseTopLevelDecl()) {
                       18: branch 1 taken
                        0: branch 2 not taken
      76               18:     if (!P->GetNumErrors())
      77               18:       D->dump();
                        0: branch 0 not taken
                       18: branch 1 taken
      78               18:     delete D;
      79                 :   }
      80                 : 
      81                2:   bool success = true;
                        0: branch 1 not taken
                        2: branch 2 taken
      82                2:   if (unsigned N = P->GetNumErrors()) {
      83                 :     llvm::cerr << Filename << ": parse failure: "
      84                 :                << N << " errors.\n";
      85                0:     success = false;
      86                 :   }
                        2: branch 0 taken
                        0: branch 1 not taken
      87                2:   delete P;
      88                 : 
      89                2:   return success;
      90                 : }
      91                 : 
      92                3: int main(int argc, char **argv) {
      93                3:   bool success = true;
      94                 : 
      95                3:   llvm::sys::PrintStackTraceOnErrorSignal();
      96                3:   llvm::cl::ParseCommandLineOptions(argc, argv);
      97                 : 
      98                 :   std::string ErrorStr;
      99                3:   MemoryBuffer *MB = MemoryBuffer::getFileOrSTDIN(InputFile.c_str(), &ErrorStr);
                        0: branch 0 not taken
                        3: branch 1 taken
     100                3:   if (!MB) {
     101                 :     llvm::cerr << argv[0] << ": ERROR: " << ErrorStr << "\n";
     102                0:     return 1;
     103                 :   }
     104                 : 
                        1: branch 0 taken
                        2: branch 1 taken
                        0: branch 2 not taken
     105                3:   switch (ToolAction) {
     106                 :   case PrintTokens:
     107                1:     PrintInputTokens(MB);
     108                1:     break;
     109                 :   case PrintAST:
                        0: branch 0 not taken
                        2: branch 1 taken
     110                4:     success = PrintInputAST(InputFile=="-" ? "<stdin>" : InputFile.c_str(), MB);
     111                2:     break;
     112                 :   default:
     113                 :     llvm::cerr << argv[0] << ": ERROR: Unknown program action!\n";
     114                 :   }
     115                 : 
                        3: branch 0 taken
                        0: branch 1 not taken
     116                3:   delete MB;
     117                 : 
     118                3:   llvm::llvm_shutdown();
                        3: branch 0 taken
                        0: branch 1 not taken
     119                3:   return success ? 0 : 1;
                        3: branch 0 taken
                        0: branch 1 not taken
                        3: branch 2 taken
                        0: branch 3 not taken
     120                9: }

Generated: 2009-05-17 22:47 by zcov