| //! This checks the output of some `--print` options when output to a file (instead of stdout) |
| |
| // ignore-tidy-linelength |
| //@ needs-llvm-components: aarch64 arm avr bpf csky hexagon loongarch m68k mips msp430 nvptx powerpc riscv sparc systemz webassembly x86 |
| // FIXME(jieyouxu): there has to be a better way to do this, without the needs-llvm-components it |
| // will fail on LLVM built without all of the components listed above. If adding a new target that |
| // relies on a llvm component not listed above, it will need to be added to the required llvm |
| // components above. |
| |
| use std::path::PathBuf; |
| |
| use run_make_support::{rfs, rustc, target}; |
| |
| struct Option<'a> { |
| target: &'a str, |
| option: &'static str, |
| includes: &'static [&'static str], |
| } |
| |
| fn main() { |
| // Printed from CodegenBackend trait impl in rustc_codegen_llvm/src/lib.rs |
| check(Option { target: &target(), option: "relocation-models", includes: &["dynamic-no-pic"] }); |
| |
| // Printed by compiler/rustc_codegen_llvm/src/llvm_util.rs |
| check(Option { |
| target: "wasm32-unknown-unknown", |
| option: "target-features", |
| includes: &["reference-types"], |
| }); |
| |
| // Printed by C++ code in rustc_llvm/llvm-wrapper/PassWrapper.cpp |
| check(Option { |
| target: "wasm32-unknown-unknown", |
| option: "target-cpus", |
| includes: &["generic"], |
| }); |
| } |
| |
| fn check(args: Option) { |
| fn check_(output: &str, includes: &[&str]) { |
| for i in includes { |
| assert!(output.contains(i), "output doesn't contains: {}", i); |
| } |
| } |
| |
| // --print={option} |
| let stdout = rustc().target(args.target).print(args.option).run().stdout_utf8(); |
| |
| // --print={option}=PATH |
| let output = { |
| let tmp_path = PathBuf::from(format!("{}.txt", args.option)); |
| |
| rustc().target(args.target).print(&format!("{}={}", args.option, tmp_path.display())).run(); |
| |
| rfs::read_to_string(&tmp_path) |
| }; |
| |
| check_(&stdout, args.includes); |
| check_(&output, args.includes); |
| |
| assert_eq!(&stdout, &output); |
| } |