#include "gtest/gtest.h" #include "FormRegressionTest.h" using namespace decompiler; TEST_F(FormRegressionTest, ExprArrayMethod2) { std::string func = " sll r0, r0, 0\n" "L130:\n" " daddiu sp, sp, -48\n" " sd ra, 0(sp)\n" " sd fp, 8(sp)\n" " or fp, t9, r0\n" " sq s5, 16(sp)\n" " sq gp, 32(sp)\n" " or gp, a0, r0\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L342\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " lw t9, type-type?(s7)\n" " lwu a0, 8(gp)\n" " lw a1, integer(s7)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " beq s7, v0, L182\n" " sll r0, r0, 0\n" " lwu v1, 8(gp)\n" " lwu v1, 0(v1)\n" " daddiu a0, s7, int32\n" " bne v1, a0, L135\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L134\n" " sll r0, r0, 0\n" "L131:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L132\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L133\n" " sll r0, r0, 0\n" "L132:\n" " daddiu a1, fp, L340\n" "L133:\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L134:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L131\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L135:\n" " daddiu a0, s7, uint32\n" " bne v1, a0, L140\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L139\n" " sll r0, r0, 0\n" "L136:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L137\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L138\n" " sll r0, r0, 0\n" "L137:\n" " daddiu a1, fp, L340\n" "L138:\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lwu a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L139:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L136\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L140:\n" " daddiu a0, s7, int64\n" " bne v1, a0, L145\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L144\n" " sll r0, r0, 0\n" "L141:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L142\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L143\n" " sll r0, r0, 0\n" "L142:\n" " daddiu a1, fp, L340\n" "L143:\n" " dsll v1, s5, 3\n" " daddu v1, v1, gp\n" " ld a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L144:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L141\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L145:\n" " daddiu a0, s7, uint64\n" " bne v1, a0, L150\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L149\n" " sll r0, r0, 0\n" "L146:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L147\n" " sll r0, r0, 0\n" " daddiu a1, fp, L339\n" " beq r0, r0, L148\n" " sll r0, r0, 0\n" "L147:\n" " daddiu a1, fp, L338\n" "L148:\n" " dsll v1, s5, 3\n" " daddu v1, v1, gp\n" " ld a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L149:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L146\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L150:\n" " daddiu a0, s7, int8\n" " bne v1, a0, L155\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L154\n" " sll r0, r0, 0\n" "L151:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L152\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L153\n" " sll r0, r0, 0\n" "L152:\n" " daddiu a1, fp, L340\n" "L153:\n" " daddu v1, s5, gp\n" " lb a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L154:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L151\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L155:\n" " daddiu a0, s7, uint8\n" " bne v1, a0, L160\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L159\n" " sll r0, r0, 0\n" "L156:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L157\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L158\n" " sll r0, r0, 0\n" "L157:\n" " daddiu a1, fp, L340\n" "L158:\n" " daddu v1, s5, gp\n" " lbu a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L159:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L156\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L160:\n" " daddiu a0, s7, int16\n" " bne v1, a0, L165\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L164\n" " sll r0, r0, 0\n" "L161:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L162\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L163\n" " sll r0, r0, 0\n" "L162:\n" " daddiu a1, fp, L340\n" "L163:\n" " dsll v1, s5, 1\n" " daddu v1, v1, gp\n" " lh a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L164:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L161\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L165:\n" " daddiu a0, s7, uint16\n" " bne v1, a0, L170\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L169\n" " sll r0, r0, 0\n" "L166:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L167\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L168\n" " sll r0, r0, 0\n" "L167:\n" " daddiu a1, fp, L340\n" "L168:\n" " dsll v1, s5, 1\n" " daddu v1, v1, gp\n" " lhu a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L169:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L166\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L170:\n" " daddiu a0, s7, uint128\n" " dsubu a0, v1, a0\n" " daddiu a1, s7, 8\n" " movn a1, s7, a0\n" " bnel s7, a1, L171\n" " or v1, a1, r0\n" " daddiu a0, s7, int128\n" " dsubu a0, v1, a0\n" " daddiu v1, s7, 8\n" " movn v1, s7, a0\n" "L171:\n" " beq s7, v1, L176\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L175\n" " sll r0, r0, 0\n" "L172:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L173\n" " sll r0, r0, 0\n" " daddiu a1, fp, L339\n" " beq r0, r0, L174\n" " sll r0, r0, 0\n" "L173:\n" " daddiu a1, fp, L338\n" "L174:\n" " dsll v1, s5, 4\n" " daddu v1, v1, gp\n" " lq a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L175:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L172\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L181\n" " sll r0, r0, 0\n" "L176:\n" " addiu s5, r0, 0\n" " beq r0, r0, L180\n" " sll r0, r0, 0\n" "L177:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " bne s5, r0, L178\n" " sll r0, r0, 0\n" " daddiu a1, fp, L341\n" " beq r0, r0, L179\n" " sll r0, r0, 0\n" "L178:\n" " daddiu a1, fp, L340\n" "L179:\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " daddiu s5, s5, 1\n" "L180:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L177\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" "L181:\n" " beq r0, r0, L192\n" " sll r0, r0, 0\n" "L182:\n" " lw v1, float(s7)\n" " lwu a0, 8(gp)\n" " bne a0, v1, L187\n" " sll r0, r0, 0\n" " addiu s5, r0, 0\n" " beq r0, r0, L186\n" " sll r0, r0, 0\n" "L183:\n" " bne s5, r0, L184\n" " sll r0, r0, 0\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L343\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " or v1, v0, r0\n" " beq r0, r0, L185\n" " sll r0, r0, 0\n" "L184:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L337\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " or v1, v0, r0\n" "L185:\n" " daddiu s5, s5, 1\n" "L186:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L183\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L192\n" " sll r0, r0, 0\n" "L187:\n" " addiu s5, r0, 0\n" " beq r0, r0, L191\n" " sll r0, r0, 0\n" "L188:\n" " bne s5, r0, L189\n" " sll r0, r0, 0\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L336\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " or v1, v0, r0\n" " beq r0, r0, L190\n" " sll r0, r0, 0\n" "L189:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L335\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a2, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " or v1, v0, r0\n" "L190:\n" " daddiu s5, s5, 1\n" "L191:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L188\n" " sll r0, r0, 0\n" " or v1, s7, r0\n" " or v1, s7, r0\n" "L192:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L334\n" " jalr ra, t9\n" " sll v0, ra, 0\n" " or v0, gp, r0\n" " ld ra, 0(sp)\n" " ld fp, 8(sp)\n" " lq gp, 32(sp)\n" " lq s5, 16(sp)\n" " jr ra\n" " daddiu sp, sp, 48"; std::string type = "(function array array)"; std::string expected = "(begin\n" " (format #t \"#(\")\n" " (if\n" " (type-type? (-> arg0 content-type) integer)\n" " (let\n" " ((v1-1 (-> arg0 content-type symbol)))\n" " (cond\n" " ((= v1-1 (quote int32))\n" " (dotimes\n" " (s5-0 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-0) \"~D\" \" ~D\")\n" " (-> (the-as (array int32) arg0) s5-0)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote uint32))\n" " (dotimes\n" " (s5-1 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-1) \"~D\" \" ~D\")\n" " (-> (the-as (array uint32) arg0) s5-1)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote int64))\n" " (dotimes\n" " (s5-2 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-2) \"~D\" \" ~D\")\n" " (-> (the-as (array int64) arg0) s5-2)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote uint64))\n" " (dotimes\n" " (s5-3 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-3) \"#x~X\" \" #x~X\")\n" " (-> (the-as (array uint64) arg0) s5-3)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote int8))\n" " (dotimes\n" " (s5-4 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-4) \"~D\" \" ~D\")\n" " (-> (the-as (array int8) arg0) s5-4)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote uint8))\n" " (dotimes\n" " (s5-5 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-5) \"~D\" \" ~D\")\n" " (-> (the-as (array uint8) arg0) s5-5)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote int16))\n" " (dotimes\n" " (s5-6 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-6) \"~D\" \" ~D\")\n" " (-> (the-as (array int16) arg0) s5-6)\n" " )\n" " )\n" " )\n" " ((= v1-1 (quote uint16))\n" " (dotimes\n" " (s5-7 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-7) \"~D\" \" ~D\")\n" " (-> (the-as (array uint16) arg0) s5-7)\n" " )\n" " )\n" " )\n" " (else\n" " (cond\n" " ((or (= v1-1 (quote uint128)) (= v1-1 (quote int128)))\n" " (dotimes\n" " (s5-8 (-> arg0 length))\n" " (let\n" " ((t9-10 format) (a0-21 #t) (a1-11 (if (zero? s5-8) \"#x~X\" \" #x~X\")))\n" " (let\n" " ((v1-42 (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))))\n" " (.lq a2-8 12 v1-42)\n" " )\n" " (t9-10 a0-21 a1-11 a2-8)\n" " )\n" " )\n" " )\n" " (else\n" " (dotimes\n" " (s5-9 (-> arg0 length))\n" " (format\n" " #t\n" " (if (zero? s5-9) \"~D\" \" ~D\")\n" " (-> (the-as (array int32) arg0) s5-9)\n" " )\n" " )\n" " )\n" " )\n" " )\n" " )\n" " )\n" " (cond\n" " ((= (-> arg0 content-type) float)\n" " (dotimes\n" " (s5-10 (-> arg0 length))\n" " (if\n" " (zero? s5-10)\n" " (format #t \"~f\" (-> (the-as (array float) arg0) s5-10))\n" " (format #t \" ~f\" (-> (the-as (array float) arg0) s5-10))\n" " )\n" " )\n" " )\n" " (else\n" " (dotimes\n" " (s5-11 (-> arg0 length))\n" " (if\n" " (zero? s5-11)\n" " (format #t \"~A\" (-> (the-as (array basic) arg0) s5-11))\n" " (format #t \" ~A\" (-> (the-as (array basic) arg0) s5-11))\n" " )\n" " )\n" " )\n" " )\n" " )\n" " (format #t \")\")\n" " arg0\n" " )"; test_with_expr(func, type, expected, true, "array", {{"L343", "~f"}, {"L342", "#("}, {"L341", "~D"}, {"L340", " ~D"}, {"L339", "#x~X"}, {"L338", " #x~X"}, {"L337", " ~f"}, {"L336", "~A"}, {"L335", " ~A"}, {"L334", ")"}}, parse_cast_json("[" "\t\t[23, \"gp\", \"(array int32)\"],\n" "\t\t[43, \"gp\", \"(array uint32)\"],\n" "\t\t[63, \"gp\", \"(array int64)\"],\n" "\t\t[83, \"gp\", \"(array uint64)\"],\n" "\t\t[102, \"gp\", \"(array int8)\"],\n" "\t\t[121, \"gp\", \"(array uint8)\"],\n" "\t\t[141, \"gp\", \"(array int16)\"],\n" "\t\t[161, \"gp\", \"(array uint16)\"],\n" "\t\t[186, \"gp\", \"(array uint128)\"],\n" "\t\t[204, \"gp\", \"(array int32)\"],\n" "\t\t[223, \"gp\", \"(array float)\"],\n" "\t\t[232, \"gp\", \"(array float)\"],\n" "\t\t[249, \"gp\", \"(array basic)\"],\n" "\t\t[258, \"gp\", \"(array basic)\"]]")); } TEST_F(FormRegressionTest, ExprArrayMethod3) { std::string func = " sll r0, r0, 0\n" "L91:\n" " daddiu sp, sp, -48\n" " sd ra, 0(sp)\n" " sd fp, 8(sp)\n" " or fp, t9, r0\n" " sq s5, 16(sp)\n" " sq gp, 32(sp)\n" " or gp, a0, r0\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L333\n" " or a2, gp, r0\n" " lwu a3, -4(gp)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L332\n" " lw a2, 4(gp)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L331\n" " lw a2, 0(gp)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L330\n" " lwu a2, 8(gp)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L329\n" " lw a2, 4(gp)\n" " daddiu a3, gp, 12\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " lw t9, type-type?(s7)\n" " lwu a0, 8(gp)\n" " lw a1, integer(s7)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " beq s7, v0, L123\n" " sll r0, r0, 0\n" "\n" " lwu v1, 8(gp)\n" " lwu v1, 0(v1)\n" " daddiu a0, s7, int32\n" " bne v1, a0, L94\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L93\n" " sll r0, r0, 0\n" "\n" "L92:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L93:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L92\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L94:\n" " daddiu a0, s7, uint32\n" " bne v1, a0, L97\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L96\n" " sll r0, r0, 0\n" "\n" "L95:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lwu a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L96:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L95\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L97:\n" " daddiu a0, s7, int64\n" " bne v1, a0, L100\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L99\n" " sll r0, r0, 0\n" "\n" "L98:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 3\n" " daddu v1, v1, gp\n" " ld a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L99:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L98\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L100:\n" " daddiu a0, s7, uint64\n" " bne v1, a0, L103\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L102\n" " sll r0, r0, 0\n" "\n" "L101:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L327\n" " or a2, s5, r0\n" " dsll v1, s5, 3\n" " daddu v1, v1, gp\n" " ld a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L102:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L101\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L103:\n" " daddiu a0, s7, int8\n" " bne v1, a0, L106\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L105\n" " sll r0, r0, 0\n" "\n" "L104:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " daddu v1, s5, gp\n" " lb a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L105:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L104\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L106:\n" " daddiu a0, s7, uint8\n" " bne v1, a0, L109\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L108\n" " sll r0, r0, 0\n" "\n" "L107:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " daddu v1, s5, gp\n" " lb a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L108:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L107\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L109:\n" " daddiu a0, s7, int16\n" " bne v1, a0, L112\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L111\n" " sll r0, r0, 0\n" "\n" "L110:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 1\n" " daddu v1, v1, gp\n" " lh a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L111:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L110\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L112:\n" " daddiu a0, s7, uint16\n" " bne v1, a0, L115\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L114\n" " sll r0, r0, 0\n" "\n" "L113:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 1\n" " daddu v1, v1, gp\n" " lhu a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L114:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L113\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L115:\n" " daddiu a0, s7, int128\n" " dsubu a0, v1, a0\n" " daddiu a1, s7, 8\n" " movn a1, s7, a0\n" " bnel s7, a1, L116\n" " or v1, a1, r0\n" "\n" " daddiu a0, s7, uint128\n" " dsubu a0, v1, a0\n" " daddiu v1, s7, 8\n" " movn v1, s7, a0\n" "L116:\n" " beq s7, v1, L119\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L118\n" " sll r0, r0, 0\n" "\n" "L117:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L327\n" " or a2, s5, r0\n" " dsll v1, s5, 4\n" " daddu v1, v1, gp\n" " lq a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L118:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L117\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L122\n" " sll r0, r0, 0\n" "\n" "L119:\n" " addiu s5, r0, 0\n" " beq r0, r0, L121\n" " sll r0, r0, 0\n" "\n" "L120:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L328\n" " or a2, s5, r0\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L121:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L120\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" "L122:\n" " beq r0, r0, L129\n" " sll r0, r0, 0\n" "\n" "L123:\n" " lw v1, float(s7)\n" " lwu a0, 8(gp)\n" " bne a0, v1, L126\n" " sll r0, r0, 0\n" "\n" " addiu s5, r0, 0\n" " beq r0, r0, L125\n" " sll r0, r0, 0\n" "\n" "L124:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L326\n" " or a2, s5, r0\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lwc1 f0, 12(v1)\n" " mfc1 a3, f0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L125:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L124\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" " beq r0, r0, L129\n" " sll r0, r0, 0\n" "\n" "L126:\n" " addiu s5, r0, 0\n" " beq r0, r0, L128\n" " sll r0, r0, 0\n" "\n" "L127:\n" " lw t9, format(s7)\n" " daddiu a0, s7, #t\n" " daddiu a1, fp, L325\n" " or a2, s5, r0\n" " dsll v1, s5, 2\n" " daddu v1, v1, gp\n" " lw a3, 12(v1)\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " daddiu s5, s5, 1\n" "L128:\n" " lw v1, 0(gp)\n" " slt v1, s5, v1\n" " bne v1, r0, L127\n" " sll r0, r0, 0\n" "\n" " or v1, s7, r0\n" " or v1, s7, r0\n" "L129:\n" " or v0, gp, r0\n" " ld ra, 0(sp)\n" " ld fp, 8(sp)\n" " lq gp, 32(sp)\n" " lq s5, 16(sp)\n" " jr ra\n" " daddiu sp, sp, 48"; std::string type = "(function array array)"; std::string expected = "(begin\n" " (format #t \"[~8x] ~A~%\" arg0 (-> arg0 type))\n" " (format #t \"~Tallocated-length: ~D~%\" (-> arg0 allocated-length))\n" " (format #t \"~Tlength: ~D~%\" (-> arg0 length))\n" " (format #t \" ~Tcontent-type: ~A~%\" (-> arg0 content-type))\n" " (format #t \"~Tdata[~D]: @ #x~X~%\" (-> arg0 allocated-length) (-> arg0 data))\n" " (if\n" " (type-type? (-> arg0 content-type) integer)\n" " (let\n" " ((v1-1 (-> arg0 content-type symbol)))\n" " (cond\n" " ((= v1-1 (quote int32))\n" " (dotimes\n" " (s5-0 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-0 (-> (the-as (array int32) arg0) s5-0))\n" " )\n" " )\n" " ((= v1-1 (quote uint32))\n" " (dotimes\n" " (s5-1 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-1 (-> (the-as (array uint32) arg0) s5-1))\n" " )\n" " )\n" " ((= v1-1 (quote int64))\n" " (dotimes\n" " (s5-2 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-2 (-> (the-as (array int64) arg0) s5-2))\n" " )\n" " )\n" " ((= v1-1 (quote uint64))\n" " (dotimes\n" " (s5-3 (-> arg0 length))\n" " (format #t \"~T [~D] #x~X~%\" s5-3 (-> (the-as (array uint64) arg0) s5-3))\n" " )\n" " )\n" " ((= v1-1 (quote int8))\n" " (dotimes\n" " (s5-4 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-4 (-> (the-as (array int8) arg0) s5-4))\n" " )\n" " )\n" " ((= v1-1 (quote uint8))\n" " (dotimes\n" " (s5-5 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-5 (-> (the-as (array int8) arg0) s5-5))\n" " )\n" " )\n" " ((= v1-1 (quote int16))\n" " (dotimes\n" " (s5-6 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-6 (-> (the-as (array int16) arg0) s5-6))\n" " )\n" " )\n" " ((= v1-1 (quote uint16))\n" " (dotimes\n" " (s5-7 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-7 (-> (the-as (array uint16) arg0) s5-7))\n" " )\n" " )\n" " (else\n" " (cond\n" " ((or (= v1-1 (quote int128)) (= v1-1 (quote uint128)))\n" " (dotimes\n" " (s5-8 (-> arg0 length))\n" " (let\n" " ((t9-14 format) (a0-25 #t) (a1-15 \"~T [~D] #x~X~%\") (a2-13 s5-8))\n" " (let\n" " ((v1-42 (+ (shl s5-8 4) (the-as int (the-as (array uint128) arg0)))))\n" " (.lq a3-10 12 v1-42)\n" " )\n" " (t9-14 a0-25 a1-15 a2-13 a3-10)\n" " )\n" " )\n" " )\n" " (else\n" " (dotimes\n" " (s5-9 (-> arg0 length))\n" " (format #t \"~T [~D] ~D~%\" s5-9 (-> (the-as (array int32) arg0) s5-9))\n" " )\n" " )\n" " )\n" " )\n" " )\n" " )\n" " (cond\n" " ((= (-> arg0 content-type) float)\n" " (dotimes\n" " (s5-10 (-> arg0 length))\n" " (format #t \"~T [~D] ~f~%\" s5-10 (-> (the-as (array float) arg0) s5-10))\n" " )\n" " )\n" " (else\n" " (dotimes\n" " (s5-11 (-> arg0 length))\n" " (format #t \"~T [~D] ~A~%\" s5-11 (-> (the-as (array basic) arg0) s5-11))\n" " )\n" " )\n" " )\n" " )\n" " arg0\n" " )"; test_with_expr(func, type, expected, true, "array", {{"L333", "[~8x] ~A~%"}, {"L332", "~Tallocated-length: ~D~%"}, {"L331", "~Tlength: ~D~%"}, {"L330", " ~Tcontent-type: ~A~%"}, {"L329", "~Tdata[~D]: @ #x~X~%"}, {"L328", "~T [~D] ~D~%"}, {"L327", "~T [~D] #x~X~%"}, {"L326", "~T [~D] ~f~%"}, {"L325", "~T [~D] ~A~%"}}, parse_cast_json("[\t\t[44, \"gp\", \"(array int32)\"],\n" "\t\t[62, \"gp\", \"(array uint32)\"],\n" "\t\t[80, \"gp\", \"(array int64)\"],\n" "\t\t[98, \"gp\", \"(array uint64)\"],\n" "\t\t[115, \"gp\", \"(array int8)\"],\n" "\t\t[132, \"gp\", \"(array int8)\"],\n" "\t\t[150, \"gp\", \"(array int16)\"],\n" "\t\t[168, \"gp\", \"(array uint16)\"],\n" "\t\t[191, \"gp\", \"(array uint128)\"],\n" "\t\t[207, \"gp\", \"(array int32)\"],\n" "\t\t[226, \"gp\", \"(array float)\"],\n" "\t\t[243, \"gp\", \"(array basic)\"]]")); } TEST_F(FormRegressionTest, ExprValid) { std::string func = " sll r0, r0, 0\n" "L1:\n" " daddiu sp, sp, -80\n" " sd ra, 0(sp)\n" " sd fp, 8(sp)\n" " or fp, t9, r0\n" " sq s3, 16(sp)\n" " sq s4, 32(sp)\n" " sq s5, 48(sp)\n" " sq gp, 64(sp)\n" " or gp, a0, r0\n" " or s3, a1, r0\n" " or s4, a2, r0\n" " or s5, t0, r0\n" " daddiu v1, s7, -32768\n" " sltu v1, gp, v1\n" " daddiu a0, s7, 8\n" " movn a0, s7, v1\n" " beql s7, a0, L2\n" " or v1, a0, r0\n" "\n" " lui v1, 2048\n" " sltu a0, gp, v1\n" " daddiu v1, s7, 8\n" " movz v1, s7, a0\n" "L2:\n" " bne s7, s3, L8\n" " sll r0, r0, 0\n" "\n" " andi a0, gp, 3\n" " beq a0, r0, L4\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L3\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " daddiu a1, fp, L321\n" " or a0, s5, r0\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L3:\n" " or v0, s7, r0\n" " beq r0, r0, L7\n" " sll r0, r0, 0\n" "\n" "L4:\n" " bne s7, v1, L6\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L5\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L320\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L5:\n" " or v0, s7, r0\n" " beq r0, r0, L7\n" " sll r0, r0, 0\n" "\n" "L6:\n" " daddiu v0, s7, #t\n" "L7:\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L8:\n" " beql s7, a3, L9\n" " or a0, a3, r0\n" "\n" " beq s7, gp, L9\n" " daddiu a0, s7, 8\n" "\n" " or a0, s7, r0\n" "L9:\n" " beq s7, a0, L10\n" " sll r0, r0, 0\n" "\n" " daddiu v0, s7, #t\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L10:\n" " lw a0, structure(s7)\n" " bne s3, a0, L17\n" " sll r0, r0, 0\n" "\n" " andi a0, gp, 15\n" " beq a0, r0, L12\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L11\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L319\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L11:\n" " or v0, s7, r0\n" " beq r0, r0, L16\n" " sll r0, r0, 0\n" "\n" "L12:\n" " beql s7, v1, L13\n" " daddiu v1, s7, 8\n" "\n" " ori v1, r0, 32768\n" " daddu v1, v1, s7\n" " sltu a0, gp, v1\n" " daddiu v1, s7, 8\n" " movz v1, s7, a0\n" "L13:\n" " beq s7, v1, L15\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L14\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L318\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L14:\n" " or v0, s7, r0\n" " beq r0, r0, L16\n" " sll r0, r0, 0\n" "\n" "L15:\n" " daddiu v0, s7, #t\n" "L16:\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L17:\n" " lw a0, pair(s7)\n" " bne s3, a0, L23\n" " sll r0, r0, 0\n" "\n" " addiu a0, r0, 2\n" " andi a1, gp, 7\n" " beq a1, a0, L19\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L18\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L319\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L18:\n" " or v0, s7, r0\n" " beq r0, r0, L22\n" " sll r0, r0, 0\n" "\n" "L19:\n" " bne s7, v1, L21\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L20\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L318\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L20:\n" " or v0, s7, r0\n" " beq r0, r0, L22\n" " sll r0, r0, 0\n" "\n" "L21:\n" " daddiu v0, s7, #t\n" "L22:\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L23:\n" " lw a0, binteger(s7)\n" " bne s3, a0, L27\n" " sll r0, r0, 0\n" "\n" " andi v1, gp, 7\n" " bne v1, r0, L24\n" " sll r0, r0, 0\n" "\n" " daddiu v0, s7, #t\n" " beq r0, r0, L26\n" " sll r0, r0, 0\n" "\n" "L24:\n" " beq s7, s4, L25\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L319\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L25:\n" " or v0, s7, r0\n" "L26:\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L27:\n" " addiu a0, r0, 4\n" " andi a1, gp, 7\n" " beq a1, a0, L29\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L28\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L319\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L28:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L29:\n" " bne s7, v1, L31\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L30\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L318\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L30:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L31:\n" " lw v1, type(s7)\n" " dsubu v1, s3, v1\n" " daddiu a0, s7, 8\n" " movn a0, s7, v1\n" " beql s7, a0, L33\n" " or v1, a0, r0\n" "\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L32\n" " lw v1, binteger(s7)\n" "\n" " bgtzl v1, L32\n" " lw v1, pair(s7)\n" "\n" " lwu v1, -4(gp)\n" "L32:\n" " lw a0, type(s7)\n" " dsubu a0, v1, a0\n" " daddiu v1, s7, 8\n" " movz v1, s7, a0\n" "L33:\n" " beq s7, v1, L36\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L35\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L317\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L34\n" " lw t1, binteger(s7)\n" "\n" " bgtzl v1, L34\n" " lw t1, pair(s7)\n" "\n" " lwu t1, -4(gp)\n" "L34:\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L35:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L36:\n" " lw v1, type(s7)\n" " dsubu v1, s3, v1\n" " daddiu a0, s7, 8\n" " movz a0, s7, v1\n" " beql s7, a0, L38\n" " or v1, a0, r0\n" "\n" " lw t9, valid?(s7)\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L37\n" " lw a0, binteger(s7)\n" "\n" " bgtzl v1, L37\n" " lw a0, pair(s7)\n" "\n" " lwu a0, -4(gp)\n" "L37:\n" " lw a1, type(s7)\n" " or a2, s7, r0\n" " daddiu a3, s7, #t\n" " addiu t0, r0, 0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " beq s7, v0, L38\n" " daddiu v1, s7, 8\n" "\n" " or v1, s7, r0\n" "L38:\n" " beq s7, v1, L41\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L40\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L317\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L39\n" " lw t1, binteger(s7)\n" "\n" " bgtzl v1, L39\n" " lw t1, pair(s7)\n" "\n" " lwu t1, -4(gp)\n" "L39:\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L40:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L41:\n" " lw t9, type-type?(s7)\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L42\n" " lw a0, binteger(s7)\n" "\n" " bgtzl v1, L42\n" " lw a0, pair(s7)\n" "\n" " lwu a0, -4(gp)\n" "L42:\n" " or a1, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " bne s7, v0, L45\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L44\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L316\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " dsll32 v1, gp, 29\n" " beql v1, r0, L43\n" " lw t1, binteger(s7)\n" "\n" " bgtzl v1, L43\n" " lw t1, pair(s7)\n" "\n" " lwu t1, -4(gp)\n" "L43:\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L44:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L45:\n" " lw v1, symbol(s7)\n" " bne s3, v1, L49\n" " sll r0, r0, 0\n" "\n" " ori v1, r0, 32768\n" " daddu v1, v1, s7\n" " sltu v1, gp, v1\n" " bne v1, r0, L47\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L46\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L315\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L46:\n" " or v0, s7, r0\n" " beq r0, r0, L48\n" " sll r0, r0, 0\n" "\n" "L47:\n" " daddiu v0, s7, #t\n" "L48:\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L49:\n" " ori v1, r0, 32768\n" " daddu v1, v1, s7\n" " sltu v1, gp, v1\n" " beq v1, r0, L51\n" " sll r0, r0, 0\n" "\n" " beq s7, s4, L50\n" " or v1, s7, r0\n" "\n" " lw t9, format(s7)\n" " or a0, s5, r0\n" " daddiu a1, fp, L314\n" " or a2, gp, r0\n" " or a3, s4, r0\n" " or t0, s3, r0\n" " jalr ra, t9\n" " sll v0, ra, 0\n" "\n" " or v1, v0, r0\n" "L50:\n" " or v0, s7, r0\n" " beq r0, r0, L52\n" " sll r0, r0, 0\n" "\n" "L51:\n" " daddiu v0, s7, #t\n" "L52:\n" " ld ra, 0(sp)\n" " ld fp, 8(sp)\n" " lq gp, 64(sp)\n" " lq s5, 48(sp)\n" " lq s4, 32(sp)\n" " lq s3, 16(sp)\n" " jr ra\n" " daddiu sp, sp, 80\n"; std::string type = "(function object type basic basic object symbol)"; std::string expected = "(let\n" " ((v1-1\n" " (and\n" " (>= (the-as uint arg0) (the-as uint __START-OF-TABLE__))\n" " (< (the-as uint arg0) (the-as uint #x8000000))\n" " )\n" " )\n" " )\n" " (cond\n" " ((not arg1)\n" " (cond\n" " ((nonzero? (logand (the-as int arg0) 3))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object (misaligned)~%\"\n" " arg0\n" " arg2\n" " )\n" " )\n" " #f\n" " )\n" " ((not v1-1)\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object (bad address)~%\"\n" " arg0\n" " arg2\n" " )\n" " )\n" " #f\n" " )\n" " (else #t)\n" " )\n" " )\n" " ((and arg3 (not arg0)) #t)\n" " (else\n" " (cond\n" " ((= arg1 structure)\n" " (cond\n" " ((nonzero? (logand (the-as int arg0) 15))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " ((or\n" " (not v1-1)\n" " (begin\n" " (let ((v1-10 #x8000)) (.daddu v1-11 v1-10 s7-0))\n" " (< (the-as uint arg0) (the-as uint v1-11))\n" " )\n" " )\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " (else #t)\n" " )\n" " )\n" " ((= arg1 pair)\n" " (cond\n" " ((!= (logand (the-as int arg0) 7) 2)\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " ((not v1-1)\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " (else #t)\n" " )\n" " )\n" " ((= arg1 binteger)\n" " (cond\n" " ((zero? (logand (the-as int arg0) 7)) #t)\n" " (else\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " )\n" " )\n" " ((!= (logand (the-as int arg0) 7) 4)\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " ((not v1-1)\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " ((and (= arg1 type) (!= (rtype-of arg0) type))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type #x~X)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " (rtype-of arg0)\n" " )\n" " )\n" " #f\n" " )\n" " (else\n" " (cond\n" " ((and (!= arg1 type) (not (valid? (rtype-of arg0) type #f #t 0)))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type " "#x~X)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " (rtype-of arg0)\n" " )\n" " )\n" " #f\n" " )\n" " ((not (type-type? (rtype-of arg0) arg1))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (is type '~A' " "instead)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " (rtype-of arg0)\n" " )\n" " )\n" " #f\n" " )\n" " ((= arg1 symbol)\n" " (let ((v1-43 #x8000)) (.daddu v1-44 v1-43 s7-0))\n" " (cond\n" " ((>= (the-as uint arg0) (the-as uint v1-44))\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (not in symbol " "table)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " (else #t)\n" " )\n" " )\n" " ((begin\n" " (let ((v1-47 #x8000)) (.daddu v1-48 v1-47 s7-0))\n" " (< (the-as uint arg0) (the-as uint v1-48))\n" " )\n" " (if\n" " arg2\n" " (format\n" " arg4\n" " \"ERROR: object #x~X ~S is not a valid object of type '~A' (inside symbol " "table)~%\"\n" " arg0\n" " arg2\n" " arg1\n" " )\n" " )\n" " #f\n" " )\n" " (else #t)\n" " )\n" " )\n" " )\n" " )\n" " )\n" " )"; test_with_expr( func, type, expected, false, "", {{"L321", "ERROR: object #x~X ~S is not a valid object (misaligned)~%"}, {"L320", "ERROR: object #x~X ~S is not a valid object (bad address)~%"}, {"L319", "ERROR: object #x~X ~S is not a valid object of type '~A' (misaligned)~%"}, {"L318", "ERROR: object #x~X ~S is not a valid object of type '~A' (bad address)~%"}, {"L317", "ERROR: object #x~X ~S is not a valid object of type '~A' (invalid type #x~X)~%"}, {"L316", "ERROR: object #x~X ~S is not a valid object of type '~A' (is type '~A' instead)~%"}, {"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" " (let\n" " ((a0-1 (-> arg0 data)) (v0-0 0) (v1-0 #f))\n" " (cond\n" " ((= (-> a0-1 0) 35)\n" " (let\n" " ((a0-2 (&-> a0-1 1)))\n" " (cond\n" " ((or (= (-> a0-2 0) 120) (= (-> a0-2 0) 88))\n" " (let\n" " ((a0-3 (&-> a0-2 1)))\n" " (when\n" " (= (-> a0-3 1) 45)\n" " (set! v1-0 #t)\n" " (set! a0-3 (&-> a0-3 1))\n" " (let ((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" " (let ((a1-14 (the-as uint v0-0))))\n" " )\n" " (else\n" " (cond\n" " ((and\n" " (>= (-> a0-3 0) (the-as uint 97))\n" " (>= (the-as uint 102) (-> a0-3 0))\n" " )\n" " (set! v0-0 (+ (+ (-> a0-3 0) -87) (the-as uint (shl v0-0 4))))\n" " (let ((a1-20 (the-as uint v0-0))))\n" " )\n" " (else\n" " (set! v0-0 (+ (+ (-> a0-3 0) -48) (the-as uint (shl v0-0 4))))\n" " (let ((a1-23 (the-as uint v0-0))))\n" " )\n" " )\n" " )\n" " )\n" " (set! a0-3 (&-> a0-3 1))\n" " )\n" " )\n" " )\n" " ((or (= (-> a0-2 0) 98) (= (-> a0-2 0) 66))\n" " (let\n" " ((a0-4 (&-> a0-2 1)))\n" " (while\n" " (and\n" " (>= (-> a0-4 0) (the-as uint 48))\n" " (>= (the-as uint 49) (-> a0-4 0))\n" " )\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" " )\n" " )\n" " (else\n" " (when\n" " (= (-> a0-1 1) 45)\n" " (set! v1-0 #t)\n" " (set! a0-1 (&-> a0-1 1))\n" " (let ((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" " )\n" " )"; test_final_function(func, type, expected); }