Skip to content

Commit

Permalink
Add a way to look up a type by it's name in a module.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97379 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
Erick Tryzelaar committed Feb 28, 2010
1 parent 68bab98 commit d80ce75
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 0 deletions.
2 changes: 2 additions & 0 deletions bindings/ocaml/llvm/llvm.ml
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,8 @@ external define_type_name : string -> lltype -> llmodule -> bool
= "llvm_add_type_name"
external delete_type_name : string -> llmodule -> unit
= "llvm_delete_type_name"
external type_by_name : llmodule -> string -> lltype option
= "llvm_type_by_name"
external dump_module : llmodule -> unit = "llvm_dump_module"

(*===-- Types -------------------------------------------------------------===*)
Expand Down
5 changes: 5 additions & 0 deletions bindings/ocaml/llvm/llvm.mli
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,11 @@ external define_type_name : string -> lltype -> llmodule -> bool
external delete_type_name : string -> llmodule -> unit
= "llvm_delete_type_name"

(** [type_by_name m n] returns the type in the module [m] named [n], or [None]
if it does not exist. See the method [llvm::Module::getTypeByName]. *)
external type_by_name : llmodule -> string -> lltype option
= "llvm_type_by_name"

(** [dump_module m] prints the .ll representation of the module [m] to standard
error. See the method [llvm::Module::dump]. *)
external dump_module : llmodule -> unit = "llvm_dump_module"
Expand Down
12 changes: 12 additions & 0 deletions bindings/ocaml/llvm/llvm_ocaml.c
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,18 @@ CAMLprim value llvm_delete_type_name(value Name, LLVMModuleRef M) {
return Val_unit;
}

/* llmodule -> string -> lltype option */
CAMLprim value llvm_type_by_name(LLVMModuleRef M, value Name) {
CAMLparam1(Name);
LLVMTypeRef T;
if ((T = LLVMGetTypeByName(M, String_val(Name)))) {
value Option = alloc(1, 0);
Field(Option, 0) = (value) T;
CAMLreturn(Option);
}
CAMLreturn(Val_int(0));
}

/* llmodule -> unit */
CAMLprim value llvm_dump_module(LLVMModuleRef M) {
LLVMDumpModule(M);
Expand Down
8 changes: 8 additions & 0 deletions test/Bindings/Ocaml/vmcore.ml
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,14 @@ let test_types () =
let ty = opaque_type context in
insist (define_type_name "delete_type" ty m);
delete_type_name "delete_type" m;

(* RUN: grep {type_name.*opaque} < %t.ll
*)
group "type_name"; begin
let ty = opaque_type context in
insist (define_type_name "type_name" ty m);
insist ((type_by_name m "type_name") = Some ty)
end;

(* RUN: grep -v {recursive_type.*recursive_type} < %t.ll
*)
Expand Down

0 comments on commit d80ce75

Please sign in to comment.