Skip to content

Commit 3ed6fc9

Browse files
committed
[llvm-ocaml] Add LLVMBuildCall2 binding
Add binding for the opaque pointer compatible LLVMBuildCall2 API and use it in tests.
1 parent 4b13b06 commit 3ed6fc9

File tree

7 files changed

+29
-18
lines changed

7 files changed

+29
-18
lines changed

llvm/bindings/ocaml/llvm/llvm.ml

+2
Original file line numberDiff line numberDiff line change
@@ -1370,6 +1370,8 @@ external build_empty_phi : lltype -> string -> llbuilder -> llvalue
13701370
= "llvm_build_empty_phi"
13711371
external build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue
13721372
= "llvm_build_call"
1373+
external build_call2 : lltype -> llvalue -> llvalue array -> string ->
1374+
llbuilder -> llvalue = "llvm_build_call2"
13731375
external build_select : llvalue -> llvalue -> llvalue -> string -> llbuilder ->
13741376
llvalue = "llvm_build_select"
13751377
external build_va_arg : llvalue -> lltype -> string -> llbuilder -> llvalue

llvm/bindings/ocaml/llvm/llvm.mli

+7
Original file line numberDiff line numberDiff line change
@@ -2583,6 +2583,13 @@ val build_empty_phi : lltype -> string -> llbuilder -> llvalue
25832583
See the method [llvm::LLVMBuilder::CreateCall]. *)
25842584
val build_call : llvalue -> llvalue array -> string -> llbuilder -> llvalue
25852585

2586+
(** [build_call2 fnty fn args name b] creates a
2587+
[%name = call %fn(args...)]
2588+
instruction at the position specified by the instruction builder [b].
2589+
See the method [llvm::LLVMBuilder::CreateCall]. *)
2590+
val build_call2 : lltype -> llvalue -> llvalue array -> string -> llbuilder ->
2591+
llvalue
2592+
25862593
(** [build_select cond thenv elsev name b] creates a
25872594
[%name = select %cond, %thenv, %elsev]
25882595
instruction at the position specified by the instruction builder [b].

llvm/bindings/ocaml/llvm/llvm_ocaml.c

+8
Original file line numberDiff line numberDiff line change
@@ -2245,6 +2245,14 @@ LLVMValueRef llvm_build_call(LLVMValueRef Fn, value Params, value Name,
22452245
Wosize_val(Params), String_val(Name));
22462246
}
22472247

2248+
/* lltype -> llvalue -> llvalue array -> string -> llbuilder -> llvalue */
2249+
LLVMValueRef llvm_build_call2(LLVMTypeRef FnTy, LLVMValueRef Fn, value Params,
2250+
value Name, value B) {
2251+
return LLVMBuildCall2(Builder_val(B), FnTy, Fn,
2252+
(LLVMValueRef *)Op_val(Params), Wosize_val(Params),
2253+
String_val(Name));
2254+
}
2255+
22482256
/* llvalue -> llvalue -> llvalue -> string -> llbuilder -> llvalue */
22492257
LLVMValueRef llvm_build_select(LLVMValueRef If, LLVMValueRef Then,
22502258
LLVMValueRef Else, value Name, value B) {

llvm/test/Bindings/OCaml/core.ml

+1-4
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,6 @@ let m = create_module context filename
3737
(*===-- Contained types --------------------------------------------------===*)
3838

3939
let test_contained_types () =
40-
let pointer_i32 = pointer_type i32_type in
41-
insist (i32_type = (Array.get (subtypes pointer_i32) 0));
42-
4340
let ar = struct_type context [| i32_type; i8_type |] in
4441
insist (i32_type = (Array.get (subtypes ar)) 0);
4542
insist (i8_type = (Array.get (subtypes ar)) 1)
@@ -1100,7 +1097,7 @@ let test_builder () =
11001097
* CHECK: %build_insertvalue0 = insertvalue{{.*}}%bl, i32 1, 0
11011098
* CHECK: %build_extractvalue = extractvalue{{.*}}%build_insertvalue1, 1
11021099
*)
1103-
let ci = build_call fn [| p2; p1 |] "build_call" atentry in
1100+
let ci = build_call2 fty fn [| p2; p1 |] "build_call" atentry in
11041101
insist (CallConv.c = instruction_call_conv ci);
11051102
set_instruction_call_conv 63 ci;
11061103
insist (63 = instruction_call_conv ci);

llvm/test/Bindings/OCaml/debuginfo.ml

