Like for all others instructions, LLVM needs the type of each operands. However this information is not always available via the pseudo, like here when passing a integer constant as argument since for sparse constants are typeless. Fix this by getting the type via the function prototype. Reported-by: Dibyendu Majumdar <mobile@xxxxxxxxxxxxxxx> Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- sparse-llvm.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sparse-llvm.c b/sparse-llvm.c index c593f831f..27cc1b88c 100644 --- a/sparse-llvm.c +++ b/sparse-llvm.c @@ -740,7 +740,16 @@ static void output_op_call(struct function *fn, struct instruction *insn) i = 0; FOR_EACH_PTR(insn->arguments, arg) { - args[i++] = pseudo_to_value(fn, insn, arg); + LLVMValueRef value; + if (arg->type == PSEUDO_VAL) { + /* Value pseudos do not have type information. */ + /* Use the function prototype to get the type. */ + struct symbol *ctype = get_nth1_arg(insn->func->sym, i + 1); + value = val_to_value(fn, arg->value, ctype); + } else { + value = pseudo_to_value(fn, insn, arg); + } + args[i++] = value; } END_FOR_EACH_PTR(arg); func = pseudo_to_value(fn, insn, insn->func); -- 2.11.1 -- To unsubscribe from this list: send the line "unsubscribe linux-sparse" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html