use llhd::ir::prelude::*;
fn within_func(return_type: llhd::Type, f: impl FnOnce(&mut UnitBuilder)) -> UnitData {
let name = UnitName::global("test");
let mut sig = Signature::new();
sig.set_return_type(return_type);
let mut func = UnitData::new(UnitKind::Function, name, sig);
let mut builder = UnitBuilder::new_anonymous(&mut func);
let bb = builder.named_block("entry");
builder.append_to(bb);
f(&mut builder);
func
}
#[test]
fn call_with_void() {
within_func(llhd::void_ty(), |builder| {
let mut sig = Signature::new();
sig.set_return_type(llhd::void_ty());
let ext = builder.add_extern(UnitName::global("foo"), sig);
let result = builder.ins().name("x").call(ext, vec![]);
println!("{}", builder.unit());
assert_eq!(builder.value_type(result), llhd::void_ty());
});
}
#[test]
fn call_with_return_value() {
within_func(llhd::int_ty(32), |builder| {
let mut sig = Signature::new();
sig.add_input(llhd::int_ty(1));
sig.add_input(llhd::int_ty(42));
sig.set_return_type(llhd::int_ty(32));
let ext = builder.add_extern(UnitName::global("foo"), sig);
let v1 = builder.ins().name("one").const_int((1, 0));
let v2 = builder.ins().const_int((42, 9001));
let v3 = builder.ins().suffix(v1, "called").call(ext, vec![v1, v2]);
builder.ins().ret_value(v3);
println!("{}", builder.unit());
});
}