Skip to content

Commit 9020450

Browse files
first commit
1 parent cac1ad9 commit 9020450

File tree

11 files changed

+73
-66
lines changed

11 files changed

+73
-66
lines changed

nautilus-api/include/engine/engine.hpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,33 +9,38 @@ namespace nautilus::engine {
99

1010
namespace details {
1111

12-
template<typename Arg>
12+
template<typename Arg, size_t I>
1313
auto createTraceArgument() {
1414
auto defaultVal = (typename Arg::basic_type) 0;
1515
auto type = tracing::to_type<typename Arg::basic_type>();
16-
auto valueRef = tracing::registerFunctionArgument(type);
17-
return Arg(defaultVal,valueRef);
16+
auto valueRef = tracing::registerFunctionArgument(type, I);
17+
return Arg(defaultVal, valueRef);
1818
}
1919

2020
template<typename Arg>
2121
auto transform(Arg argument) {
2222
return make_value(argument);
2323
}
2424

25-
template<is_base_type R, is_base_type... FunctionArguments>
26-
std::function<void()> createFunctionWrapper(R (*fnptr)(FunctionArguments...)) {
25+
template<size_t... Indices, is_base_type R, typename... FunctionArguments>
26+
std::function<void()> createFunctionWrapper(std::index_sequence<Indices...>, R (*fnptr)(FunctionArguments...)) {
2727
[[maybe_unused]] std::size_t args = sizeof...(FunctionArguments);
2828
auto traceFunc = [=]() {
2929
if constexpr (std::is_void_v<R>) {
30-
fnptr(details::createTraceArgument<FunctionArguments>()...);
30+
fnptr(details::createTraceArgument<FunctionArguments, Indices>()...);
3131
} else {
32-
auto returnValue = fnptr(details::createTraceArgument<FunctionArguments>()...);
32+
auto returnValue = fnptr(details::createTraceArgument<FunctionArguments, Indices>()...);
3333
auto type = tracing::to_type<typename decltype(returnValue)::basic_type>();
3434
tracing::traceReturnOperation(type, returnValue.state);
3535
}
3636
};
3737
return traceFunc;
3838
}
39+
40+
template<is_base_type R, is_base_type... FunctionArguments>
41+
std::function<void()> createFunctionWrapper(R (*fnptr)(FunctionArguments...)) {
42+
return createFunctionWrapper(std::make_index_sequence<sizeof...(FunctionArguments)>{}, fnptr);
43+
}
3944
}
4045

4146
template<is_base_type R, is_base_type... FunctionArguments>

nautilus-common/tests/traces/ifThenCondition.trace

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ Block1()
77
CONST 6
88
ADD 7 2 6
99
ASSIGN 2 7
10+
JMP 0 3
11+
Block2()
12+
JMP 0 3
13+
Block3() ControlFlowMerge
1014
CONST 8
1115
ADD 9 2 8
1216
RETURN 9
13-
Block2()
14-
CONST 11
15-
ADD 12 2 11
16-
RETURN 12

nautilus-common/tests/traces/ifThenElseCondition.trace

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ Block1()
77
CONST 6
88
ADD 7 2 6
99
ASSIGN 2 7
10-
CONST 8
11-
ADD 9 2 8
12-
RETURN 9
10+
JMP 0 3
1311
Block2()
1412
CONST 11
1513
ADD 12 2 11
1614
ASSIGN 2 12
17-
CONST 13
18-
ADD 14 2 13
19-
RETURN 14
15+
JMP 0 3
16+
Block3() ControlFlowMerge
17+
CONST 8
18+
ADD 9 2 8
19+
RETURN 9

nautilus-common/tests/traces/nestedIfNoElseCondition.trace

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,24 @@ Block1()
66
CONST 6
77
ADD 7 2 6
88
ASSIGN 2 7
9-
CONST 8
10-
ADD 9 2 8
11-
ASSIGN 2 9
12-
RETURN 2
9+
JMP 0 5
1310
Block2()
1411
CONST 12
15-
ADD 13 11 12
16-
ASSIGN 11 13
12+
ADD 13 2 12
13+
ASSIGN 2 13
1714
CONST 14
18-
EQ 15 11 14
15+
EQ 15 2 14
1916
CMP 16 15 3 4
2017
Block3()
2118
CONST 17
22-
ADD 18 11 17
23-
CONST 19
24-
ADD 20 11 19
25-
ASSIGN 11 20
26-
RETURN 11
19+
ADD 18 2 17
20+
JMP 0 5
2721
Block4()
28-
CONST 23
29-
ADD 24 22 23
30-
ASSIGN 22 24
31-
RETURN 22
22+
JMP 0 6
23+
Block5() ControlFlowMerge
24+
JMP 0 6
25+
Block6() ControlFlowMerge
26+
CONST 8
27+
ADD 9 2 8
28+
ASSIGN 2 9
29+
RETURN 2

nautilus-common/tests/traces/nestedIfThenElseCondition.trace

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,22 @@ Block0()
33
EQ 4 1 3
44
CMP 5 4 1 2
55
Block1()
6-
CONST 6
7-
ADD 7 2 6
8-
ASSIGN 2 7
9-
RETURN 2
6+
JMP 0 5
107
Block2()
118
CONST 10
12-
EQ 11 9 10
9+
EQ 11 2 10
1310
CMP 12 11 3 4
1411
Block3()
15-
CONST 13
16-
ADD 14 9 13
17-
ASSIGN 9 14
18-
RETURN 9
12+
JMP 0 5
1913
Block4()
20-
CONST 17
21-
ADD 18 16 17
22-
ASSIGN 16 18
23-
CONST 19
24-
ADD 20 16 19
25-
ASSIGN 16 20
26-
RETURN 16
14+
CONST 15
15+
ADD 16 2 15
16+
ASSIGN 2 16
17+
JMP 0 6
18+
Block5() ControlFlowMerge
19+
JMP 0 6
20+
Block6() ControlFlowMerge
21+
CONST 6
22+
ADD 7 2 6
23+
ASSIGN 2 7
24+
RETURN 2

nautilus-jit/include/Tracing/execution_trace.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ namespace nautilus::tracing {
8888
* @brief Adds arguments that are passed to the traced function
8989
* @param argument
9090
*/
91-
value_ref addArgument(Type type);
91+
value_ref setArgument(Type type, size_t index);
9292

9393
/**
9494
* @brief Returns all arguments of this trace.

nautilus-jit/include/Tracing/trace_context.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace nautilus::tracing {
4949

5050
static bool shouldTrace();
5151

52-
value_ref registerFunctionArgument(Type type);
52+
value_ref registerFunctionArgument(Type type, size_t index);
5353

5454
void traceValueDestruction(value_ref target);
5555
std::array<uint8_t, 256>& getVarRefMap();

nautilus-jit/include/Tracing/traceing.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ namespace nautilus::tracing {
8181
[[maybe_unused]] void traceCopy(value_ref state);
8282

8383

84-
value_ref registerFunctionArgument(Type type);
84+
value_ref registerFunctionArgument(Type type, size_t index);
8585

8686
void traceAssignment(value_ref target, value_ref source);
8787

nautilus-jit/src/Tracing/execution_trace.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ size_t std::hash<nautilus::tracing::StateSnapshot>::operator()(const nautilus::t
99
return std::hash<nautilus::tracing::Tag *>()(xyz.tag) ^ xyz.hash;
1010
}
1111

12-
size_t std::hash<std::array<uint8_t, 256>>::operator()( std::array<uint8_t, 256> &xyz) const {
12+
size_t std::hash<std::array<uint8_t, 256>>::operator()(std::array<uint8_t, 256> &xyz) const {
1313
std::hash<uint8_t> hasher;
1414
size_t result = 0;
1515
for (size_t i = 0; i < 256; ++i) {
16-
auto val = xyz.at(i);
16+
auto val = xyz.at(i);
1717
result = result * 31 + hasher(val);
1818
}
1919
return result;
@@ -58,7 +58,7 @@ namespace nautilus::tracing {
5858
return true;
5959
}
6060

61-
void ExecutionTrace::addReturn(Tag *tag, std::array<uint8_t, 256> &varRefMap, Type type, value_ref ref) {
61+
void ExecutionTrace::addReturn(Tag *tag, std::array<uint8_t, 256> &varRefMap, Type type, value_ref ref) {
6262
if (blocks.empty()) {
6363
createBlock();
6464
}
@@ -74,7 +74,8 @@ namespace nautilus::tracing {
7474
localTagMap[snap] = operationIdentifier;
7575
}
7676

77-
void ExecutionTrace::addAssignmentOperation(Tag *tag,std::array<uint8_t, 256> &varRefMap, nautilus::tracing::value_ref targetRef,
77+
void ExecutionTrace::addAssignmentOperation(Tag *tag, std::array<uint8_t, 256> &varRefMap,
78+
nautilus::tracing::value_ref targetRef,
7879
nautilus::tracing::value_ref srcRef) {
7980
if (blocks.empty()) {
8081
createBlock();
@@ -107,7 +108,8 @@ namespace nautilus::tracing {
107108
return to.resultRef;
108109
}
109110

110-
void ExecutionTrace::addCmpOperation(nautilus::tracing::Tag *tag,std::array<uint8_t, 256> &varRefMap, nautilus::tracing::value_ref inputs) {
111+
void ExecutionTrace::addCmpOperation(nautilus::tracing::Tag *tag, std::array<uint8_t, 256> &varRefMap,
112+
nautilus::tracing::value_ref inputs) {
111113
if (blocks.empty()) {
112114
createBlock();
113115
}
@@ -151,7 +153,7 @@ namespace nautilus::tracing {
151153
}
152154

153155
TraceOperation &ExecutionTrace::getCurrentOperation() {
154-
auto& currentOp = getCurrentBlock().operations[currentOperationIndex];
156+
auto &currentOp = getCurrentBlock().operations[currentOperationIndex];
155157
if (currentOp.op == JMP) {
156158
auto nextBlock = std::get<BlockRef>(currentOp.input[0]);
157159
setCurrentBlock(nextBlock);
@@ -238,10 +240,14 @@ namespace nautilus::tracing {
238240
return os;
239241
}
240242

241-
value_ref ExecutionTrace::addArgument(Type type) {
242-
auto ref = getNextValueRef();
243-
arguments.emplace_back(ref, type);
244-
return ref;
243+
value_ref ExecutionTrace::setArgument(Type type, size_t index) {
244+
++lastValueRef;
245+
value_ref argRef = index + 1;
246+
if (arguments.size() < argRef) {
247+
arguments.resize(argRef);
248+
}
249+
arguments[index] = {argRef, type};
250+
return argRef;
245251
};
246252

247253
void ExecutionTrace::destruct(nautilus::tracing::value_ref) {

nautilus-jit/src/Tracing/tracing.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ namespace nautilus::tracing {
2727
return TraceContext::get()->getTag();
2828
}
2929

30-
value_ref registerFunctionArgument(Type type) {
31-
return TraceContext::get()->registerFunctionArgument(type);
30+
value_ref registerFunctionArgument(Type type, size_t index) {
31+
return TraceContext::get()->registerFunctionArgument(type, index);
3232
}
3333

3434

nautilus-jit/src/Tracing/tracing_context.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ namespace nautilus::tracing {
3434
symbolicExecutionContext(std::make_unique<SymbolicExecutionContext>()) {
3535
}
3636

37-
value_ref TraceContext::registerFunctionArgument(Type type) {
38-
return executionTrace->addArgument(type);
37+
value_ref TraceContext::registerFunctionArgument(Type type, size_t index) {
38+
return executionTrace->setArgument(type, index);
3939
}
4040

4141
void TraceContext::traceValueDestruction(nautilus::tracing::value_ref target) {

0 commit comments

Comments
 (0)