implemented and tested instructions and intrinsics (except deadline, gc)

parent 184dec52
Pipeline #4185 passed with stages
in 62 minutes and 5 seconds
......@@ -184,5 +184,5 @@ mubench:
rustfmt:
stage: rustfmt
script:
- rustup run 1.35.0-x86_64-unknown-linux-gnu cargo-fmt -- --check --verbose -- src/lib.rs src/ast/src/lib.rs src/gc/src/lib.rs src/utils/src/lib.rs
- cargo-fmt +nightly -- --check --verbose -- src/lib.rs src/ast/src/lib.rs src/gc/src/lib.rs src/utils/src/lib.rs
allow_failure: true
This diff is collapsed.
......@@ -133,7 +133,6 @@ impl fmt::Display for MuFunction {
}
}
// FIXME: currently part of compilation information is also stored in this data
// structure we should move them (see Issue #18)
rodal_named!(MuFunctionVersion);
......@@ -145,8 +144,9 @@ pub struct MuFunctionVersion {
pub func_id: MuID,
pub sig: P<MuFuncSig>,
orig_content: Option<FunctionContent>, // original IR
pub content: Option<FunctionContent>, /* IR that may have been rewritten
* during compilation */
pub content: Option<FunctionContent>, /* IR that may have been
* rewritten
* during compilation */
is_defined: bool,
is_compiled: bool,
pub context: FunctionContext,
......
......@@ -100,12 +100,8 @@ lazy_static! {
#[cfg(feature = "realtime")]
lazy_static! {
pub static ref RTATTR_TYPE: P<MuType> =
P(MuType::new(new_internal_id(), MuType_::rtattr()));
pub static ref UPTR_RTATTR_TYPE: P<MuType> = P(MuType::new(
new_internal_id(),
MuType_::uptr(RTATTR_TYPE.clone())
));
pub static ref ATTRREF_TYPE: P<MuType> =
P(MuType::new(new_internal_id(), MuType_::attrref()));
pub static ref REGREF_TYPE: P<MuType> =
P(MuType::new(new_internal_id(), MuType_::regionref()));
pub static ref TIMERREF_TYPE: P<MuType> =
......@@ -130,8 +126,7 @@ lazy_static! {
THREADREF_TYPE.clone(),
UPTR_U8_TYPE.clone(),
UPTR_U64_TYPE.clone(),
RTATTR_TYPE.clone(),
UPTR_RTATTR_TYPE.clone(),
ATTRREF_TYPE.clone(),
REGREF_TYPE.clone(),
FUTEXREF_TYPE.clone(),
];
......@@ -248,9 +243,10 @@ impl MuType {
pub fn is_opaque_reference(&self) -> bool {
match self.v {
MuType_::FuncRef(_) | MuType_::StackRef | MuType_::ThreadRef | MuType_::FutexRef => {
true
}
MuType_::FuncRef(_)
| MuType_::StackRef
| MuType_::ThreadRef
| MuType_::FutexRef => true,
#[cfg(feature = "realtime")]
MuType_::RegionRef => true,
......@@ -260,10 +256,10 @@ impl MuType {
}
#[cfg(feature = "realtime")]
pub fn is_rtattr(&self) -> bool {
pub fn is_attrref(&self) -> bool {
match self.v {
// #[cfg(realtime)]
MuType_::RTAttr => true,
MuType_::AttrRef => true,
_ => false
}
}
......@@ -313,7 +309,7 @@ impl MuType {
| MuType_::FutexRef
| MuType_::UPtr(_) => true,
#[cfg(feature = "realtime")]
MuType_::RTAttr
MuType_::AttrRef
| MuType_::RegionRef
| MuType_::TimeVal
| MuType_::TimerRef => true,
......@@ -541,15 +537,15 @@ impl MuType {
use types::MuType_::*;
match self.v {
Int(len) => Some(len),
Ref(_) | IRef(_) | WeakRef(_) | UPtr(_) | ThreadRef | StackRef | FutexRef
| Tagref64 | FuncRef(_) | UFuncPtr(_) => Some(64),
Ref(_) | IRef(_) | WeakRef(_) | UPtr(_) | ThreadRef | StackRef
| FutexRef | Tagref64 | FuncRef(_) | UFuncPtr(_) => Some(64),
#[cfg(feature = "realtime")]
RegionRef => Some(64),
#[cfg(feature = "realtime")]
TimeVal => Some(64),
#[cfg(feature = "realtime")]
TimerRef => Some(64),
AttrRef | TimerRef => Some(64),
_ => None
}
......@@ -673,11 +669,11 @@ pub enum MuType_ {
/// ufuncptr<@sig>
UFuncPtr(P<MuFuncSig>),
FutexRef,
/// RTMu-specific
/// Real-Time Threads' attributes
#[cfg(feature = "realtime")]
RTAttr,
AttrRef,
#[cfg(feature = "realtime")]
RegionRef,
#[cfg(feature = "realtime")]
......@@ -702,7 +698,7 @@ rodal_enum!(MuType_{(Int: size), Float, Double, (Ref: ty), (IRef: ty), (WeakRef:
#[cfg(feature = "realtime")]
rodal_enum!(MuType_{(Int: size), Float, Double, (Ref: ty), (IRef: ty), (WeakRef: ty), (UPtr: ty),
(Struct: tag), (Array: ty, size), (Hybrid: tag), Void, ThreadRef, RegionRef, TimerRef, FutexRef, TimeVal, RTAttr, StackRef, Tagref64,
(Struct: tag), (Array: ty, size), (Hybrid: tag), Void, ThreadRef, RegionRef, TimerRef, FutexRef, TimeVal, AttrRef, StackRef, Tagref64,
(Vector: ty, size), (FuncRef: ty), (UFuncPtr: ty)});
impl fmt::Display for MuType {
......@@ -715,7 +711,7 @@ impl fmt::Display for MuType_ {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
&MuType_::Int(n) => write!(f, "int<{}>", n),
&MuType_::Float => write!(f,"float"),
&MuType_::Float => write!(f, "float"),
&MuType_::Double => write!(f, "double"),
&MuType_::Ref(ref ty) => write!(f, "ref<{}>", ty),
&MuType_::IRef(ref ty) => write!(f, "iref<{}>", ty),
......@@ -729,7 +725,7 @@ impl fmt::Display for MuType_ {
&MuType_::FutexRef => write!(f, "futexref"),
#[cfg(feature = "realtime")]
&MuType_::RTAttr => write!(f, "rtattr"),
&MuType_::AttrRef => write!(f, "attrref"),
#[cfg(feature = "realtime")]
&MuType_::RegionRef => write!(f, "regionref"),
#[cfg(feature = "realtime")]
......@@ -914,8 +910,8 @@ impl MuType_ {
}
#[cfg(feature = "realtime")]
pub fn rtattr() -> MuType_ {
MuType_::RTAttr
pub fn attrref() -> MuType_ {
MuType_::AttrRef
}
#[cfg(feature = "realtime")]
pub fn regionref() -> MuType_ {
......
......@@ -450,7 +450,7 @@ impl<'a> InstructionSelection {
"switch_not_met_case_{}",
case_op_index
)
.as_str(),
.as_str(),
);
self.start_block(block_name);
}
......@@ -4753,7 +4753,8 @@ impl<'a> InstructionSelection {
MuType_::Vector(_, _) => unimplemented!(),
MuType_::Struct(_) | MuType_::Array(_, _) => {
unimplemented!(); // Todo (note: these may be passed as IRef's)
unimplemented!(); // Todo (note: these may be passed as
// IRef's)
}
MuType_::Void => panic!("void argument not supported"),
......@@ -4934,9 +4935,7 @@ impl<'a> InstructionSelection {
match ty.v {
MuType_::Vector(_, _) => unimplemented!(),
MuType_::Void => panic!("Unexpected void"),
MuType_::Struct(_) | MuType_::Array(_, _) => {
unimplemented!()
}
MuType_::Struct(_) | MuType_::Array(_, _) => unimplemented!(),
// Integral, pointer of floating point type
_ => self.extract_bytes(
......@@ -6034,7 +6033,8 @@ impl<'a> InstructionSelection {
}
}
MuType_::Struct(_) | MuType_::Array(_, _) => {
unimplemented!(); // Todo (note: these may be passed as IRef's)
unimplemented!(); // Todo (note: these may be passed as
// IRef's)
}
MuType_::Void => panic!("void argument not supported"),
......
......@@ -1140,7 +1140,8 @@ pub fn is_valid_logical_imm(val: u64, n: usize) -> bool {
// Returns the value of 'val' truncated to 'size', and then zero extended
pub fn get_unsigned_value(val: u64, size: usize) -> u64 {
(val & bits_ones(size)) as u64 // clears all but the lowest 'size' bits of val
(val & bits_ones(size)) as u64 // clears all but the lowest 'size' bits of
// val
}
// Returns the value of 'val' truncated to 'size', and then sign extended
......@@ -1151,9 +1152,11 @@ pub fn get_signed_value(val: u64, size: usize) -> i64 {
let negative = (val & (1 << (size - 1))) != 0;
if negative {
(val | (bits_ones(64 - size) << size)) as i64 // set the highest '64 - size' bits of val
(val | (bits_ones(64 - size) << size)) as i64 // set the highest '64
// - size' bits of val
} else {
(val & bits_ones(size)) as i64 // clears all but the lowest 'size' bits of val
(val & bits_ones(size)) as i64 // clears all but the lowest 'size'
// bits of val
}
}
}
......@@ -1164,7 +1167,8 @@ pub fn get_negative_value(val: u64, size: usize) -> i64 {
if size == 64 {
val as i64
} else {
(val | (bits_ones(64 - size) << size)) as i64 // set the highest '64 - size' bits of val
(val | (bits_ones(64 - size) << size)) as i64 // set the highest '64 -
// size' bits of val
}
}
......@@ -3187,7 +3191,8 @@ fn compute_argument_locations(
}
} else {
if align == 16 {
ngrn = align_up(ngrn, 2); // align NGRN to the next even number
ngrn = align_up(ngrn, 2); // align NGRN to the next even
// number
}
if size <= 8 * (8 - ngrn) {
......
......@@ -4416,9 +4416,9 @@ pub fn emit_context_with_reloc(
// #41
trace!("start serializing vm");
// use rodal;
// use std::time::Instant;
// use std::time::Instant;
// let now = Instant::now();
// let now = Instant::now();
let mut dumper = rodal::AsmDumper::new(file);
// Dump an Arc to the vm
......@@ -4436,7 +4436,7 @@ pub fn emit_context_with_reloc(
dumper.finish();
// trace!("Dumping took {} micro-seconds", now.elapsed().as_micros());
// trace!("Dumping took {} micro-seconds", now.elapsed().as_micros());
emit_sym_table(vm);
......
......@@ -693,7 +693,7 @@ pub fn estimate_insts_for_ir(inst: &Instruction) -> usize {
AllocA(_) => 1,
AllocAHybrid(_, _) => 1,
AllocAU(_) => 1,
AllocAUHybrid(_,_) => 1,
AllocAUHybrid(_, _) => 1,
Fence(_) => 1,
// memory addressing
......@@ -712,25 +712,44 @@ pub fn estimate_insts_for_ir(inst: &Instruction) -> usize {
| rAllocHybrid(_, _, _)
| eAlloc(_)
| eAllocHybrid(_, _)
| eDelete(_)
=> 10,
| eDelete(_) => 10,
NewStack(_)
| NewThread { .. }
| NewRTThread { .. }
| NewFutex | DeleteFutex(_) | LockFutex(_) | UnlockFutex(_)
| NewFutex
| DeleteFutex(_)
| LockFutex(_, _)
| UnlockFutex(_)
| NotifyThread(_)
| SetPriority(_, _)
| GetPriority(_)
| ThreadSetPriority(_, _)
| ThreadGetPriority(_)
| GetTime
| SetTime(_)
| NewTimer
| SetTimer(_,_,_,_)
| SetTimer(_, _, _, _, _)
| CancelTimer(_)
| DeleteTimer(_)
| Sleep(_)
| AffinityClear(_, _)
| AffinitySet(_, _)
| AffinityIsset(_, _)
| NewAttr
| DeleteAttr(_)
| ThreadSetAttr(_, _)
| ThreadGetAttr(_)
| AttrClearCPU(_, _)
| AttrIssetCPU(_, _)
| AttrSetCPU(_, _)
| AttrZeroCPU(_)
| AttrSetPriority(_, _)
| AttrGetPriority(_)
| eAllocPA(_, _)
| eAllocHybridPA(_, _, _)
| BindObject(_)
| UnbindObject(_)
| NewRegionPA(_, _)
| BindRegion(_)
| UnbindRegion(_)
| ThreadClearCPU(_, _)
| ThreadSetCPU(_, _)
| ThreadIssetCPU(_, _)
| NewFrameCursor(_) => 10,
ThreadExit => 10,
CurrentStack => 10,
......@@ -744,10 +763,10 @@ pub fn estimate_insts_for_ir(inst: &Instruction) -> usize {
Move(_) => 0,
PrintHex(_) | PrintBool(_) | PrintTime(_) => 10,
SetRetval(_) => 10,
RandI(_,_) => 10,
RandF(_,_) => 10,
RandI(_, _) => 10,
RandF(_, _) => 10,
GetVMThreadLocal => 10,
ExnInstruction { ref inner, .. } => estimate_insts_for_ir(&inner),
ExnInstruction { ref inner, .. } => estimate_insts_for_ir(&inner)
}
}
......
......@@ -270,20 +270,14 @@ impl BackendType {
TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1)
}
MuType_::FutexRef => {
TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1)
},
MuType_::FutexRef => TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1),
// RTMu-specific
#[cfg(feature = "realtime")]
MuType_::RegionRef
| MuType_::TimerRef => {
MuType_::RegionRef | MuType_::TimerRef => {
TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1)
},
}
#[cfg(feature = "realtime")]
MuType_::RTAttr => TypeEncode::short_noref(
MINIMAL_ALIGNMENT,
::runtime::thread::RTAttr::get_size() as u8
),
MuType_::AttrRef => TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1),
// TimeVal is 128bits (64bit for now) and in nano-seconds
#[cfg(feature = "realtime")]
MuType_::TimeVal => TypeEncode::short_noref(MINIMAL_ALIGNMENT, 1),
......@@ -410,7 +404,10 @@ impl BackendType {
}
#[cfg(feature = "realtime")]
MuType_::RTAttr | MuType_::RegionRef | MuType_::TimeVal | MuType_::TimerRef => {
MuType_::AttrRef
| MuType_::RegionRef
| MuType_::TimeVal
| MuType_::TimerRef => {
debug_assert!(pointer_aligned);
res.push(WordType::NonRef);
}
......@@ -579,11 +576,11 @@ impl BackendType {
gc_type: None,
gc_type_hybrid_full: None
},
// rtattr
// attref
#[cfg(feature = "realtime")]
MuType_::RTAttr => BackendType {
MuType_::AttrRef => BackendType {
ty: ty.clone(),
size: std::mem::size_of::<::runtime::thread::RTAttr>(),
size: 8,
alignment: 8,
struct_layout: None,
elem_size: None,
......@@ -917,9 +914,9 @@ impl BackendType {
*cur_offset =
align_up(*cur_offset as ByteSize, type_info.alignment)
as ByteSize;
addr_list.push(*cur_offset);
*cur_offset += type_info.size as ByteSize;
}
MuType_::Hybrid(_) => {
......@@ -995,6 +992,8 @@ impl RegGroup {
MuType_::TimerRef => RegGroup::GPR,
#[cfg(feature = "realtime")]
MuType_::TimeVal => RegGroup::GPR,
#[cfg(feature = "realtime")]
MuType_::AttrRef => RegGroup::GPR,
MuType_::Float => RegGroup::FPR,
MuType_::Double => RegGroup::FPR,
......
......@@ -128,7 +128,6 @@ impl PeepholeOptimization {
// redundant, remove this move
cf.mc_mut().set_inst_nop(inst);
} else {
}
}
}
......
......@@ -296,7 +296,6 @@ impl AliveEntries {
for (index, entry) in self.inner.iter() {
if !entry.has_temp() {
if list.iter().any(|x| entry.match_reg(*x)) {
} else {
indices_to_delete.push(*index);
}
......
......@@ -71,7 +71,7 @@ unsafe impl rodal::Dump for CompiledFunction {
dumper.dump_object(&self.const_mem);
dumper.dump_object(&self.frame);
dumper.dump_object(&self.start);
dumper.dump_object(&self.end);;
dumper.dump_object(&self.end);
}
}
......
......@@ -241,12 +241,8 @@ impl CompilerPass for GenMovPhi {
trace!("rewrite to {}", new_inst);
new_body.push(new_inst);
}
Instruction_::Watchpoint { .. } => {
unimplemented!()
}
Instruction_::WPBranch { .. } => {
unimplemented!()
}
Instruction_::Watchpoint { .. } => unimplemented!(),
Instruction_::WPBranch { .. } => unimplemented!(),
Instruction_::SwapStackExc {
stack,
is_exception,
......@@ -288,9 +284,7 @@ impl CompilerPass for GenMovPhi {
trace!("rewrite to {}", new_inst);
new_body.push(new_inst);
}
Instruction_::ExnInstruction { .. } => {
unimplemented!()
}
Instruction_::ExnInstruction { .. } => unimplemented!(),
_ => {
trace!("no rewrite");
new_body.push(node.clone())
......
......@@ -710,9 +710,7 @@ fn copy_inline_blocks(
}
&Instruction_::Watchpoint { .. }
| &Instruction_::WPBranch { .. }
| &Instruction_::ExnInstruction { .. } => {
unimplemented!()
}
| &Instruction_::ExnInstruction { .. } => unimplemented!(),
_ => {
block_content.body.push(last_inst_clone);
......
......@@ -80,31 +80,51 @@ fn is_suitable_child(inst: &Instruction) -> bool {
| NewHybrid(_, _)
| AllocAHybrid(_, _)
| AllocAU(_)
| AllocAUHybrid(_,_)
| AllocAUHybrid(_, _)
| NewReg(_)
| DeleteReg(_)
| rAlloc(_, _)
| rAllocHybrid(_,_,_)
| rAllocHybrid(_, _, _)
| eAlloc(_)
| eAllocHybrid(_,_)
| eAllocHybrid(_, _)
| eDelete(_)
| NewStack(_)
| NewThread { .. }
| NewRTThread { .. }
| NewFutex | DeleteFutex(_) | LockFutex(_) | UnlockFutex(_)
| NewFutex
| DeleteFutex(_)
| LockFutex(_, _)
| UnlockFutex(_)
| NotifyThread(_)
| SetPriority(_, _)
| GetPriority(_)
| AffinityIsset(_, _)
| AffinitySet(_, _)
| AffinityClear(_, _)
| ThreadSetPriority(_, _)
| ThreadGetPriority(_)
| ThreadIssetCPU(_, _)
| ThreadSetCPU(_, _)
| ThreadClearCPU(_, _)
| GetTime
| SetTime(_)
| NewTimer
| SetTimer(_,_,_,_)
| SetTimer(_, _, _, _, _)
| CancelTimer(_)
| DeleteTimer(_)
| Sleep(_)
| NewAttr
| DeleteAttr(_)
| ThreadSetAttr(_, _)
| ThreadGetAttr(_)
| AttrClearCPU(_, _)
| AttrIssetCPU(_, _)
| AttrSetCPU(_, _)
| AttrZeroCPU(_)
| AttrSetPriority(_, _)
| AttrGetPriority(_)
| eAllocPA(_, _)
| eAllocHybridPA(_, _, _)
| BindObject(_)
| UnbindObject(_)
| NewRegionPA(_, _)
| BindRegion(_)
| UnbindRegion(_)
| NewFrameCursor(_)
| Select { .. }
| Fence(_)
......@@ -115,8 +135,8 @@ fn is_suitable_child(inst: &Instruction) -> bool {
| CmpXchg { .. }
| AtomicRMW { .. }
| Store { .. }
| RandF(_,_)
| RandI(_,_)
| RandF(_, _)
| RandI(_, _)
| GetVMThreadLocal => false,
BinOp(_, _, _)
......@@ -131,7 +151,7 @@ fn is_suitable_child(inst: &Instruction) -> bool {
| GetFieldIRef { .. }
| GetElementIRef { .. }
| ShiftIRef { .. }
| GetVarPartIRef { .. } => true,
| GetVarPartIRef { .. } => true
}
}
......
......@@ -13,6 +13,7 @@
// limitations under the License.
//! Zebu micro virtual machine
#![recursion_limit = "128"]
extern crate libc;
#[macro_use]
......
......@@ -54,7 +54,7 @@ pub fn link_primordial(funcs: Vec<MuName>, out: &str, vm: &VM) -> PathBuf {
trace!("copying from {:?} to {:?}", source, dest);
match fs::copy(source.as_path(), dest.as_path()) {
Ok(_) => {}
Err(e) => panic!("failed to copy: {}", e),
Err(e) => panic!("failed to copy: {}", e)
}
// include the primordial C main
......@@ -80,7 +80,7 @@ pub fn link_primordial(funcs: Vec<MuName>, out: &str, vm: &VM) -> PathBuf {
files,
&vm.vm_options.flag_bootimage_external_lib,
&vm.vm_options.flag_bootimage_external_libpath,
out_path,
out_path
)
}
......@@ -114,7 +114,7 @@ pub fn link_test_primordial(funcs: Vec<MuName>, out: &str, vm: &VM) -> PathBuf {
trace!("copying from {:?} to {:?}", source, dest);
match fs::copy(source.as_path(), dest.as_path()) {
Ok(_) => {}
Err(e) => panic!("failed to copy: {}", e),
Err(e) => panic!("failed to copy: {}", e)
}
// include the primordial C main
......@@ -140,7 +140,7 @@ pub fn link_test_primordial(funcs: Vec<MuName>, out: &str, vm: &VM) -> PathBuf {
files,
&vm.vm_options.flag_bootimage_external_lib,
&vm.vm_options.flag_bootimage_external_libpath,
out_path,
out_path
)
}
......@@ -150,7 +150,7 @@ fn link_executable_internal(
files: Vec<PathBuf>,
lib: &Vec<String>,
libpath: &Vec<String>,
out: PathBuf,
out: PathBuf
) -> PathBuf {
info!("output as {:?}", out.as_path());
......@@ -226,7 +226,7 @@ pub fn link_dylib_with_extra_srcs(
funcs: Vec<MuName>,
srcs: Vec<String>,
out: &str,
vm: &VM,
vm: &VM
) -> PathBuf {
let files = {
let mut ret = vec![];
......@@ -251,7 +251,7 @@ pub fn link_dylib_with_extra_srcs(
files,
&vm.vm_options.flag_bootimage_external_lib,
&vm.vm_options.flag_bootimage_external_libpath,
out_path,
out_path
)
}
......@@ -260,7 +260,7 @@ fn link_dylib_internal(
files: Vec<PathBuf>,
lib: &Vec<String>,
libpath: &Vec<String>,
out: PathBuf,
out: PathBuf
) -> PathBuf {
let mut object_files: Vec<PathBuf> = vec![];
......@@ -327,7 +327,7 @@ fn link_dylib_internal(
// (Issue #52)
pub fn compile_fnc<'a>(
fnc_name: &'static str,
build_fnc: &'a Fn() -> VM,
build_fnc: &'a Fn() -> VM
) -> ll::Library {
VM::start_logging_trace();
......@@ -338,7 +338,7 @@ pub fn compile_fnc<'a>(
let funcs = vm.funcs().read().unwrap();
let func = match funcs.get(&func_id) {
Some(func) => func.read().unwrap(),
None => panic!("cannot find function {}", fnc_name),
None => panic!("cannot find function {}", fnc_name)
};
let cur_ver = match func.cur_ver {
......@@ -346,13 +346,13 @@ pub fn compile_fnc<'a>(
None => panic!(
"function {} does not have a defined current version",
fnc_name
),
)
};
let func_vers = vm.func_vers().read().unwrap();
let mut func_ver = match func_vers.get(&cur_ver) {
Some(fv) => fv.write().unwrap(),
None => panic!("cannot find function version {}", cur_ver),
None => panic!("cannot find function version {}", cur_ver)
};
compiler.compile(&mut func_ver);
}
......@@ -370,7 +370,7 @@ pub fn compile_fnc<'a>(
pub fn compile_fncs<'a>(
entry: &'static str,
fnc_names: Vec<&'static str>,
build_fnc: &'a Fn() -> VM,
build_fnc: &'a Fn() -> VM
) -> ll::Library {
VM::start_logging_trace();
......@@ -396,7 +396,7 @@ pub fn compile_fncs<'a>(
let dylib = aot::link_dylib(
fnc_names.iter().map(|x| Mu(x)).collect(),
libname,
&vm,
&vm
);
ll::Library::new(dylib.as_os_str()).unwrap()
}
......@@ -424,7 +424,7 @@ pub fn run_test(vm: &VM, test_name: &str, tester_name: &str) {
Arc::new(tester_name.to_string()),
],
output_name.as_str(),
vm,
vm
);
self::super::exec_path(executable);
}
......@@ -433,7 +433,7 @@ pub fn run_test_2f(
vm: &VM,