forked from eurecom-s3/symcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRuntime.h
99 lines (89 loc) · 2.87 KB
/
Runtime.h
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
// This file is part of SymCC.
//
// SymCC is free software: you can redistribute it and/or modify it under the
// terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// SymCC is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// SymCC. If not, see <https://www.gnu.org/licenses/>.
#ifndef RUNTIME_H
#define RUNTIME_H
#include <llvm/IR/InstrTypes.h>
#include <llvm/IR/Module.h>
#if LLVM_VERSION_MAJOR >= 9 && LLVM_VERSION_MAJOR < 11
using SymFnT = llvm::Value *;
#else
using SymFnT = llvm::FunctionCallee;
#endif
/// Runtime functions
struct Runtime {
Runtime(llvm::Module &M);
SymFnT buildInteger{};
SymFnT buildInteger128{};
SymFnT buildFloat{};
SymFnT buildNullPointer{};
SymFnT buildTrue{};
SymFnT buildFalse{};
SymFnT buildBool{};
SymFnT buildSExt{};
SymFnT buildZExt{};
SymFnT buildTrunc{};
SymFnT buildBswap{};
SymFnT buildIntToFloat{};
SymFnT buildFloatToFloat{};
SymFnT buildBitsToFloat{};
SymFnT buildFloatToBits{};
SymFnT buildFloatToSignedInt{};
SymFnT buildFloatToUnsignedInt{};
SymFnT buildFloatAbs{};
SymFnT buildBoolAnd{};
SymFnT buildBoolOr{};
SymFnT buildBoolXor{};
SymFnT buildBoolToBit{};
SymFnT buildBitToBool{};
SymFnT buildAddOverflow{};
SymFnT buildSubOverflow{};
SymFnT buildMulOverflow{};
SymFnT buildSAddSat{};
SymFnT buildUAddSat{};
SymFnT buildSSubSat{};
SymFnT buildUSubSat{};
SymFnT buildSShlSat{};
SymFnT buildUShlSat{};
SymFnT buildFshl{};
SymFnT buildFshr{};
SymFnT buildAbs{};
SymFnT buildConcat{};
SymFnT pushPathConstraint{};
SymFnT getParameterExpression{};
SymFnT setParameterExpression{};
SymFnT setReturnExpression{};
SymFnT getReturnExpression{};
SymFnT memcpy{};
SymFnT memset{};
SymFnT memmove{};
SymFnT readMemory{};
SymFnT writeMemory{};
SymFnT buildZeroBytes{};
SymFnT buildInsert{};
SymFnT buildExtract{};
SymFnT notifyCall{};
SymFnT notifyRet{};
SymFnT notifyBasicBlock{};
/// Mapping from icmp predicates to the functions that build the corresponding
/// symbolic expressions.
std::array<SymFnT, llvm::CmpInst::BAD_ICMP_PREDICATE> comparisonHandlers{};
/// Mapping from binary operators to the functions that build the
/// corresponding symbolic expressions.
std::array<SymFnT, llvm::Instruction::BinaryOpsEnd> binaryOperatorHandlers{};
/// Mapping from unary operators to the functions that build the
/// corresponding symbolic expressions.
std::array<SymFnT, llvm::Instruction::UnaryOpsEnd> unaryOperatorHandlers{};
};
bool isInterceptedFunction(const llvm::Function &f);
#endif