core: Add compile-time feature to disable escape analysis

This commit is contained in:
David Mak 2024-07-12 14:00:46 +08:00
parent 6d6f8be07f
commit 6c1d8ac001
4 changed files with 24 additions and 13 deletions

View File

@ -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"]

View File

@ -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"

View File

@ -207,19 +207,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,
}
} }
} }

View File

@ -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" }