|
1 | 1 | #pragma once |
2 | 2 |
|
3 | 3 | #include "global_components.dl" |
4 | | -#define MAX_INSERTS 5 |
5 | 4 |
|
6 | 5 |
|
7 | 6 | #define COPY_OUTPUT(to, from)\ |
@@ -34,6 +33,14 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to) |
34 | 33 | .decl Out_Statement_Next(stmt: Statement, next: Statement) |
35 | 34 | .decl Out_Statement_Opcode(stmt: Statement, op: Opcode) |
36 | 35 | .decl Out_PushValue(stmt: Statement, value: Value) |
| 36 | + |
| 37 | + // The last `statement` in the original bytecode, start adding cloned code after it. |
| 38 | + .decl MaxOriginalStatement(statement: Statement) |
| 39 | + |
| 40 | + MaxOriginalStatement(as(maxStmt, Statement)):- |
| 41 | + maxStmtNumber = max stmtNumber : { Statement_Opcode(stmt, _), stmtNumber = @hex_to_number(stmt)}, |
| 42 | + maxStmt = @number_to_hex(2*maxStmtNumber). |
| 43 | + |
37 | 44 | } |
38 | 45 |
|
39 | 46 | .comp StatementInsertor : CodeTransformer { |
@@ -67,42 +74,29 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to) |
67 | 74 | insertOpsN(stmt, rest, n+1) :- |
68 | 75 | insertOpsN(stmt, [[op, value], rest], n). |
69 | 76 |
|
70 | | - |
71 | | - .decl PreInsertedOpNewStatementNum(stmt: Statement, order: number, newStmt: number) |
72 | | - |
73 | | - PreInsertedOpNewStatementNum(stmt, order, @hex_to_number(stmt) * MAX_INSERTS + order) :- |
74 | | - insertOp(stmt, _, _, order). |
75 | | - |
76 | | - .decl PreInsertedOpMissingStmt(n : number) |
77 | | - |
78 | | - PreInsertedOpMissingStmt(newStmt - 1) :- |
79 | | - PreInsertedOpNewStatementNum(_, _, newStmt), newStmt > 0, |
80 | | - !PreInsertedOpNewStatementNum(_, _, newStmt - 1). |
81 | | - |
82 | | - PreInsertedOpMissingStmt(newStmt - 1) :- |
83 | | - PreInsertedOpMissingStmt(newStmt), newStmt > 0, |
84 | | - !PreInsertedOpNewStatementNum(_, _, newStmt - 1). |
85 | | - |
86 | | - .decl MaxStmt(n: number) |
87 | | - MaxStmt(n) :- n = max @hex_to_number(stmt) : Statement_Opcode(stmt, _). |
| 77 | + // Random order of the insertions using the choice-domain |
| 78 | + .decl Insertion_Next(ins: Statement, next: Statement) choice-domain ins, next |
| 79 | + Insertion_Next("nil", "head"). |
| 80 | + Insertion_Next(prev, next):- |
| 81 | + Insertion_Next(_, prev), |
| 82 | + insertOp(next, _, _, _). |
88 | 83 |
|
89 | 84 | .decl InsertedOpNewStatement(stmt: Statement, order: number, newStmt: Statement) |
90 | 85 |
|
91 | | - .decl WastedSlots(newStmt: number, n: number) |
| 86 | + InsertedOpNewStatement(stmt, 0, as(@add_256(maxStmt, "0x20"), Statement)):- |
| 87 | + insertOp(stmt, _, _, 0), |
| 88 | + Insertion_Next("head", stmt), |
| 89 | + MaxOriginalStatement(maxStmt). |
92 | 90 |
|
93 | | - .decl TempPreInsertedOpNewAndMissingStatementNum(smallerThanNewStmt: number, newStmt: number) |
94 | | - TempPreInsertedOpNewAndMissingStatementNum(smallerThanNewStmt, newStmt) :- |
95 | | - PreInsertedOpNewStatementNum(_, _, newStmt), |
96 | | - PreInsertedOpMissingStmt(smallerThanNewStmt), smallerThanNewStmt < newStmt. |
97 | | - |
98 | | - WastedSlots(newStmt, n) :- |
99 | | - PreInsertedOpNewStatementNum(_, _, newStmt), |
100 | | - n = count : { TempPreInsertedOpNewAndMissingStatementNum(_, newStmt) }. |
| 91 | + InsertedOpNewStatement(stmt, order + 1, as(@add_256(newPrevStmt, "0x20"), Statement)):- |
| 92 | + InsertedOpNewStatement(stmt, order, newPrevStmt), |
| 93 | + insertOp(stmt, _, _, order), |
| 94 | + insertOp(stmt, _, _, order + 1). |
101 | 95 |
|
102 | | - InsertedOpNewStatement(stmt, order, as(@number_to_hex(newStmt - n + maxStmt + 1), Statement)) :- |
103 | | - PreInsertedOpNewStatementNum(stmt, order, newStmt), |
104 | | - MaxStmt(maxStmt), |
105 | | - WastedSlots(newStmt, n). |
| 96 | + // Note: Insertions are placed 80 slots from each other, can make more precise |
| 97 | + InsertedOpNewStatement(stmt, 0, as(@add_256(newPrevStmt, "0xa00"), Statement)):- |
| 98 | + InsertedOpNewStatement(prevStmt, 0, newPrevStmt), |
| 99 | + Insertion_Next(prevStmt, stmt). |
106 | 100 |
|
107 | 101 | Out_Statement_Opcode(stmt, op) :- |
108 | 102 | Statement_Opcode(stmt, op), |
@@ -250,9 +244,6 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to) |
250 | 244 | .decl Prev_Block_OriginalBlock(block: Block, originalBlock: Block) |
251 | 245 | .decl In_Block_OriginalBlock(block: Block, originalBlock: Block) |
252 | 246 |
|
253 | | - // The last `statement` in the original bytecode, start adding cloned code after it. |
254 | | - .decl MaxOriginalStatement(statement: Statement) |
255 | | - |
256 | 247 | // compute the block size to use on the cloned blocks |
257 | 248 | .decl BlockSize(block: Block, size: number) |
258 | 249 |
|
@@ -313,9 +304,6 @@ INITIALIZE_STATEMENT_INSERTOR(_insertor, to) |
313 | 304 | DEBUG_OUTPUT(Block_OriginalBlock) |
314 | 305 | DEBUG_OUTPUT(BlockToClone) |
315 | 306 |
|
316 | | - MaxOriginalStatement(as(maxStmt, Statement)):- |
317 | | - maxStmtNumber = max stmtNumber : { Statement_Opcode(stmt, _), stmtNumber = @hex_to_number(stmt)}, |
318 | | - maxStmt = @number_to_hex(2*maxStmtNumber). |
319 | 307 |
|
320 | 308 | // New definition, makes it pre cloning insertion safe |
321 | 309 | BlockSize(block, maxStmt - @hex_to_number(block)):- |
|
0 commit comments