関数定義と関数呼び出しを行うRP2350コードを出力
関数の定義と呼び出しを行えるようにする。
code:my_add.ml
let rec my_add x y = x + y in print_int (my_add 100 200)
中間コードを確認
code:sh
$ rlwrap ./min-caml.top
# let src = "let rec my_add x y = x + y in print_int (my_add 100 200)" in Virtual.f (Closure.f (Alpha.f (KNormal.f (Typing.f (MyParser.exp MyLexer.token (Lexing.from_string src))))));;
free variable print_int assumed as external
directly applying my_add.18
eliminating closure(s) my_add.18
- : Asm.prog =
Asm.Prog ([],
body = Asm.Ans (Asm.Add ("x.19", Asm.V "y.20")); ret = Type.Int}],
Asm.Let (("Ti15.22", Type.Int), Asm.Li 100,
Asm.Let (("Ti16.23", Type.Int), Asm.Li 200,
Asm.Let (("Ti17.21", Type.Int),
Asm.Ans (Asm.CallDir (Id.L "min_caml_print_int", "Ti17.21", [])))))) 修正箇所
code:diff
diff --git a/RP2350/emit.ml b/RP2350/emit.ml
index de38b75..9977a03 100644
--- a/RP2350/emit.ml
+++ b/RP2350/emit.ml
@@ -117,7 +117,7 @@ and g' oc = function (* 各命令のアセンブリ生成 (caml2html: emit_gprim
Printf.fprintf oc "\tblr\n";
| Tail, (Li _ | SetL _ | Mr _ | Neg _ | Add _ | Sub _ | Slw _ | Lwz _ as exp) ->
g' oc (NonTail(regs.(0)), exp);
- Printf.fprintf oc "\tblr\n";
+ Printf.fprintf oc "\tbx lr\n";
| Tail, (FLi _ | FMr _ | FNeg _ | FAdd _ | FSub _ | FMul _ | FDiv _ | Lfd _ as exp) ->
g' oc (NonTail(fregs.(0)), exp);
Printf.fprintf oc "\tblr\n";
diff --git a/test/4649.S b/test/4649.S
deleted file mode 100644
index 6cb41dc..0000000
--- a/test/4649.S
+++ /dev/null
@@ -1,11 +0,0 @@
- .text
- .syntax unified
- .thumb
- .globl min_caml_start
-min_caml_start: # main entry point
-# main program starts
- ldr r0, =4649
- bl min_caml_print_int
- bl min_caml_print_newline
-# main program ends
- bx lr
動かしてみる。ちゃんと動いてそう。
code:sh
$ touch sample/my_add.ml && make clean min-caml min-caml.top sample/my_add.res
...
Hello from QEMU mps2-an505 Cortex-M33!
300