[LLVMdev] C interface

Gordon Henriksen gordonhenriksen at mac.com
Tue Sep 11 22:01:54 PDT 2007


Hi all,

I'm authoring a C interface to the LLVM IR type system. Since this is  
Really Quite Tedious, I would like to solicit opinions before I get  
too far down any paths that seem offensive. I've attached the header,  
where I've mapped a portion of Module and most of Type and its  
subclasses. This is working, and I've built ocaml bindings on top of  
it.[1] My intent is to extend this work (only) far enough to author a  
language front-end. The C bindings should help other languages which  
want to have self-hosting front-ends, and probably a C interface to  
the JIT would be well-received.

My naming conventions are similar to the Carbon interfaces in OS X.  
(Should I prefer a Unixy flavor instead?) Naming prefix is LLVM,  
which may be a bit long. (Would LL be better?) Pointers are opaque,  
obviously. I find myself copying enums, which is mildly scary.

I'm using C strings instead of const char*, size_t tuples. This  
avoids having to write things like "tmp", strlen("tmp") in C, and is  
well-supported for language bindings. Nevertheless, most languages  
other than C have binary-safe string types, so I'm certainly willing  
to have my mind changed if we want to prefer correctness over  
inconvenience to the C programmer. (Providing overloads is silly,  
though.)

I'm putting the headers in include/llvm-c. I created a new library  
called Interop to house the C bindings—but it might make more sense  
to implement the C bindings in each library instead. They're just  
glue which the linker will trivially DCE, so that approach may have  
merit.

— Gordon


[1]
$ cat emit_bc.ml
open Llvm

let emit_bc filename =
   let m = create_module filename in

   let big_fn_ty = make_pointer_type
     (make_function_type (void_type ())
                         [| make_vector_type (float_type ()) 4;
                            make_pointer_type
                              (make_struct_type [| double_type ();
                                                   x86fp80_type ();
                                                   fp128_type ();
                                                   ppc_fp128_type ()  
|] true);
                            make_pointer_type
                              (make_struct_type [| make_integer_type 1;
                                                   make_integer_type 3;
                                                   i8_type ();
                                                   i32_type () |]  
false);
                            make_pointer_type
                              (make_array_type (make_opaque_type ())  
4) |]
                         false) in

   (* string_of_lltype is implemented in ocaml, so the info on stdout
      shows that make_*_type isn't a write-once/read-never interface. *)
   print_endline ("big_fn_ty = " ^ (string_of_lltype big_fn_ty));

   ignore(add_type_name m "big_fn_ty" big_fn_ty);

   if not (write_bitcode_file m filename)
     then print_endline ("write failed: " ^ filename);

   dispose_module m

let _ =
   if 2 = Array.length Sys.argv
     then emit_bc Sys.argv.(1)
     else print_endline "Usage: emit_bc FILE"

$ make emit_bc
ocamlc -cc g++ -I ../llvm/Release/lib/ocaml llvm_ml.cma -o emit_bc  
emit_bc.ml
$ ./emit_bc test.bc
big_fn_ty = void (< 4 x float >, { double, x86fp80, fp128, ppc_fp128 } 
*, { i1, i3, i8, i32 }*, [ 4 x opaque ]*)*
$ llvm-dis -o - test.bc
; ModuleID = 'test.bc'
         %big_fn_ty = type void (<4 x float>, <{ double, x86_fp80,  
fp128, ppc_fp128 }>*, { i1, i3, i8, i32 }*, [4 x opaque]*)*



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070912/6384e755/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: VMCore.h
Type: application/octet-stream
Size: 5377 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070912/6384e755/attachment.obj>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20070912/6384e755/attachment-0001.html>


More information about the llvm-dev mailing list