On 2007-10-02, at 10:46, Jan Rehders wrote:> where can I read more about this? I assume (hope) the lib provides > some kind of OCaml bindings? I could not find any trace of it in > the 2.1 release source so I guess it's currently SVN only?Jan, Here's a trivial example. $ cat metahelloworld.ml (* metahelloworld.ml *) open Llvm open Llvm_bitwriter let _ let filename = Sys.argv.(1) in let m = create_module filename in (* @greeting = global [14 x i8] c"Hello, world!\00" *) let greeting = define_global "greeting" (make_string_constant "Hello, world!" true) m in (* declare i32 @puts(i8*) *) let puts = declare_function "puts" (make_function_type i32_type [| make_pointer_type i8_type |] false) m in (* define i32 @main() { entry: *) let main = define_function "main" (make_function_type i32_type [| |] false) m in let at_entry = builder_at_end (entry_block main) in (* %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 0 *) let zero = make_int_constant i32_type 0 false in let str = build_gep greeting [| zero; zero |] "tmp" at_entry in (* call i32 @puts( i8* %tmp ) *) ignore (build_call puts [| str |] "" at_entry); (* ret void *) ignore (build_ret (make_null i32_type) at_entry); (* write the module to a file *) if not (write_bitcode_file m filename) then exit 1; dispose_module m $ ocamlopt -cc g++ llvm.cmxa llvm_bitwriter.cmxa -o metahelloworld metahelloworld.ml $ ./metahelloworld helloworld.bc $ llvm-dis < helloworld.bc ; ModuleID = '<stdin>' @greeting = global [14 x i8] c"Hello, world!\00" ; < [14 x i8]*> [#uses=1] declare i32 @puts(i8*) define i32 @main() { entry: %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 0 ; <i8*> [#uses=1] call i32 @puts( i8* %tmp ) ; <i32>:0 [#uses=0] ret i32 0 } $ llc -o helloworld.s helloworld.bc $ gcc -o helloworld helloworld.s $ ./helloworld Hello, world! — Gordon -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20071002/58336aef/attachment.html>
Hi, this looks very promising. Do you have any plans to add bindings for the use of an ExecutionEngine, especially recompileAndRelinkFunction? I've build an interactive toplevel implemented in OCaml and I have to pull of some stunts to be able to change the definition of a function. (emit a .ll file containing the code, looking up the function and calling removeBody, then reading the .ll file back in using ParseAssemblyString). I noticed that functions are represented as an llvalue which makes turning it into a Function* unsafe if I'm correct? greetings, Jan On 2. Okt 2007, at 19:51, Gordon Henriksen wrote:> On 2007-10-02, at 10:46, Jan Rehders wrote: > >> where can I read more about this? I assume (hope) the lib provides >> some kind of OCaml bindings? I could not find any trace of it in >> the 2.1 release source so I guess it's currently SVN only? > > Jan, > > Here's a trivial example. > > $ cat metahelloworld.ml > (* metahelloworld.ml *) > > open Llvm > open Llvm_bitwriter > > let _ > let filename = Sys.argv.(1) in > let m = create_module filename in > > (* @greeting = global [14 x i8] c"Hello, world!\00" *) > let greeting = define_global "greeting" (make_string_constant > "Hello, world!" true) > m in > > (* declare i32 @puts(i8*) *) > let puts = declare_function "puts" (make_function_type i32_type [| > make_pointer_type i8_type > |] false) m in > > (* define i32 @main() { > entry: *) > let main = define_function "main" (make_function_type > i32_type [| |] false) m in > let at_entry = builder_at_end (entry_block main) in > > (* %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 0 *) > let zero = make_int_constant i32_type 0 false in > let str = build_gep greeting [| zero; zero |] "tmp" at_entry in > > (* call i32 @puts( i8* %tmp ) *) > ignore (build_call puts [| str |] "" at_entry); > > (* ret void *) > ignore (build_ret (make_null i32_type) at_entry); > > (* write the module to a file *) > if not (write_bitcode_file m filename) then exit 1; > dispose_module m > > $ ocamlopt -cc g++ llvm.cmxa llvm_bitwriter.cmxa -o metahelloworld > metahelloworld.ml > $ ./metahelloworld helloworld.bc > $ llvm-dis < helloworld.bc > ; ModuleID = '<stdin>' > @greeting = global [14 x i8] c"Hello, world!\00" ; < > [14 x i8]*> [#uses=1] > > declare i32 @puts(i8*) > > define i32 @main() { > entry: > %tmp = getelementptr [14 x i8]* @greeting, i32 0, i32 > 0 ; <i8*> [#uses=1] > call i32 @puts( i8* %tmp ) ; <i32>:0 [#uses=0] > ret i32 0 > } > $ llc -o helloworld.s helloworld.bc > $ gcc -o helloworld helloworld.s > $ ./helloworld > Hello, world! > > — Gordon-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20071019/6d0089be/attachment.html>
On Oct 19, 2007, at 11:51, Jan Rehders wrote:> this looks very promising. Do you have any plans to add bindings > for the use of an ExecutionEngine, especially > recompileAndRelinkFunction?I'd considered it on the basis that others may find it useful, but I have no immediate need for it. Patches are welcome. Binding a method is trivial: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of- Mon-20071001/054282.html And even binding a new library is straightforward: 1. Add C bindings for the desired functionality. (Strictly speaking, this is optional.) http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ Analysis.h?view=markup&pathrev=42707 http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ Analysis.cpp?view=markup&pathrev=42707 2. Copy up a bindings project. http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ analysis/?pathrev=42707 http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/ocaml/ Makefile?r1=42707&r2=42706&pathrev=42707 3. And add tests for it. http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Bindings/ Ocaml/analysis.ml?view=markup&pathrev=42707> I've build an interactive toplevel implemented in OCaml and I have > to pull of some stunts to be able to change the definition of a > function. (emit a .ll file containing the code, looking up the > function and calling removeBody, then reading the .ll file back in > using ParseAssemblyString). I noticed that functions are > represented as an llvalue which makes turning it into a Function* > unsafe if I'm correct?Yes, llvalues are very weakly typed. If assertions are enabled in the LLVM build, then any misuses will be caught by the 'wrap' and 'unwrap' helpers in the C bindings. — Gordon -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20071019/ab541dcd/attachment.html>