[Decomp] Decompile gstring (#267)

* decompile gstring

* update

* Update code_status.md

* Update code_status.md

* decompile gstate

* add test for states, hope it passes

* also test throw and catch xmms

* update doc
This commit is contained in:
water111
2021-02-16 20:37:48 -05:00
committed by GitHub
parent aa9bcd07f4
commit f1a93886e7
29 changed files with 2505 additions and 396 deletions
@@ -2189,4 +2189,393 @@ TEST_F(FormRegressionTest, ExprValid) {
{"L315", "ERROR: object #x~X ~S is not a valid object of type '~A' (not in symbol table)~%"},
{"L314",
"ERROR: object #x~X ~S is not a valid object of type '~A' (inside symbol table)~%"}});
}
}
TEST_F(FormRegressionTest, ExprStringToInt) {
std::string func =
" sll r0, r0, 0\n"
"L14:\n"
" daddiu a0, a0, 4\n"
" addiu v0, r0, 0\n"
" or v1, s7, r0\n"
" addiu a1, r0, 35\n"
" lbu a2, 0(a0)\n"
" bne a2, a1, L33\n"
" sll r0, r0, 0\n"
" daddiu a0, a0, 1\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -120\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" bnel s7, a2, L15\n"
" or a1, a2, r0\n"
" lbu a1, 0(a0)\n"
" daddiu a2, a1, -88\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L15:\n"
" beq s7, a1, L27\n"
" or a1, s7, r0\n"
" daddiu a0, a0, 1\n"
" addiu a1, r0, 45\n"
" lbu a2, 1(a0)\n"
" bne a2, a1, L16\n"
" or a1, s7, r0\n"
" daddiu v1, s7, #t\n"
" daddiu a0, a0, 1\n"
" or a1, a0, r0\n"
"L16:\n"
" beq r0, r0, L23\n"
" sll r0, r0, 0\n"
"\n"
"L17:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 65\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L18\n"
" or a1, a2, r0\n"
" addiu a1, r0, 70\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L18:\n"
" beq s7, a1, L19\n"
" sll r0, r0, 0\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -55\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"L19:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 97\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L20\n"
" or a1, a2, r0\n"
" addiu a1, r0, 102\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L20:\n"
" beq s7, a1, L21\n"
" sll r0, r0, 0\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -87\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
" beq r0, r0, L22\n"
" sll r0, r0, 0\n"
"L21:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" dsll a2, v0, 4\n"
" daddu v0, a1, a2\n"
" or a1, v0, r0\n"
"L22:\n"
" daddiu a0, a0, 1\n"
"L23:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L24\n"
" or a1, a2, r0\n"
" addiu a1, r0, 57\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L24:\n"
" bnel s7, a1, L26\n"
" or a1, a1, r0\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 65\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L25\n"
" or a1, a2, r0\n"
" addiu a1, r0, 70\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L25:\n"
" bnel s7, a1, L26\n"
" or a1, a1, r0\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 97\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L26\n"
" or a1, a2, r0\n"
" addiu a1, r0, 102\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L26:\n"
" bne s7, a1, L17\n"
" sll r0, r0, 0\n"
" or a1, s7, r0\n"
" beq r0, r0, L32\n"
" sll r0, r0, 0\n"
"L27:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -98\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" bnel s7, a2, L28\n"
" or a1, a2, r0\n"
" lbu a1, 0(a0)\n"
" daddiu a2, a1, -66\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L28:\n"
" beq s7, a1, L32\n"
" or a1, s7, r0\n"
" daddiu a0, a0, 1\n"
" beq r0, r0, L30\n"
" sll r0, r0, 0\n"
"\n"
"L29:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" dsll a2, v0, 1\n"
" daddu v0, a1, a2\n"
" daddiu a0, a0, 1\n"
"L30:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L31\n"
" or a1, a2, r0\n"
" addiu a1, r0, 49\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L31:\n"
" bne s7, a1, L29\n"
" sll r0, r0, 0\n"
" or a1, s7, r0\n"
"L32:\n"
" beq r0, r0, L38\n"
" sll r0, r0, 0\n"
"L33:\n"
" addiu a1, r0, 45\n"
" lbu a2, 1(a0)\n"
" bne a2, a1, L34\n"
" or a1, s7, r0\n"
" daddiu v1, s7, #t\n"
" daddiu a0, a0, 1\n"
" or a1, a0, r0\n"
"L34:\n"
" beq r0, r0, L36\n"
" sll r0, r0, 0\n"
"L35:\n"
" lbu a1, 0(a0)\n"
" daddiu a1, a1, -48\n"
" addiu a2, r0, 10\n"
" mult3 a2, a2, v0\n"
" daddu v0, a1, a2\n"
" daddiu a0, a0, 1\n"
"L36:\n"
" lbu a1, 0(a0)\n"
" sltiu a1, a1, 48\n"
" daddiu a2, s7, 8\n"
" movn a2, s7, a1\n"
" beql s7, a2, L37\n"
" or a1, a2, r0\n"
" addiu a1, r0, 57\n"
" lbu a2, 0(a0)\n"
" sltu a2, a1, a2\n"
" daddiu a1, s7, 8\n"
" movn a1, s7, a2\n"
"L37:\n"
" bne s7, a1, L35\n"
" sll r0, r0, 0\n"
" or a0, s7, r0\n"
"L38:\n"
" beq s7, v1, L39\n"
" sll r0, r0, 0\n"
" dsubu v0, r0, v0\n"
" beq r0, r0, L39\n"
" sll r0, r0, 0\n"
"L39:\n"
" jr ra\n"
" daddu sp, sp, r0";
std::string type = "(function string int)";
std::string expected =
"(defun test-function ((arg0 string))\n"
" (local-vars\n"
" (v0-0 int)\n"
" (v1-0 symbol)\n"
" (a0-1 (pointer uint8))\n"
" (a0-2 (pointer uint8))\n"
" (a0-3 (pointer uint8))\n"
" (a0-4 (pointer uint8))\n"
" (a0-5 symbol)\n"
" (a1-8 (pointer uint8))\n"
" (a1-14 uint)\n"
" (a1-16 symbol)\n"
" (a1-20 uint)\n"
" (a1-23 uint)\n"
" (a1-33 symbol)\n"
" (a1-44 symbol)\n"
" (a1-47 (pointer uint8))\n"
" )\n"
" (set! a0-1 (-> arg0 data))\n"
" (set! v0-0 0)\n"
" (set! v1-0 (quote #f))\n"
" (cond\n"
" ((= (-> a0-1 0) 35)\n"
" (set! a0-2 (&-> a0-1 1))\n"
" (cond\n"
" ((or (zero? (+ (-> a0-2 0) -120)) (zero? (+ (-> a0-2 0) -88)))\n"
" (set! a0-3 (&-> a0-2 1))\n"
" (when\n"
" (= (-> a0-3 1) 45)\n"
" (set! v1-0 (quote #t))\n"
" (set! a0-3 (&-> a0-3 1))\n"
" (set! a1-8 a0-3)\n"
" )\n"
" (while\n"
" (or\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 48))\n"
" (>= (the-as uint 57) (-> a0-3 0))\n"
" )\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" )\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" )\n"
" (cond\n"
" ((and\n"
" (>= (-> a0-3 0) (the-as uint 65))\n"
" (>= (the-as uint 70) (-> a0-3 0))\n"
" )\n"
" (set! v0-0 (+ (+ (-> a0-3 0) -55) (the-as uint (shl v0-0 4))))\n"
" (set! a1-14 v0-0)\n"
" )\n"
" (else\n"
" (set!\n"
" a1-16\n"
" (and\n"
" (>= (-> a0-3 0) (the-as uint 97))\n"
" (>= (the-as uint 102) (-> a0-3 0))\n"
" )\n"
" )\n"
" (cond\n"
" (a1-16\n"
" (set! v0-0 (+ (+ (-> a0-3 0) -87) (the-as uint (shl v0-0 4))))\n"
" (set! a1-20 v0-0)\n"
" )\n"
" (else\n"
" (set! v0-0 (+ (+ (-> a0-3 0) -48) (the-as uint (shl v0-0 4))))\n"
" (set! a1-23 v0-0)\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (set! a0-3 (&-> a0-3 1))\n"
" )\n"
" )\n"
" ((or (zero? (+ (-> a0-2 0) -98)) (zero? (+ (-> a0-2 0) -66)))\n"
" (set! a0-4 (&-> a0-2 1))\n"
" (while\n"
" (and (>= (-> a0-4 0) (the-as uint 48)) (>= (the-as uint 49) (-> a0-4 0)))\n"
" (set! v0-0 (+ (+ (-> a0-4 0) -48) (the-as uint (shl v0-0 1))))\n"
" (set! a0-4 (&-> a0-4 1))\n"
" )\n"
" )\n"
" )\n"
" )\n"
" (else\n"
" (when\n"
" (= (-> a0-1 1) 45)\n"
" (set! v1-0 (quote #t))\n"
" (set! a0-1 (&-> a0-1 1))\n"
" (set! a1-47 a0-1)\n"
" )\n"
" (while\n"
" (and (>= (-> a0-1 0) (the-as uint 48)) (>= (the-as uint 57) (-> a0-1 0)))\n"
" (set! v0-0 (+ (+ (-> a0-1 0) -48) (the-as uint (* 10 v0-0))))\n"
" (set! a0-1 (&-> a0-1 1))\n"
" )\n"
" )\n"
" )\n"
" (cond (v1-0 (- v0-0)) (else (empty) v0-0))\n"
" )";
test_final_function(func, type, expected);
}