summaryrefslogtreecommitdiff
path: root/bindings/ocaml/llvm/llvm_ocaml.c
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/ocaml/llvm/llvm_ocaml.c')
-rw-r--r--bindings/ocaml/llvm/llvm_ocaml.c161
1 files changed, 110 insertions, 51 deletions
diff --git a/bindings/ocaml/llvm/llvm_ocaml.c b/bindings/ocaml/llvm/llvm_ocaml.c
index f968db8efd0..af04ea25c8a 100644
--- a/bindings/ocaml/llvm/llvm_ocaml.c
+++ b/bindings/ocaml/llvm/llvm_ocaml.c
@@ -185,6 +185,69 @@ CAMLprim value llvm_mdkind_id(LLVMContextRef C, value Name) {
return Val_int(MDKindID);
}
+/*===-- Attributes --------------------------------------------------------===*/
+
+/* string -> llattrkind */
+CAMLprim value llvm_enum_attr_kind(value Name) {
+ unsigned Kind = LLVMGetEnumAttributeKindForName(
+ String_val(Name), caml_string_length(Name));
+ if(Kind == 0)
+ caml_raise_with_arg(*caml_named_value("Llvm.UnknownAttribute"), Name);
+ return Val_int(Kind);
+}
+
+/* llcontext -> int -> int64 -> llattribute */
+CAMLprim LLVMAttributeRef
+llvm_create_enum_attr_by_kind(LLVMContextRef C, value Kind, value Value) {
+ return LLVMCreateEnumAttribute(C, Int_val(Kind), Int64_val(Value));
+}
+
+/* llattribute -> bool */
+CAMLprim value llvm_is_enum_attr(LLVMAttributeRef A) {
+ return Val_int(LLVMIsEnumAttribute(A));
+}
+
+/* llattribute -> llattrkind */
+CAMLprim value llvm_get_enum_attr_kind(LLVMAttributeRef A) {
+ return Val_int(LLVMGetEnumAttributeKind(A));
+}
+
+/* llattribute -> int64 */
+CAMLprim value llvm_get_enum_attr_value(LLVMAttributeRef A) {
+ return caml_copy_int64(LLVMGetEnumAttributeValue(A));
+}
+
+/* llcontext -> kind:string -> name:string -> llattribute */
+CAMLprim LLVMAttributeRef llvm_create_string_attr(LLVMContextRef C,
+ value Kind, value Value) {
+ return LLVMCreateStringAttribute(C,
+ String_val(Kind), caml_string_length(Kind),
+ String_val(Value), caml_string_length(Value));
+}
+
+/* llattribute -> bool */
+CAMLprim value llvm_is_string_attr(LLVMAttributeRef A) {
+ return Val_int(LLVMIsStringAttribute(A));
+}
+
+/* llattribute -> string */
+CAMLprim value llvm_get_string_attr_kind(LLVMAttributeRef A) {
+ unsigned Length;
+ const char *String = LLVMGetStringAttributeKind(A, &Length);
+ value Result = caml_alloc_string(Length);
+ memcpy(String_val(Result), String, Length);
+ return Result;
+}
+
+/* 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(String_val(Result), String, Length);
+ return Result;
+}
+
/*===-- Modules -----------------------------------------------------------===*/
/* llcontext -> string -> llmodule */
@@ -1308,31 +1371,37 @@ CAMLprim value llvm_set_gc(value GC, LLVMValueRef Fn) {
return Val_unit;
}
-/* llvalue -> int32 -> unit */
-CAMLprim value llvm_add_function_attr(LLVMValueRef Arg, value PA) {
- LLVMAddFunctionAttr(Arg, Int32_val(PA));
+/* llvalue -> llattribute -> int -> unit */
+CAMLprim value llvm_add_function_attr(LLVMValueRef F, LLVMAttributeRef A,
+ value Index) {
+ LLVMAddAttributeAtIndex(F, Int_val(Index), A);
return Val_unit;
}
-/* llvalue -> string -> string -> unit */
-CAMLprim value llvm_add_target_dependent_function_attr(
- LLVMValueRef Arg, value A, value V) {
- LLVMAddTargetDependentFunctionAttr(Arg, String_val(A), String_val(V));
- return Val_unit;
+/* llvalue -> int -> llattribute array */
+CAMLprim value llvm_function_attrs(LLVMValueRef F, value Index) {
+ unsigned Length = LLVMGetAttributeCountAtIndex(F, Int_val(Index));
+ value Array = caml_alloc(Length, 0);
+ LLVMGetAttributesAtIndex(F, Int_val(Index),
+ (LLVMAttributeRef *) Op_val(Array));
+ return Array;
}
-/* llvalue -> int32 */
-CAMLprim value llvm_function_attr(LLVMValueRef Fn)
-{
- CAMLparam0();
- CAMLreturn(caml_copy_int32(LLVMGetFunctionAttr(Fn)));
+/* llvalue -> llattrkind -> int -> unit */
+CAMLprim value llvm_remove_enum_function_attr(LLVMValueRef F, value Kind,
+ value Index) {
+ LLVMRemoveEnumAttributeAtIndex(F, Int_val(Index), Int_val(Kind));
+ return Val_unit;
}
-/* llvalue -> int32 -> unit */
-CAMLprim value llvm_remove_function_attr(LLVMValueRef Arg, value PA) {
- LLVMRemoveFunctionAttr(Arg, Int32_val(PA));
+/* llvalue -> string -> int -> unit */
+CAMLprim value llvm_remove_string_function_attr(LLVMValueRef F, value Kind,
+ value Index) {
+ LLVMRemoveStringAttributeAtIndex(F, Int_val(Index), String_val(Kind),
+ caml_string_length(Kind));
return Val_unit;
}
+
/*--... Operations on parameters ...........................................--*/
DEFINE_ITERATORS(param, Param, LLVMValueRef, LLVMValueRef, LLVMGetParamParent)
@@ -1342,13 +1411,6 @@ CAMLprim LLVMValueRef llvm_param(LLVMValueRef Fn, value Index) {
return LLVMGetParam(Fn, Int_val(Index));
}
-/* llvalue -> int */
-CAMLprim value llvm_param_attr(LLVMValueRef Param)
-{
- CAMLparam0();
- CAMLreturn(caml_copy_int32(LLVMGetAttribute(Param)));
-}
-
/* llvalue -> llvalue */
CAMLprim value llvm_params(LLVMValueRef Fn) {
value Params = alloc(LLVMCountParams(Fn), 0);
@@ -1356,24 +1418,6 @@ CAMLprim value llvm_params(LLVMValueRef Fn) {
return Params;
}
-/* llvalue -> int32 -> unit */
-CAMLprim value llvm_add_param_attr(LLVMValueRef Arg, value PA) {
- LLVMAddAttribute(Arg, Int32_val(PA));
- return Val_unit;
-}
-
-/* llvalue -> int32 -> unit */
-CAMLprim value llvm_remove_param_attr(LLVMValueRef Arg, value PA) {
- LLVMRemoveAttribute(Arg, Int32_val(PA));
- return Val_unit;
-}
-
-/* llvalue -> int -> unit */
-CAMLprim value llvm_set_param_alignment(LLVMValueRef Arg, value align) {
- LLVMSetParamAlignment(Arg, Int_val(align));
- return Val_unit;
-}
-
/*--... Operations on basic blocks .........................................--*/
DEFINE_ITERATORS(
@@ -1500,19 +1544,34 @@ CAMLprim value llvm_set_instruction_call_conv(value CC, LLVMValueRef Inst) {
return Val_unit;
}
-/* llvalue -> int -> int32 -> unit */
-CAMLprim value llvm_add_instruction_param_attr(LLVMValueRef Instr,
- value index,
- value PA) {
- LLVMAddInstrAttribute(Instr, Int_val(index), Int32_val(PA));
+/* llvalue -> llattribute -> int -> unit */
+CAMLprim value llvm_add_call_site_attr(LLVMValueRef F, LLVMAttributeRef A,
+ value Index) {
+ LLVMAddCallSiteAttribute(F, Int_val(Index), A);
+ return Val_unit;
+}
+
+/* llvalue -> int -> llattribute array */
+CAMLprim value llvm_call_site_attrs(LLVMValueRef F, value Index) {
+ unsigned Count = LLVMGetCallSiteAttributeCount(F, Int_val(Index));
+ value Array = caml_alloc(Count, 0);
+ LLVMGetCallSiteAttributes(F, Int_val(Index),
+ (LLVMAttributeRef *)Op_val(Array));
+ return Array;
+}
+
+/* llvalue -> llattrkind -> int -> unit */
+CAMLprim value llvm_remove_enum_call_site_attr(LLVMValueRef F, value Kind,
+ value Index) {
+ LLVMRemoveCallSiteEnumAttribute(F, Int_val(Index), Int_val(Kind));
return Val_unit;
}
-/* llvalue -> int -> int32 -> unit */
-CAMLprim value llvm_remove_instruction_param_attr(LLVMValueRef Instr,
- value index,
- value PA) {
- LLVMRemoveInstrAttribute(Instr, Int_val(index), Int32_val(PA));
+/* llvalue -> string -> int -> unit */
+CAMLprim value llvm_remove_string_call_site_attr(LLVMValueRef F, value Kind,
+ value Index) {
+ LLVMRemoveCallSiteStringAttribute(F, Int_val(Index), String_val(Kind),
+ caml_string_length(Kind));
return Val_unit;
}