I've started a fork of felix to modify our compiler's backend to target llvm
instead of c++. You can track it in the git repository
[here](http://git.felix-lang.org/?p=felix/llvm-felix.git).
For those unfamiliar with git, you can clone the repository by doing:
{{{
git clone http://git.felix-lang.org/r/felix/llvm-felix.git
}}}
Anyway, the support is very basic at the moment. But, it can turn this:
{{{
:::felix
#syntax <nugram.flxh>
open syntax felix;
type int = "i32";
fun add: int * int -> int = "add i32 $1, $2";
fun mul: int * int -> int = "mul i32 $1, $2";
body declare_exit = 'declare i32 [EMAIL PROTECTED](i32)';
proc exit: int = "call i32 [EMAIL PROTECTED](i32 $1)" requires declare_exit;
noinline fun foo (a:int, b:int) => a*a + 2*a*b + b*b;
var x = 1;
val y = 2;
val z = (foo (x, y)) + 3;
exit z;
}}}
Into this when run with `flxg test`:
{{{
:::llvm
declare i32 @exit(i32)
; ------------------------------
; C FUNC <8>: foo
define i32 @foo( i32 %a, i32 %b) {
entry:
%_tmp30 = mul i32 %a, %a
%_tmp31 = mul i32 2, %a
%_tmp32 = mul i32 %_tmp31, %b
%_tmp33 = add i32 %_tmp30, %_tmp32
%_tmp34 = mul i32 %b, %b
%_tmp35 = add i32 %_tmp33, %_tmp34
ret i32 %_tmp35
}
; ------------------------------
; C PROC <15>: main
define i32 @main(i32 %argc, i8** %argv) {
entry:
%x = bitcast i32 1 to i32
%y = bitcast i32 2 to i32
%_tmp36 = call i32 @foo(i32 %x, i32 %y)
%z = add i32 %_tmp36, 3
call i32 @exit(i32 %z)
ret i32 0
}
}}}
Which, when run with `cat test.ll | llvm-as - | llc - | gcc -x assembler -`,
and you run `a.out`, it will exit with the status code `12`.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Felix-language mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/felix-language