+fn codegen_print(fx: &mut FunctionCx<'_, '_, impl cranelift_module::Backend>, msg: &str) {
+ let puts = fx.module.declare_function("puts", Linkage::Import, &Signature {
+ call_conv: CallConv::SystemV,
+ params: vec![AbiParam::new(pointer_ty(fx.tcx))],
+ returns: vec![],
+ }).unwrap();
+ let puts = fx.module.declare_func_in_func(puts, &mut fx.bcx.func);
+
+ let symbol_name = fx.tcx.symbol_name(fx.instance);
+ let msg_bytes = format!("trap at {:?} ({}): {}\0", fx.instance, symbol_name, msg).into_bytes().into_boxed_slice();
+ let mut data_ctx = DataContext::new();
+ data_ctx.define(msg_bytes);
+ let msg_id = fx.module.declare_data(&(symbol_name.as_str().to_string() + msg), Linkage::Local, false).unwrap();
+
+ // Ignore DuplicateDefinition error, as the data will be the same
+ let _ = fx.module.define_data(msg_id, &data_ctx);
+
+ let local_msg_id = fx.module.declare_data_in_func(msg_id, fx.bcx.func);
+ let msg_ptr = fx.bcx.ins().global_value(pointer_ty(fx.tcx), local_msg_id);
+ fx.bcx.ins().call(puts, &[msg_ptr]);
+}
+