@ -850,10 +850,10 @@ let xlate_instr :
let len = Exp . integer Typ . siz ( Z . of_int ( size_of x llt ) ) in
emit_inst ( Llair . Inst . alloc ~ reg ~ num ~ len ~ loc )
| Call -> (
let maybe_llfunc = Llvm . operand instr ( Llvm . num_operands instr - 1 ) in
let lltyp = Llvm . type_of maybe_llfunc in
assert ( Poly . ( Llvm . classify_type lltyp = Pointer ) ) ;
let llfunc =
let maybe_llfunc =
Llvm . operand instr ( Llvm . num_operands instr - 1 )
in
let llfunc_valuekind = Llvm . classify_value maybe_llfunc in
match llfunc_valuekind with
| Function | Instruction _ | InlineAsm | Argument -> maybe_llfunc
@ -867,8 +867,6 @@ let xlate_instr :
todo " operand kind in call instruction %a " pp_llvaluekind
llfunc_valuekind ()
in
let lltyp = Llvm . type_of llfunc in
assert ( Poly . ( Llvm . classify_type lltyp = Pointer ) ) ;
let fname = Llvm . value_name llfunc in
let skip msg =
( match Hash_set . strict_add ignored_callees fname with
@ -947,7 +945,7 @@ let xlate_instr :
(* general function call that may not throw *)
| _ ->
let func = xlate_func_name x llfunc in
let typ = xlate_type x ( Llvm . type_of llfunc ) in
let typ = xlate_type x lltyp in
let lbl = name ^ " .ret " in
let call =
let args =
@ -963,8 +961,13 @@ let xlate_instr :
function : % a "
Exp . pp func ()
| _ -> () ) ;
Array . length
( Llvm . param_types ( Llvm . element_type lltyp ) )
let llfty = Llvm . element_type lltyp in
( match Llvm . classify_type llfty with
| Function -> ()
| _ ->
fail " called function not of function type: %a "
pp_llvalue instr () ) ;
Array . length ( Llvm . param_types llfty )
in
List . rev_init num_args ~ f : ( fun i ->
xlate_value x ( Llvm . operand instr i ) )
@ -993,6 +996,7 @@ let xlate_instr :
warn " ignoring variable arguments to variadic function: %a "
Global . pp ( xlate_global x llfunc ) ()
| _ -> () ) ;
assert ( Poly . ( Llvm . classify_type lltyp = Pointer ) ) ;
Array . length ( Llvm . param_types ( Llvm . element_type lltyp ) ) )
in
let args =