Skip to content

Commit

Permalink
[OCaml] Implement Llvm.MemoryBuffer.{of_string,as_string}
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193953 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
whitequark committed Nov 3, 2013
1 parent 88d74c3 commit f00a9e0
Show file tree
Hide file tree
Showing 4 changed files with 42 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 @@ -1167,6 +1167,8 @@ external build_ptrdiff : llvalue -> llvalue -> string -> llbuilder -> llvalue
module MemoryBuffer = struct
external of_file : string -> llmemorybuffer = "llvm_memorybuffer_of_file"
external of_stdin : unit -> llmemorybuffer = "llvm_memorybuffer_of_stdin"
external of_string : ?name:string -> string -> llmemorybuffer = "llvm_memorybuffer_of_string"
external as_string : llmemorybuffer -> string = "llvm_memorybuffer_as_string"
external dispose : llmemorybuffer -> unit = "llvm_memorybuffer_dispose"
end

Expand Down
7 changes: 7 additions & 0 deletions bindings/ocaml/llvm/llvm.mli
Original file line number Diff line number Diff line change
Expand Up @@ -2345,6 +2345,13 @@ module MemoryBuffer : sig
(** [of_stdin ()] is the memory buffer containing the contents of standard input.
If standard input is empty, then [IoError msg] is raised. *)
val of_stdin : unit -> llmemorybuffer

(** [of_string ~name s] is the memory buffer containing the contents of string [s].
The name of memory buffer is set to [name] if it is provided. *)
val of_string : ?name:string -> string -> llmemorybuffer

(** [as_string mb] is the string containing the contents of memory buffer [mb]. *)
val as_string : llmemorybuffer -> string

(** Disposes of a memory buffer. *)
val dispose : llmemorybuffer -> unit
Expand Down
24 changes: 24 additions & 0 deletions bindings/ocaml/llvm/llvm_ocaml.c
Original file line number Diff line number Diff line change
Expand Up @@ -1996,6 +1996,30 @@ CAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_stdin(value Unit) {
return MemBuf;
}

/* ?name:string -> string -> llmemorybuffer */
CAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value String) {
const char *NameCStr;
if(Name == Val_int(0))
NameCStr = "";
else
NameCStr = String_val(Field(Name, 0));

LLVMMemoryBufferRef MemBuf;
MemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(
String_val(String), caml_string_length(String), NameCStr);

return MemBuf;
}

/* llmemorybuffer -> string */
CAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
memcpy(String_val(String), LLVMGetBufferStart(MemBuf),
LLVMGetBufferSize(MemBuf));

return String;
}

/* llmemorybuffer -> unit */
CAMLprim value llvm_memorybuffer_dispose(LLVMMemoryBufferRef MemBuf) {
LLVMDisposeMemoryBuffer(MemBuf);
Expand Down
9 changes: 9 additions & 0 deletions test/Bindings/Ocaml/vmcore.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1320,6 +1320,14 @@ let test_pass_manager () =
end


(*===-- Memory Buffer -----------------------------------------------------===*)

let test_memory_buffer () =
group "memory buffer";
let buf = MemoryBuffer.of_string "foobar" in
insist ((MemoryBuffer.as_string buf) = "foobar")


(*===-- Writer ------------------------------------------------------------===*)

let test_writer () =
Expand Down Expand Up @@ -1350,5 +1358,6 @@ let _ =
suite "instructions" test_instructions;
suite "builder" test_builder;
suite "pass manager" test_pass_manager;
suite "memory buffer" test_memory_buffer;
suite "writer" test_writer; (* Keep this last; it disposes m. *)
exit !exit_status

0 comments on commit f00a9e0

Please sign in to comment.