message: Call a print function
  But a little stumped about how to link it up!
diff: @@ -56,6 +56,19 @@ fn compile_func(func: bril::Function) {
  {
  let mut builder = FunctionBuilder::new(&mut cl_func, &mut fn_builder_ctx);
  + // Declare runtime functions.
  + // TODO Map to extern symbol.
  + let print_int = {
  + let mut sig = ir::Signature::new(isa::CallConv::SystemV);
  + sig.params.push(ir::AbiParam::new(ir::types::I64));
  + let sigref = builder.import_signature(sig);
  + builder.import_function(ir::ExtFuncData {
  + name: ir::ExternalName::user(1, 0),
  + signature: sigref,
  + colocated: false,
  + })
  + };
  +
  // Declare all variables.
  let mut vars = HashMap::<&String, Variable>::new();
  for (i, (name, typ)) in all_vars(&func).iter().enumerate() {
  @@ -69,10 +82,10 @@ fn compile_func(func: bril::Function) {
  builder.switch_to_block(block);
  // Insert instructions.
  - for inst in &func.instrs {
  + for code in &func.instrs {
  + match code {
  + bril::Code::Instruction(inst) => {
  match inst {
  - bril::Code::Instruction(op) => {
  - match op {
  bril::Instruction::Constant { dest, op: _, const_type: _, value } => {
  let var = vars.get(&dest).unwrap();
  let val = match value {
  @@ -81,6 +94,18 @@ fn compile_func(func: bril::Function) {
  };
  builder.def_var(*var, val);
  },
  + bril::Instruction::Effect { args, funcs, labels, op } => {
  + match op {
  + bril::EffectOps::Print => {
  + // TODO Target should depend on the type.
  + // TODO Deal with multiple args somehow.
  + let var = vars.get(&args[0]).unwrap();
  + let arg = builder.use_var(*var);
  + builder.ins().call(print_int, &[arg]);
  + },
  + _ => todo!(),
  + }
  + },
  _ => (), // TODO
  }
  },
  