[OCaml] Code simplification using string allocation functions
authorJosh Berdine <josh@berdine.net>
Sat, 27 Mar 2021 23:00:47 +0000 (23:00 +0000)
committerJosh Berdine <josh@berdine.net>
Mon, 5 Apr 2021 09:55:07 +0000 (10:55 +0100)
Using the `cstr_to_string` function that allocates and initializes an
OCaml `string` value enables simplifications in several cases. This
change also has the effect of avoiding calling `memcpy` on NULL
pointers even if only 0 bytes are to be copied.

Differential Revision: https://reviews.llvm.org/D99474

llvm/bindings/ocaml/llvm/llvm_ocaml.c

index b6d1435..e6b4b4d 100644 (file)
@@ -279,18 +279,14 @@ CAMLprim value llvm_is_string_attr(LLVMAttributeRef A) {
 CAMLprim value llvm_get_string_attr_kind(LLVMAttributeRef A) {
   unsigned Length;
   const char *String = LLVMGetStringAttributeKind(A, &Length);
-  value Result = caml_alloc_string(Length);
-  memcpy((char *)String_val(Result), String, Length);
-  return Result;
+  return cstr_to_string (String, Length);
 }
 
 /* llattribute -> string */
 CAMLprim value llvm_get_string_attr_value(LLVMAttributeRef A) {
   unsigned Length;
   const char *String = LLVMGetStringAttributeValue(A, &Length);
-  value Result = caml_alloc_string(Length);
-  memcpy((char *)String_val(Result), String, Length);
-  return Result;
+  return cstr_to_string (String, Length);
 }
 
 /*===-- Modules -----------------------------------------------------------===*/
@@ -2512,11 +2508,9 @@ CAMLprim LLVMMemoryBufferRef llvm_memorybuffer_of_string(value Name, value Strin
 
 /* llmemorybuffer -> string */
 CAMLprim value llvm_memorybuffer_as_string(LLVMMemoryBufferRef MemBuf) {
-  value String = caml_alloc_string(LLVMGetBufferSize(MemBuf));
-  memcpy((char *)String_val(String), LLVMGetBufferStart(MemBuf),
-         LLVMGetBufferSize(MemBuf));
-
-  return String;
+  size_t BufferSize = LLVMGetBufferSize(MemBuf);
+  const char *BufferStart = LLVMGetBufferStart(MemBuf);
+  return cstr_to_string(BufferStart, BufferSize);
 }
 
 /* llmemorybuffer -> unit */