Index: llvm/bindings/ocaml/llvm/llvm.ml =================================================================== --- llvm/bindings/ocaml/llvm/llvm.ml +++ llvm/bindings/ocaml/llvm/llvm.ml @@ -442,6 +442,13 @@ external set_module_inline_asm : llmodule -> string -> unit = "llvm_set_module_inline_asm" external module_context : llmodule -> llcontext = "LLVMGetModuleContext" + +external get_module_identifier : llmodule -> string + = "llvm_get_module_identifier" + +external set_module_identifer : llmodule -> string -> unit + = "llvm_set_module_identifier" + external get_module_flag : llmodule -> string -> llmetadata option = "llvm_get_module_flag" external add_module_flag : llmodule -> ModuleFlagBehavior.t -> Index: llvm/bindings/ocaml/llvm/llvm.mli =================================================================== --- llvm/bindings/ocaml/llvm/llvm.mli +++ llvm/bindings/ocaml/llvm/llvm.mli @@ -543,6 +543,14 @@ See the method [llvm::Module::getContext] *) val module_context : llmodule -> llcontext +(** [get_module_identifier m] returns the module identifier of the + specified module. See the method [llvm::Module::getModuleIdentifier] *) +val get_module_identifier : llmodule -> string + +(** [set_module_identifier m id] Sets the module identifier of [m] + to [id]. See the method [llvm::Module::setModuleIdentifier] *) +val set_module_identifer : llmodule -> string -> unit + (** [get_module_flag m k] Return the corresponding value if key [k] appears in the module flags of [m], otherwise return None See the method [llvm::Module::getModuleFlag] *) Index: llvm/bindings/ocaml/llvm/llvm_ocaml.h =================================================================== --- llvm/bindings/ocaml/llvm/llvm_ocaml.h +++ llvm/bindings/ocaml/llvm/llvm_ocaml.h @@ -25,6 +25,6 @@ CAMLprim value ptr_to_option(void *Ptr); /* Convert a C string into an OCaml string */ -CAMLprim value cstr_to_string(const unsigned char *Str, unsigned Len); +CAMLprim value cstr_to_string(const unsigned char *Str, mlsize_t Len); #endif // LLVM_LLVM_OCAML_H Index: llvm/bindings/ocaml/llvm/llvm_ocaml.c =================================================================== --- llvm/bindings/ocaml/llvm/llvm_ocaml.c +++ llvm/bindings/ocaml/llvm/llvm_ocaml.c @@ -44,12 +44,12 @@ CAMLreturn(Option); } -CAMLprim value cstr_to_string(const unsigned char *Str, unsigned Len) { +CAMLprim value cstr_to_string(const unsigned char *Str, mlsize_t Len) { CAMLparam0(); CAMLlocal1(String); if (Str) { String = caml_alloc_string(Len); - memcpy(String_val(Str), Str, Len); + memcpy(String_val(String), Str, Len); } else { String = caml_alloc_string(0); } @@ -335,6 +335,19 @@ CAMLreturn(ModuleStr); } +/* llmodule -> string */ +CAMLprim value llvm_get_module_identifier(LLVMModuleRef M) { + size_t Len; + const char *Name = LLVMGetModuleIdentifier(M, &Len); + return cstr_to_string(Name, (mlsize_t)Len); +} + +/* llmodule -> string -> unit */ +CAMLprim value llvm_set_module_identifier(LLVMModuleRef M, value Id) { + LLVMSetModuleIdentifier(M, String_val(Id), caml_string_length(Id)); + return Val_unit; +} + /* llmodule -> string -> unit */ CAMLprim value llvm_set_module_inline_asm(LLVMModuleRef M, value Asm) { LLVMSetModuleInlineAsm(M, String_val(Asm)); Index: llvm/test/Bindings/OCaml/core.ml =================================================================== --- llvm/test/Bindings/OCaml/core.ml +++ llvm/test/Bindings/OCaml/core.ml @@ -596,6 +596,10 @@ begin group "iteration"; let m = create_module context "temp" in + insist(get_module_identifier m = "temp"); + set_module_identifer m "temp2"; + insist(get_module_identifier m = "temp2"); + insist (At_end m = global_begin m); insist (At_start m = global_end m);