core: Add compile-time feature to disable escape analysis #492
|
@ -24,3 +24,4 @@ features = ["llvm14-0", "target-x86", "target-arm", "target-riscv", "no-libffi-l
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
init-llvm-profile = []
|
init-llvm-profile = []
|
||||||
|
no-escape-analysis = ["nac3core/no-escape-analysis"]
|
||||||
|
|
|
@ -4,6 +4,9 @@ version = "0.1.0"
|
||||||
authors = ["M-Labs"]
|
authors = ["M-Labs"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
no-escape-analysis = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
itertools = "0.13"
|
itertools = "0.13"
|
||||||
crossbeam = "0.8"
|
crossbeam = "0.8"
|
||||||
|
|
|
@ -212,19 +212,23 @@ impl<'a> Inferencer<'a> {
|
||||||
/// This is a workaround preventing the caller from using a variable `alloca`-ed in the body, which
|
/// This is a workaround preventing the caller from using a variable `alloca`-ed in the body, which
|
||||||
/// is freed when the function returns.
|
/// is freed when the function returns.
|
||||||
fn check_return_value_ty(&mut self, ret_ty: Type) -> bool {
|
fn check_return_value_ty(&mut self, ret_ty: Type) -> bool {
|
||||||
match &*self.unifier.get_ty_immutable(ret_ty) {
|
if cfg!(feature = "no-escape-analysis") {
|
||||||
TypeEnum::TObj { .. } => [
|
true
|
||||||
self.primitives.int32,
|
} else {
|
||||||
self.primitives.int64,
|
match &*self.unifier.get_ty_immutable(ret_ty) {
|
||||||
self.primitives.uint32,
|
TypeEnum::TObj { .. } => [
|
||||||
self.primitives.uint64,
|
self.primitives.int32,
|
||||||
self.primitives.float,
|
self.primitives.int64,
|
||||||
self.primitives.bool,
|
self.primitives.uint32,
|
||||||
]
|
self.primitives.uint64,
|
||||||
.iter()
|
self.primitives.float,
|
||||||
.any(|allowed_ty| self.unifier.unioned(ret_ty, *allowed_ty)),
|
self.primitives.bool,
|
||||||
TypeEnum::TTuple { ty, .. } => ty.iter().all(|t| self.check_return_value_ty(*t)),
|
]
|
||||||
_ => false,
|
.iter()
|
||||||
|
.any(|allowed_ty| self.unifier.unioned(ret_ty, *allowed_ty)),
|
||||||
|
TypeEnum::TTuple { ty, .. } => ty.iter().all(|t| self.check_return_value_ty(*t)),
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,9 @@ version = "0.1.0"
|
||||||
authors = ["M-Labs"]
|
authors = ["M-Labs"]
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
[features]
|
||||||
|
no-escape-analysis = ["nac3core/no-escape-analysis"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
nac3parser = { path = "../nac3parser" }
|
nac3parser = { path = "../nac3parser" }
|
||||||
|
|
Loading…
Reference in New Issue