+7-11
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,9 @@ let test_get_function m dibuilder file_di m_di =
152152
( Llvm_debuginfo.get_metadata_kind f_di
153153
= Llvm_debuginfo.MetadataKind.DISubprogramMetadataKind );
154154
insist (Llvm_debuginfo.di_subprogram_get_line f_di = 10);
155-
(f, f_di)
155+
(fty, f, f_di)
156156

157-
let test_bbinstr f f_di file_di dibuilder =
157+
let test_bbinstr fty f f_di file_di dibuilder =
158158
group "basic_block and instructions tests";
159159
(* Create this pattern:
160160
* if (arg0 != 0) {
@@ -169,11 +169,7 @@ let test_bbinstr f f_di file_di dibuilder =
169169
let truebb = Llvm.append_block context "truebb" f in
170170
let falsebb = Llvm.append_block context "falsebb" f in
171171
let _ = Llvm.build_cond_br cmpi truebb falsebb builder in
172-
let foodecl =
173-
Llvm.declare_function "foo"
174-
(Llvm.element_type (Llvm.type_of f))
175-
(Llvm.global_parent f)
176-
in
172+
let foodecl = Llvm.declare_function "foo" fty (Llvm.global_parent f) in
177173
let _ =
178174
Llvm.position_at_end truebb builder;
179175
let scope =
@@ -187,7 +183,7 @@ let test_bbinstr f f_di file_di dibuilder =
187183
| Some file_of_f_di', Some file_of_scope' ->
188184
file_of_f_di' = file_di && file_of_scope' = file_di
189185
| _ -> false );
190-
let foocall = Llvm.build_call foodecl [| arg0 |] "" builder in
186+
let foocall = Llvm.build_call2 fty foodecl [| arg0 |] "" builder in
191187
let foocall_loc =
192188
Llvm_debuginfo.dibuild_create_debug_location context ~line:10 ~column:12
193189
~scope
@@ -290,7 +286,7 @@ let test_variables f dibuilder file_di fun_di =
290286
~location ~instr:entry_term
291287
in
292288
let () = Printf.printf "%s\n" (Llvm.string_of_llvalue vdi) in
293-
(* CHECK: call void @llvm.dbg.declare(metadata i64* %my_alloca, metadata {{![0-9]+}}, metadata !DIExpression()), !dbg {{\![0-9]+}}
289+
(* CHECK: call void @llvm.dbg.declare(metadata ptr %my_alloca, metadata {{![0-9]+}}, metadata !DIExpression()), !dbg {{\![0-9]+}}
294290
*)
295291
let arg0 = (Llvm.params f).(0) in
296292
let arg_var = Llvm_debuginfo.dibuild_create_parameter_variable dibuilder ~scope:fun_di
@@ -446,8 +442,8 @@ let test_types dibuilder file_di m_di =
446442

447443
let () =
448444
let m, dibuilder, file_di, m_di = test_get_module () in
449-
let f, fun_di = test_get_function m dibuilder file_di m_di in
450-
let () = test_bbinstr f fun_di file_di dibuilder in
445+
let fty, f, fun_di = test_get_function m dibuilder file_di m_di in
446+
let () = test_bbinstr fty f fun_di file_di dibuilder in
451447
let () = test_global_variable_expression dibuilder file_di m_di in
452448
let () = test_variables f dibuilder file_di fun_di in
453449
let () = test_types dibuilder file_di m_di in

llvm/test/Bindings/OCaml/executionengine.ml

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,10 @@ let bomb msg =
2828
exit 2
2929

3030
let define_getglobal m pg =
31-
let fn = define_function "getglobal" (function_type i32_type [||]) m in
31+
let fty = function_type i32_type [||] in
32+
let fn = define_function "getglobal" fty m in
3233
let b = builder_at_end (global_context ()) (entry_block fn) in
33-
let g = build_call pg [||] "" b in
34+
let g = build_call2 fty pg [||] "" b in
3435
ignore (build_ret g b);
3536
fn
3637

llvm/test/Bindings/OCaml/ipo.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ let test_transforms () =
4343
let fn2 = define_function "fn2" fty m in begin
4444
ignore (build_ret (const_int i8_type 4) (builder_at_end context (entry_block fn)));
4545
let b = builder_at_end context (entry_block fn2) in
46-
ignore (build_ret (build_call fn [| |] "" b) b);
46+
ignore (build_ret (build_call2 fty fn [| |] "" b) b);
4747
end;
4848

4949
ignore (PassManager.create ()

0 commit comments

Comments
 (0)