 |
|
 |
|
| 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 |
| |
 |
|
 |
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