From ba32934b338573f43f8f7a08a0b8b3453904f320 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Thu, 13 Jan 2022 22:57:29 +0100 Subject: [PATCH 01/11] Setup compiletest_rs --- objc2/Cargo.toml | 3 +++ objc2/build.rs | 6 ++++++ objc2/tests/compile_tests.rs | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 objc2/tests/compile_tests.rs diff --git a/objc2/Cargo.toml b/objc2/Cargo.toml index 896d7091a..ce0526b4c 100644 --- a/objc2/Cargo.toml +++ b/objc2/Cargo.toml @@ -45,6 +45,9 @@ malloc_buf = { version = "1.0", optional = true } objc-sys = { path = "../objc-sys", version = "=0.2.0-alpha.1" } objc2-encode = { path = "../objc2-encode", version = "=2.0.0-beta.2" } +[dev-dependencies] +compiletest_rs = "0.7" + [build-dependencies] cc = { version = "1", optional = true } diff --git a/objc2/build.rs b/objc2/build.rs index 4806c4e28..ac798dd80 100644 --- a/objc2/build.rs +++ b/objc2/build.rs @@ -25,4 +25,10 @@ fn main() { builder.compile("librust_objc_try_catch_exception.a"); } + + // For compile tests + println!( + "cargo:rustc-env=BUILD_PROFILE={}", + std::env::var("PROFILE").unwrap() + ); } diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs new file mode 100644 index 000000000..08da093da --- /dev/null +++ b/objc2/tests/compile_tests.rs @@ -0,0 +1,21 @@ +use std::env; +use std::path::PathBuf; + +fn run_mode(mode: &'static str) { + let mut config = compiletest_rs::Config::default(); + + config.mode = mode.parse().expect("Invalid mode"); + config.src_base = PathBuf::from(format!("tests/{}", mode)); + config.verbose = true; + config.target_rustcflags = Some(format!( + "-L ../target/{profile} -L ../target/{profile}/deps --edition=2018 --extern objc2", + profile = env!("BUILD_PROFILE") + )); + config.clean_rmeta(); + + compiletest_rs::run_tests(&config); +} + +#[test] +fn compile_test() { +} From ecb68e15ee6b56df4f3001f9f4b9ae0b8731169a Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Mon, 3 Jan 2022 16:17:07 +0100 Subject: [PATCH 02/11] Test that having no return type on msg_send doesn't compile --- objc2/tests/compile_tests.rs | 1 + objc2/tests/ui/msg_send_no_return_type.rs | 8 ++++++++ objc2/tests/ui/msg_send_no_return_type.stderr | 13 +++++++++++++ 3 files changed, 22 insertions(+) create mode 100644 objc2/tests/ui/msg_send_no_return_type.rs create mode 100644 objc2/tests/ui/msg_send_no_return_type.stderr diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index 08da093da..b9898ae8c 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -18,4 +18,5 @@ fn run_mode(mode: &'static str) { #[test] fn compile_test() { + run_mode("ui"); } diff --git a/objc2/tests/ui/msg_send_no_return_type.rs b/objc2/tests/ui/msg_send_no_return_type.rs new file mode 100644 index 000000000..0e51e5a95 --- /dev/null +++ b/objc2/tests/ui/msg_send_no_return_type.rs @@ -0,0 +1,8 @@ +use objc2::{class, msg_send}; + +fn main() { + unsafe { + let cls = class!(NSObject); + let _obj = msg_send![cls, new]; + } +} diff --git a/objc2/tests/ui/msg_send_no_return_type.stderr b/objc2/tests/ui/msg_send_no_return_type.stderr new file mode 100644 index 000000000..e4eba089e --- /dev/null +++ b/objc2/tests/ui/msg_send_no_return_type.stderr @@ -0,0 +1,13 @@ +error[E0282]: type annotations needed + --> $DIR/msg_send_no_return_type.rs:6:20 + | +6 | let _obj = msg_send![cls, new]; + | ---- ^^^^^^^^^^^^^^^^^^^ cannot infer type + | | + | consider giving `_obj` a type + | + = note: this error originates in the macro `msg_send` (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0282`. From 540e91cd924564e7b60220a76d9e9eb1b83da5ca Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 00:48:58 +0100 Subject: [PATCH 03/11] Fix compile tests when cross-compiling Also fixes an issue I had in CI --- objc2/build.rs | 6 +++++- objc2/tests/compile_tests.rs | 6 ++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/objc2/build.rs b/objc2/build.rs index ac798dd80..68489cc37 100644 --- a/objc2/build.rs +++ b/objc2/build.rs @@ -29,6 +29,10 @@ fn main() { // For compile tests println!( "cargo:rustc-env=BUILD_PROFILE={}", - std::env::var("PROFILE").unwrap() + env::var("PROFILE").unwrap() + ); + println!( + "cargo:rustc-env=BUILD_TARGET={}", + env::var("TARGET").unwrap() ); } diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index b9898ae8c..a7a7bc091 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -8,8 +8,10 @@ fn run_mode(mode: &'static str) { config.src_base = PathBuf::from(format!("tests/{}", mode)); config.verbose = true; config.target_rustcflags = Some(format!( - "-L ../target/{profile} -L ../target/{profile}/deps --edition=2018 --extern objc2", - profile = env!("BUILD_PROFILE") + "-L ../target/{profile} -L ../target/{profile}/deps -L ../target/{target}/{profile} -L ../target/{target}/{profile}/deps --edition=2018 --extern objc2", + // Environment variables from build script: + target = env!("BUILD_TARGET"), + profile = env!("BUILD_PROFILE"), )); config.clean_rmeta(); From 31758f0c708772cd5328b087ef115eb1260de9f0 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 02:04:24 +0100 Subject: [PATCH 04/11] Make compile tests not need to clean rmeta --- objc2/tests/compile_tests.rs | 57 +++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index a7a7bc091..523d39cf1 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -1,19 +1,62 @@ use std::env; -use std::path::PathBuf; +use std::io; +use std::path::{Path, PathBuf}; + +// Environment variables created in build script +const TARGET: &'static str = env!("BUILD_TARGET"); +const PROFILE: &'static str = env!("BUILD_PROFILE"); + +fn find_dependency(deps_dir: &Path, dep: &str) -> io::Result { + // Find lib[dep]-XYZ.rlib + // Yes. This is ugly. + let mut rlib = None; + for dir in deps_dir.read_dir()? { + let path = dir?.path(); + if path + .file_name() + .unwrap() + .to_str() + .unwrap() + .starts_with(&format!("lib{}-", dep)) + && path.extension().map_or(false, |ext| ext == "rlib") + { + if let Some(rlib) = rlib { + panic!("Found multiple rlibs: {:?}, {:?}", rlib, path); + } else { + rlib = Some(path); + } + } + } + Ok(rlib.expect("Found no rlib")) +} fn run_mode(mode: &'static str) { let mut config = compiletest_rs::Config::default(); + // ../target + let target_dir = Path::new(env!("CARGO_MANIFEST_DIR")) + .parent() + .unwrap() + .join("target"); + + // [/TARGET]/debug/deps + let deps_dir = if target_dir.join(TARGET).exists() { + target_dir.join(TARGET) + } else { + target_dir + } + .join(PROFILE) + .join("deps"); + + let dir = find_dependency(&deps_dir, "objc2").unwrap(); + config.mode = mode.parse().expect("Invalid mode"); config.src_base = PathBuf::from(format!("tests/{}", mode)); - config.verbose = true; config.target_rustcflags = Some(format!( - "-L ../target/{profile} -L ../target/{profile}/deps -L ../target/{target}/{profile} -L ../target/{target}/{profile}/deps --edition=2018 --extern objc2", - // Environment variables from build script: - target = env!("BUILD_TARGET"), - profile = env!("BUILD_PROFILE"), + "-L dependency={} --edition=2018 --extern objc2={}", + deps_dir.display(), + dir.display() )); - config.clean_rmeta(); compiletest_rs::run_tests(&config); } From 4794e5ce1c586c4547fd0bb72aa80f8f1aec80e1 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 02:07:13 +0100 Subject: [PATCH 05/11] Fix msg_send_no_return_type test --- objc2/tests/ui/msg_send_no_return_type.rs | 4 +++- objc2/tests/ui/msg_send_no_return_type.stderr | 8 +++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/objc2/tests/ui/msg_send_no_return_type.rs b/objc2/tests/ui/msg_send_no_return_type.rs index 0e51e5a95..e3883a3aa 100644 --- a/objc2/tests/ui/msg_send_no_return_type.rs +++ b/objc2/tests/ui/msg_send_no_return_type.rs @@ -1,8 +1,10 @@ +// Test that forgetting to annotate the return type fails +// See https://github.com/SSheldon/rust-objc/issues/62 use objc2::{class, msg_send}; fn main() { unsafe { let cls = class!(NSObject); - let _obj = msg_send![cls, new]; + msg_send![cls, new]; } } diff --git a/objc2/tests/ui/msg_send_no_return_type.stderr b/objc2/tests/ui/msg_send_no_return_type.stderr index e4eba089e..59935c4f7 100644 --- a/objc2/tests/ui/msg_send_no_return_type.stderr +++ b/objc2/tests/ui/msg_send_no_return_type.stderr @@ -1,10 +1,8 @@ error[E0282]: type annotations needed - --> $DIR/msg_send_no_return_type.rs:6:20 + --> $DIR/msg_send_no_return_type.rs:8:9 | -6 | let _obj = msg_send![cls, new]; - | ---- ^^^^^^^^^^^^^^^^^^^ cannot infer type - | | - | consider giving `_obj` a type +8 | msg_send![cls, new]; + | ^^^^^^^^^^^^^^^^^^^ consider giving `result` a type | = note: this error originates in the macro `msg_send` (in Nightly builds, run with -Z macro-backtrace for more info) From 4caa9fcbe9b2c29b8f095e18d916483a21af46e2 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 02:10:53 +0100 Subject: [PATCH 06/11] Add error annotations to ui tests --- objc2/tests/compile_tests.rs | 13 +++++++++---- objc2/tests/ui/msg_send_no_return_type.rs | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index 523d39cf1..fe66a1881 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -30,7 +30,7 @@ fn find_dependency(deps_dir: &Path, dep: &str) -> io::Result { Ok(rlib.expect("Found no rlib")) } -fn run_mode(mode: &'static str) { +fn run(src: &'static str, mode: &'static str) { let mut config = compiletest_rs::Config::default(); // ../target @@ -51,7 +51,7 @@ fn run_mode(mode: &'static str) { let dir = find_dependency(&deps_dir, "objc2").unwrap(); config.mode = mode.parse().expect("Invalid mode"); - config.src_base = PathBuf::from(format!("tests/{}", mode)); + config.src_base = PathBuf::from(format!("tests/{}", src)); config.target_rustcflags = Some(format!( "-L dependency={} --edition=2018 --extern objc2={}", deps_dir.display(), @@ -62,6 +62,11 @@ fn run_mode(mode: &'static str) { } #[test] -fn compile_test() { - run_mode("ui"); +fn test_ui() { + run("ui", "ui"); +} + +#[test] +fn test_ui_compile_fail() { + run("ui", "compile-fail"); } diff --git a/objc2/tests/ui/msg_send_no_return_type.rs b/objc2/tests/ui/msg_send_no_return_type.rs index e3883a3aa..4bdfe470f 100644 --- a/objc2/tests/ui/msg_send_no_return_type.rs +++ b/objc2/tests/ui/msg_send_no_return_type.rs @@ -6,5 +6,6 @@ fn main() { unsafe { let cls = class!(NSObject); msg_send![cls, new]; + //~^ ERROR type annotations needed } } From e4d96a803865539dc0f098ac40c6ea2bffeb8dbb Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 02:41:46 +0100 Subject: [PATCH 07/11] Cleanup --- objc2/tests/compile_tests.rs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index fe66a1881..2edff78c0 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -2,6 +2,8 @@ use std::env; use std::io; use std::path::{Path, PathBuf}; +use compiletest_rs::{common::Mode, run_tests, Config}; + // Environment variables created in build script const TARGET: &'static str = env!("BUILD_TARGET"); const PROFILE: &'static str = env!("BUILD_PROFILE"); @@ -30,8 +32,8 @@ fn find_dependency(deps_dir: &Path, dep: &str) -> io::Result { Ok(rlib.expect("Found no rlib")) } -fn run(src: &'static str, mode: &'static str) { - let mut config = compiletest_rs::Config::default(); +fn run(src: &'static str, mode: Mode) { + let mut config = Config::default(); // ../target let target_dir = Path::new(env!("CARGO_MANIFEST_DIR")) @@ -50,23 +52,25 @@ fn run(src: &'static str, mode: &'static str) { let dir = find_dependency(&deps_dir, "objc2").unwrap(); - config.mode = mode.parse().expect("Invalid mode"); + config.mode = mode; config.src_base = PathBuf::from(format!("tests/{}", src)); config.target_rustcflags = Some(format!( - "-L dependency={} --edition=2018 --extern objc2={}", + "-L dependency={} --extern objc2={}", deps_dir.display(), dir.display() )); + config.edition = Some("2018".into()); + config.verbose = true; - compiletest_rs::run_tests(&config); + run_tests(&config); } #[test] fn test_ui() { - run("ui", "ui"); + run("ui", Mode::Ui); } #[test] fn test_ui_compile_fail() { - run("ui", "compile-fail"); + run("ui", Mode::CompileFail); } From bb28dfdcf79c967ecfcce589742cf5f431c0548c Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 03:25:18 +0100 Subject: [PATCH 08/11] Add codegen tests --- objc2/tests/codegen/test_msg_send_zero_cost.rs | 15 +++++++++++++++ objc2/tests/compile_tests.rs | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 objc2/tests/codegen/test_msg_send_zero_cost.rs diff --git a/objc2/tests/codegen/test_msg_send_zero_cost.rs b/objc2/tests/codegen/test_msg_send_zero_cost.rs new file mode 100644 index 000000000..2734912c7 --- /dev/null +++ b/objc2/tests/codegen/test_msg_send_zero_cost.rs @@ -0,0 +1,15 @@ +// Test that msg_send! is inlined into an objc_msgSend +// +// assembly-output: emit-asm +// only-x86 +// compile-flags: -Copt-level=3 + +use objc2::runtime::Object; +use objc2::{class, msg_send}; + +fn main() { + unsafe { + let cls = class!(NSObject); + let _obj: *mut Object = msg_send![cls, new]; + } +} diff --git a/objc2/tests/compile_tests.rs b/objc2/tests/compile_tests.rs index 2edff78c0..49844be6f 100644 --- a/objc2/tests/compile_tests.rs +++ b/objc2/tests/compile_tests.rs @@ -59,6 +59,11 @@ fn run(src: &'static str, mode: Mode) { deps_dir.display(), dir.display() )); + config.llvm_filecheck = Some( + env::var("FILECHECK") + .unwrap_or("FileCheck".to_string()) + .into(), + ); config.edition = Some("2018".into()); config.verbose = true; @@ -74,3 +79,13 @@ fn test_ui() { fn test_ui_compile_fail() { run("ui", Mode::CompileFail); } + +#[test] +fn test_codegen() { + run("codegen", Mode::Codegen); +} + +#[test] +fn test_codegen_pass() { + run("codegen", Mode::RunPass); +} From 6a17afe41b615812f7e6d2c085c49e01848a7a2a Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Thu, 13 Jan 2022 23:31:03 +0100 Subject: [PATCH 09/11] Move compile tests --- Cargo.toml | 1 + compile-tests/Cargo.toml | 12 ++++++++++++ compile-tests/build.rs | 13 +++++++++++++ .../codegen/test_msg_send_zero_cost.rs | 0 .../src/main.rs | 17 ++--------------- .../ui/msg_send_no_return_type.rs | 0 .../ui/msg_send_no_return_type.stderr | 0 objc2/Cargo.toml | 3 --- objc2/build.rs | 10 ---------- 9 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 compile-tests/Cargo.toml create mode 100644 compile-tests/build.rs rename {objc2/tests => compile-tests}/codegen/test_msg_send_zero_cost.rs (100%) rename objc2/tests/compile_tests.rs => compile-tests/src/main.rs (91%) rename {objc2/tests => compile-tests}/ui/msg_send_no_return_type.rs (100%) rename {objc2/tests => compile-tests}/ui/msg_send_no_return_type.stderr (100%) diff --git a/Cargo.toml b/Cargo.toml index 0dfd40efa..642c82329 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,5 @@ members = [ "block2", "block-sys", "tests", + "compile-tests", ] diff --git a/compile-tests/Cargo.toml b/compile-tests/Cargo.toml new file mode 100644 index 000000000..bbb534de1 --- /dev/null +++ b/compile-tests/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "compile-tests" +version = "0.1.0" +edition = "2018" +publish = false + +repository = "https://github.com/madsmtm/objc2" +license = "MIT" + +[dependencies] +objc2 = { path = "../objc2" } +compiletest_rs = "0.7" diff --git a/compile-tests/build.rs b/compile-tests/build.rs new file mode 100644 index 000000000..0c69ff1b6 --- /dev/null +++ b/compile-tests/build.rs @@ -0,0 +1,13 @@ +use std::env; + +fn main() { + // For compile tests + println!( + "cargo:rustc-env=BUILD_PROFILE={}", + env::var("PROFILE").unwrap() + ); + println!( + "cargo:rustc-env=BUILD_TARGET={}", + env::var("TARGET").unwrap() + ); +} diff --git a/objc2/tests/codegen/test_msg_send_zero_cost.rs b/compile-tests/codegen/test_msg_send_zero_cost.rs similarity index 100% rename from objc2/tests/codegen/test_msg_send_zero_cost.rs rename to compile-tests/codegen/test_msg_send_zero_cost.rs diff --git a/objc2/tests/compile_tests.rs b/compile-tests/src/main.rs similarity index 91% rename from objc2/tests/compile_tests.rs rename to compile-tests/src/main.rs index 49844be6f..79d8cb018 100644 --- a/objc2/tests/compile_tests.rs +++ b/compile-tests/src/main.rs @@ -53,7 +53,7 @@ fn run(src: &'static str, mode: Mode) { let dir = find_dependency(&deps_dir, "objc2").unwrap(); config.mode = mode; - config.src_base = PathBuf::from(format!("tests/{}", src)); + config.src_base = PathBuf::from(format!("{}/{}", env!("CARGO_MANIFEST_DIR"), src)); config.target_rustcflags = Some(format!( "-L dependency={} --extern objc2={}", deps_dir.display(), @@ -70,22 +70,9 @@ fn run(src: &'static str, mode: Mode) { run_tests(&config); } -#[test] -fn test_ui() { +fn main() { run("ui", Mode::Ui); -} - -#[test] -fn test_ui_compile_fail() { run("ui", Mode::CompileFail); -} - -#[test] -fn test_codegen() { run("codegen", Mode::Codegen); -} - -#[test] -fn test_codegen_pass() { run("codegen", Mode::RunPass); } diff --git a/objc2/tests/ui/msg_send_no_return_type.rs b/compile-tests/ui/msg_send_no_return_type.rs similarity index 100% rename from objc2/tests/ui/msg_send_no_return_type.rs rename to compile-tests/ui/msg_send_no_return_type.rs diff --git a/objc2/tests/ui/msg_send_no_return_type.stderr b/compile-tests/ui/msg_send_no_return_type.stderr similarity index 100% rename from objc2/tests/ui/msg_send_no_return_type.stderr rename to compile-tests/ui/msg_send_no_return_type.stderr diff --git a/objc2/Cargo.toml b/objc2/Cargo.toml index ce0526b4c..896d7091a 100644 --- a/objc2/Cargo.toml +++ b/objc2/Cargo.toml @@ -45,9 +45,6 @@ malloc_buf = { version = "1.0", optional = true } objc-sys = { path = "../objc-sys", version = "=0.2.0-alpha.1" } objc2-encode = { path = "../objc2-encode", version = "=2.0.0-beta.2" } -[dev-dependencies] -compiletest_rs = "0.7" - [build-dependencies] cc = { version = "1", optional = true } diff --git a/objc2/build.rs b/objc2/build.rs index 68489cc37..4806c4e28 100644 --- a/objc2/build.rs +++ b/objc2/build.rs @@ -25,14 +25,4 @@ fn main() { builder.compile("librust_objc_try_catch_exception.a"); } - - // For compile tests - println!( - "cargo:rustc-env=BUILD_PROFILE={}", - env::var("PROFILE").unwrap() - ); - println!( - "cargo:rustc-env=BUILD_TARGET={}", - env::var("TARGET").unwrap() - ); } From c3b6733f3632a66c410a4fe782fcc0acb1a0273a Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 05:12:42 +0100 Subject: [PATCH 10/11] Make compile tests much more robust --- compile-tests/Cargo.toml | 2 +- compile-tests/src/main.rs | 120 ++++++++++++++++++++------------------ 2 files changed, 65 insertions(+), 57 deletions(-) diff --git a/compile-tests/Cargo.toml b/compile-tests/Cargo.toml index bbb534de1..e04331b55 100644 --- a/compile-tests/Cargo.toml +++ b/compile-tests/Cargo.toml @@ -8,5 +8,5 @@ repository = "https://github.com/madsmtm/objc2" license = "MIT" [dependencies] -objc2 = { path = "../objc2" } compiletest_rs = "0.7" +cargo_metadata = "0.14" diff --git a/compile-tests/src/main.rs b/compile-tests/src/main.rs index 79d8cb018..463cbe0c0 100644 --- a/compile-tests/src/main.rs +++ b/compile-tests/src/main.rs @@ -1,63 +1,61 @@ +use cargo_metadata::camino::Utf8PathBuf; +use cargo_metadata::Message; use std::env; use std::io; -use std::path::{Path, PathBuf}; +use std::path::Path; +use std::process::Command; +use std::process::Stdio; use compiletest_rs::{common::Mode, run_tests, Config}; -// Environment variables created in build script -const TARGET: &'static str = env!("BUILD_TARGET"); -const PROFILE: &'static str = env!("BUILD_PROFILE"); - -fn find_dependency(deps_dir: &Path, dep: &str) -> io::Result { - // Find lib[dep]-XYZ.rlib - // Yes. This is ugly. - let mut rlib = None; - for dir in deps_dir.read_dir()? { - let path = dir?.path(); - if path - .file_name() - .unwrap() - .to_str() - .unwrap() - .starts_with(&format!("lib{}-", dep)) - && path.extension().map_or(false, |ext| ext == "rlib") - { - if let Some(rlib) = rlib { - panic!("Found multiple rlibs: {:?}, {:?}", rlib, path); - } else { - rlib = Some(path); - } - } - } - Ok(rlib.expect("Found no rlib")) +fn get_rlib<'a>(filenames: impl IntoIterator) -> &'a Utf8PathBuf { + filenames + .into_iter() + .find(|name| name.extension() == Some("rlib")) + .expect("An rlib") } -fn run(src: &'static str, mode: Mode) { - let mut config = Config::default(); - - // ../target - let target_dir = Path::new(env!("CARGO_MANIFEST_DIR")) - .parent() - .unwrap() - .join("target"); +fn main() -> io::Result<()> { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); - // [/TARGET]/debug/deps - let deps_dir = if target_dir.join(TARGET).exists() { - target_dir.join(TARGET) - } else { - target_dir - } - .join(PROFILE) - .join("deps"); + // Build objc2 + let result = Command::new("cargo") + .current_dir(&manifest_dir.parent().unwrap()) + .arg("build") + .arg("-pobjc2") + .arg("--message-format=json-render-diagnostics") + .args(std::env::args().skip(1)) + .stdout(Stdio::piped()) + .output()?; - let dir = find_dependency(&deps_dir, "objc2").unwrap(); + // Extract metadata from build + let artifacts: Vec<_> = cargo_metadata::Message::parse_stream(&*result.stdout) + .filter_map(|message| { + if let Message::CompilerArtifact(artifact) = message.unwrap() { + if artifact.target.kind == ["lib"] && !artifact.profile.test { + return Some(artifact); + } + } + None + }) + .collect(); + let dep_dir = get_rlib(&artifacts[0].filenames).parent().unwrap(); + let flags = artifacts + .iter() + .map(|artifact| { + format!( + " --extern {name}={rlib}", + name = artifact.target.name, + rlib = get_rlib(&artifact.filenames), + ) + }) + .collect::(); - config.mode = mode; - config.src_base = PathBuf::from(format!("{}/{}", env!("CARGO_MANIFEST_DIR"), src)); + let mut config = Config::default(); config.target_rustcflags = Some(format!( - "-L dependency={} --extern objc2={}", - deps_dir.display(), - dir.display() + "-L dependency={dep}{flags}", + dep = dep_dir, + flags = flags, )); config.llvm_filecheck = Some( env::var("FILECHECK") @@ -65,14 +63,24 @@ fn run(src: &'static str, mode: Mode) { .into(), ); config.edition = Some("2018".into()); - config.verbose = true; + config.verbose = matches!( + std::env::var("CARGO_TERM_VERBOSE").as_deref(), + Ok("true" | "1") + ) || std::env::args().any(|val| val == "--verbose" || val == "-v"); + // Run UI tests + config.src_base = manifest_dir.join("ui"); + config.mode = Mode::Ui; + run_tests(&config); + config.mode = Mode::CompileFail; + run_tests(&config); + + // Run Codegen tests + config.src_base = manifest_dir.join("codegen"); + config.mode = Mode::RunPass; + run_tests(&config); + config.mode = Mode::Codegen; run_tests(&config); -} -fn main() { - run("ui", Mode::Ui); - run("ui", Mode::CompileFail); - run("codegen", Mode::Codegen); - run("codegen", Mode::RunPass); + Ok(()) } From 10f627ed2a594dcd98e7893b3934e0b555e2ca1b Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Fri, 14 Jan 2022 15:26:33 +0100 Subject: [PATCH 11/11] Replace codegen tests with assembly tests --- .../assembly/test_msg_send_zero_cost.rs | 19 +++++++++++++++++++ .../codegen/test_msg_send_zero_cost.rs | 15 --------------- compile-tests/src/main.rs | 6 ++---- 3 files changed, 21 insertions(+), 19 deletions(-) create mode 100644 compile-tests/assembly/test_msg_send_zero_cost.rs delete mode 100644 compile-tests/codegen/test_msg_send_zero_cost.rs diff --git a/compile-tests/assembly/test_msg_send_zero_cost.rs b/compile-tests/assembly/test_msg_send_zero_cost.rs new file mode 100644 index 000000000..80861b292 --- /dev/null +++ b/compile-tests/assembly/test_msg_send_zero_cost.rs @@ -0,0 +1,19 @@ +// Test that msg_send! is inlined into an objc_msgSend +// +// assembly-output: emit-asm +// only-x86 +// compile-flags: -Copt-level=2 -Clto=off + +#![crate_type = "lib"] + +use objc2::runtime::{Class, Object, Sel}; +use objc2::MessageReceiver; + +// CHECK-LABEL: handle: +// CHECK-NOT: j +// CHECK-NOT: call +// CHECK: jmp _objc_msgSend +#[no_mangle] +pub fn handle(obj: &Class, sel: Sel) -> *mut Object { + unsafe { MessageReceiver::send_message(&obj, sel, ()).unwrap() } +} diff --git a/compile-tests/codegen/test_msg_send_zero_cost.rs b/compile-tests/codegen/test_msg_send_zero_cost.rs deleted file mode 100644 index 2734912c7..000000000 --- a/compile-tests/codegen/test_msg_send_zero_cost.rs +++ /dev/null @@ -1,15 +0,0 @@ -// Test that msg_send! is inlined into an objc_msgSend -// -// assembly-output: emit-asm -// only-x86 -// compile-flags: -Copt-level=3 - -use objc2::runtime::Object; -use objc2::{class, msg_send}; - -fn main() { - unsafe { - let cls = class!(NSObject); - let _obj: *mut Object = msg_send![cls, new]; - } -} diff --git a/compile-tests/src/main.rs b/compile-tests/src/main.rs index 463cbe0c0..37645b78a 100644 --- a/compile-tests/src/main.rs +++ b/compile-tests/src/main.rs @@ -76,10 +76,8 @@ fn main() -> io::Result<()> { run_tests(&config); // Run Codegen tests - config.src_base = manifest_dir.join("codegen"); - config.mode = Mode::RunPass; - run_tests(&config); - config.mode = Mode::Codegen; + config.src_base = manifest_dir.join("assembly"); + config.mode = Mode::Assembly; run_tests(&config); Ok(())