blob: 980414649e0af4d916c634f9982a999e2eb4e24b (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
//===-- StatsTracker.h ------------------------------------------*- C++ -*-===//
//
// The KLEE Symbolic Virtual Machine
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef KLEE_STATSTRACKER_H
#define KLEE_STATSTRACKER_H
#include "CallPathManager.h"
#include "klee/Internal/System/Time.h"
#include <memory>
#include <set>
#include <sqlite3.h>
namespace llvm {
class BranchInst;
class Function;
class Instruction;
class raw_fd_ostream;
}
namespace klee {
class ExecutionState;
class Executor;
class InstructionInfoTable;
class InterpreterHandler;
struct KInstruction;
struct StackFrame;
class StatsTracker {
friend class WriteStatsTimer;
friend class WriteIStatsTimer;
Executor &executor;
std::string objectFilename;
std::unique_ptr<llvm::raw_fd_ostream> istatsFile;
::sqlite3 *statsFile = nullptr;
::sqlite3_stmt *transactionBeginStmt = nullptr;
::sqlite3_stmt *transactionEndStmt = nullptr;
::sqlite3_stmt *insertStmt = nullptr;
std::uint32_t statsCommitEvery;
std::uint32_t statsWriteCount = 0;
time::Point startWallTime;
unsigned numBranches;
unsigned fullBranches, partialBranches;
CallPathManager callPathManager;
bool updateMinDistToUncovered;
public:
static bool useStatistics();
static bool useIStats();
private:
void updateStateStatistics(uint64_t addend);
void writeStatsHeader();
void writeStatsLine();
void writeIStats();
public:
StatsTracker(Executor &_executor, std::string _objectFilename,
bool _updateMinDistToUncovered);
~StatsTracker();
StatsTracker(const StatsTracker &other) = delete;
StatsTracker(StatsTracker &&other) noexcept = delete;
StatsTracker &operator=(const StatsTracker &other) = delete;
StatsTracker &operator=(StatsTracker &&other) noexcept = delete;
// called after a new StackFrame has been pushed (for callpath tracing)
void framePushed(ExecutionState &es, StackFrame *parentFrame);
// called after a StackFrame has been popped
void framePopped(ExecutionState &es);
// called when some side of a branch has been visited. it is
// imperative that this be called when the statistics index is at
// the index for the branch itself.
void markBranchVisited(ExecutionState *visitedTrue,
ExecutionState *visitedFalse);
// called when execution is done and stats files should be flushed
void done();
// process stats for a single instruction step, es is the state
// about to be stepped
void stepInstruction(ExecutionState &es);
/// Return duration since execution start.
time::Span elapsed();
void computeReachableUncovered();
};
uint64_t computeMinDistToUncovered(const KInstruction *ki,
uint64_t minDistAtRA);
}
#endif /* KLEE_STATSTRACKER_H */
|