関数生成
using gcc; namespace langhook { function expand_stmt(stmts) { expand_expr_stmt( stmts.value ); } }; var gi = get_identifier; var global_id = gi("global"); var global_decl = build_decl( VAR_DECL, global_id, types.int ); with (global_decl) { initial = 4; used = true; static = true; public = true; external = false; } expand_decl( global_decl ); expand_decl_init( global_decl ); rest_of_decl_compilation( global_decl, null, true, false ); function gen_body() { var rhs = build( PLUS_EXPR, types.int, 1, 2 ); var lhs = global_decl; return [ build( MODIFY_EXPR, types.int, lhs, rhs ) ]; } var x = gi("hoge"); var decl = build_decl( FUNCTION_DECL, x, types.int ); with (decl) { result = build_decl( RESULT_DECL, gi("ret1"), types.int ); type = build_function_type( types.int, [types.int,types.void] ); arguments = build_decl(PARM_DECL,gi("arg1"),types.int); arguments.chain = null; saved_tree = gen_body(); used = true; static = true; public = true; external = false; initial = make_node( BLOCK ); } expand_decl( decl ); expand_decl_init( decl ); tree_rest_of_compilation( decl, false );
これが、
.file "test.ilog" .globl global .data .align 4 .type global, @object .size global, 4 global: .long 4 .text .globl hoge .type hoge, @function hoge: pushl %ebp movl %esp, %ebp movl $3, global leave ret .size hoge, .-hoge .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4.1"
こうなる。(長いよ)
http://morihyphen.hp.infoseek.co.jp/files/ilog-20040928.tar.gz
お、
/bin/tar: 空の書庫作成はご容赦願います もっと詳しい情報は `/bin/tar --help' と入力すれば得られます.
tarのエラーメッセージってこんなのがあるのか。ご容赦されます。
TODO
さて、次はどうするか。
課題は死ぬほど残ってんだよな。5000行書いてまだ半分もできた気がしないのは始めてだ。
- 言語としてちゃんとする
- expand_hogehoge関数を色々動くようにしてもっと色々生成できるようにする
- 動作を安定させる
- 色々ライブラリを作って遊ぶ
- もう動いたのでなんか十分だからやめる
行番号とか、ループとか、GCからの保護とか、そういう細かいのが面倒なんだよなぁ…小人さんがやってくれないかなあ…
まあ、でも、基盤部分は大体できてるので、ここからはインクリメンタルにくっつけていけるはず。そんなうまくいくはず無いんだけど。
おっと、ネガティブなこと書く予定ぽかったけど、関数生成うまくいってなんかどうでもよくなった。この話はまた次にネガティブになった時のためにとっておこう。