From cb3b8d4fcc7dfa4a6de8a0e31ef0521b7ace3bb9 Mon Sep 17 00:00:00 2001 From: Chris Wailes Date: Tue, 13 Jul 2021 11:11:12 -0700 Subject: [PATCH] Remove upstreamed patch This CL removes the patch that enables HWASan support for Rust. This functionality was upstreamed here: https://github.com/rust-lang/rust/pull/81506 Test: Build 1.52.1 Change-Id: I194f8eaf95000cb272b7dad695aa21218347717f --- patches/rustc-0013-HWASan-support.patch | 419 ------------------------ 1 file changed, 419 deletions(-) delete mode 100644 patches/rustc-0013-HWASan-support.patch diff --git a/patches/rustc-0013-HWASan-support.patch b/patches/rustc-0013-HWASan-support.patch deleted file mode 100644 index a34b762..0000000 --- a/patches/rustc-0013-HWASan-support.patch +++ /dev/null @@ -1,419 +0,0 @@ -From c7d9bffe76477a2f79c468b07e5eaf82525eea99 Mon Sep 17 00:00:00 2001 -From: Tri Vo -Date: Fri, 22 Jan 2021 18:32:38 -0800 -Subject: [PATCH] HWASan support - ---- - compiler/rustc_codegen_llvm/src/attributes.rs | 3 +++ - compiler/rustc_codegen_llvm/src/back/write.rs | 6 +++++ - compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 4 +++ - compiler/rustc_codegen_ssa/src/back/link.rs | 3 +++ - .../rustc_llvm/llvm-wrapper/LLVMWrapper.h | 1 + - .../rustc_llvm/llvm-wrapper/PassWrapper.cpp | 26 +++++++++++++++++++ - .../rustc_llvm/llvm-wrapper/RustWrapper.cpp | 2 ++ - compiler/rustc_session/src/config.rs | 20 +++++++++----- - compiler/rustc_session/src/options.rs | 3 ++- - compiler/rustc_session/src/session.rs | 6 ++++- - compiler/rustc_span/src/symbol.rs | 1 + - compiler/rustc_typeck/src/collect.rs | 4 ++- - src/bootstrap/configure.py | 2 +- - src/bootstrap/native.rs | 2 +- - .../ui/invalid/invalid-no-sanitize.stderr | 2 +- - src/test/ui/sanitize/hwaddress.rs | 19 ++++++++++++++ - src/tools/compiletest/src/header.rs | 5 ++++ - src/tools/compiletest/src/util.rs | 3 +++ - 18 files changed, 100 insertions(+), 12 deletions(-) - create mode 100644 src/test/ui/sanitize/hwaddress.rs - -diff --git a/compiler/rustc_codegen_llvm/src/attributes.rs b/compiler/rustc_codegen_llvm/src/attributes.rs -index a78d692aaa7fb..26111729ba5b2 100644 ---- a/compiler/rustc_codegen_llvm/src/attributes.rs -+++ b/compiler/rustc_codegen_llvm/src/attributes.rs -@@ -53,6 +53,9 @@ pub fn sanitize(cx: &CodegenCx<'ll, '_>, no_sanitize: SanitizerSet, llfn: &'ll V - if enabled.contains(SanitizerSet::THREAD) { - llvm::Attribute::SanitizeThread.apply_llfn(Function, llfn); - } -+ if enabled.contains(SanitizerSet::HWADDRESS) { -+ llvm::Attribute::SanitizeHWAddress.apply_llfn(Function, llfn); -+ } - } - - /// Tell LLVM to emit or not emit the information necessary to unwind the stack for the function. -diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs -index 326ae354ccf48..8b737c9a2e557 100644 ---- a/compiler/rustc_codegen_llvm/src/back/write.rs -+++ b/compiler/rustc_codegen_llvm/src/back/write.rs -@@ -440,6 +440,8 @@ pub(crate) unsafe fn optimize_with_new_llvm_pass_manager( - sanitize_memory_recover: config.sanitizer_recover.contains(SanitizerSet::MEMORY), - sanitize_memory_track_origins: config.sanitizer_memory_track_origins as c_int, - sanitize_thread: config.sanitizer.contains(SanitizerSet::THREAD), -+ sanitize_hwaddress: config.sanitizer.contains(SanitizerSet::HWADDRESS), -+ sanitize_hwaddress_recover: config.sanitizer_recover.contains(SanitizerSet::HWADDRESS), - }) - } else { - None -@@ -652,6 +654,10 @@ unsafe fn add_sanitizer_passes(config: &ModuleConfig, passes: &mut Vec<&'static - if config.sanitizer.contains(SanitizerSet::THREAD) { - passes.push(llvm::LLVMRustCreateThreadSanitizerPass()); - } -+ if config.sanitizer.contains(SanitizerSet::HWADDRESS) { -+ let recover = config.sanitizer_recover.contains(SanitizerSet::HWADDRESS); -+ passes.push(llvm::LLVMRustCreateHWAddressSanitizerPass(recover)); -+ } - } - - pub(crate) fn link( -diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs -index e82198f8f0c06..8c1740d8f25f0 100644 ---- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs -+++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs -@@ -131,6 +131,7 @@ pub enum Attribute { - ReturnsTwice = 25, - ReadNone = 26, - InaccessibleMemOnly = 27, -+ SanitizeHWAddress = 28, - } - - /// LLVMIntPredicate -@@ -439,6 +440,8 @@ pub struct SanitizerOptions { - pub sanitize_memory_recover: bool, - pub sanitize_memory_track_origins: c_int, - pub sanitize_thread: bool, -+ pub sanitize_hwaddress: bool, -+ pub sanitize_hwaddress_recover: bool, - } - - /// LLVMRelocMode -@@ -2128,6 +2131,7 @@ extern "C" { - Recover: bool, - ) -> &'static mut Pass; - pub fn LLVMRustCreateThreadSanitizerPass() -> &'static mut Pass; -+ pub fn LLVMRustCreateHWAddressSanitizerPass(Recover: bool) -> &'static mut Pass; - pub fn LLVMRustAddPass(PM: &PassManager<'_>, Pass: &'static mut Pass); - pub fn LLVMRustAddLastExtensionPasses( - PMB: &PassManagerBuilder, -diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs -index 8bc4e64422370..6c58417590e69 100644 ---- a/compiler/rustc_codegen_ssa/src/back/link.rs -+++ b/compiler/rustc_codegen_ssa/src/back/link.rs -@@ -893,6 +893,9 @@ fn link_sanitizers(sess: &Session, crate_type: CrateType, linker: &mut dyn Linke - if sanitizer.contains(SanitizerSet::THREAD) { - link_sanitizer_runtime(sess, linker, "tsan"); - } -+ if sanitizer.contains(SanitizerSet::HWADDRESS) { -+ link_sanitizer_runtime(sess, linker, "hwasan"); -+ } - } - - fn link_sanitizer_runtime(sess: &Session, linker: &mut dyn Linker, name: &str) { -diff --git a/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h b/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h -index 57b8664d3b605..0e3bf5615af7b 100644 ---- a/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h -+++ b/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h -@@ -85,6 +85,7 @@ enum LLVMRustAttribute { - ReturnsTwice = 25, - ReadNone = 26, - InaccessibleMemOnly = 27, -+ SanitizeHWAddress = 28, - }; - - typedef struct OpaqueRustString *RustStringRef; -diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp -index 2264908995bb7..5263d5dcf3e8f 100644 ---- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp -+++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp -@@ -33,6 +33,7 @@ - #include "llvm/Support/TimeProfiler.h" - #include "llvm/Transforms/Instrumentation/ThreadSanitizer.h" - #include "llvm/Transforms/Instrumentation/MemorySanitizer.h" -+#include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h" - #include "llvm/Transforms/Utils/CanonicalizeAliases.h" - #include "llvm/Transforms/Utils/NameAnonGlobals.h" - -@@ -133,6 +134,12 @@ extern "C" LLVMPassRef LLVMRustCreateThreadSanitizerPass() { - return wrap(createThreadSanitizerLegacyPassPass()); - } - -+extern "C" LLVMPassRef LLVMRustCreateHWAddressSanitizerPass(bool Recover) { -+ const bool CompileKernel = false; -+ -+ return wrap(createHWAddressSanitizerLegacyPassPass(CompileKernel, Recover)); -+} -+ - extern "C" LLVMRustPassKind LLVMRustPassKind(LLVMPassRef RustPass) { - assert(RustPass); - Pass *Pass = unwrap(RustPass); -@@ -722,6 +729,8 @@ struct LLVMRustSanitizerOptions { - bool SanitizeMemoryRecover; - int SanitizeMemoryTrackOrigins; - bool SanitizeThread; -+ bool SanitizeHWAddress; -+ bool SanitizeHWAddressRecover; - }; - - extern "C" void -@@ -886,6 +895,23 @@ LLVMRustOptimizeWithNewPassManager( - /*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover)); - } - ); -+#endif -+ } -+ if (SanitizerOptions->SanitizeHWAddress) { -+#if LLVM_VERSION_GE(11, 0) -+ OptimizerLastEPCallbacks.push_back( -+ [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { -+ MPM.addPass(HWAddressSanitizerPass( -+ /*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover)); -+ } -+ ); -+#else -+ PipelineStartEPCallbacks.push_back( -+ [SanitizerOptions](ModulePassManager &MPM) { -+ MPM.addPass(HWAddressSanitizerPass( -+ /*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover)); -+ } -+ ); - #endif - } - } -diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp -index 4118e93074563..45835990cecbb 100644 ---- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp -+++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp -@@ -205,6 +205,8 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) { - return Attribute::ReadNone; - case InaccessibleMemOnly: - return Attribute::InaccessibleMemOnly; -+ case SanitizeHWAddress: -+ return Attribute::SanitizeHWAddress; - } - report_fatal_error("bad AttributeKind"); - } -diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs -index e9ea0ab6f98f5..210dbb0ee9939 100644 ---- a/compiler/rustc_session/src/config.rs -+++ b/compiler/rustc_session/src/config.rs -@@ -43,6 +43,7 @@ bitflags! { - const LEAK = 1 << 1; - const MEMORY = 1 << 2; - const THREAD = 1 << 3; -+ const HWADDRESS = 1 << 4; - } - } - -@@ -56,6 +57,7 @@ impl fmt::Display for SanitizerSet { - SanitizerSet::LEAK => "leak", - SanitizerSet::MEMORY => "memory", - SanitizerSet::THREAD => "thread", -+ SanitizerSet::HWADDRESS => "hwaddress", - _ => panic!("unrecognized sanitizer {:?}", s), - }; - if !first { -@@ -73,12 +75,18 @@ impl IntoIterator for SanitizerSet { - type IntoIter = std::vec::IntoIter; - - fn into_iter(self) -> Self::IntoIter { -- [SanitizerSet::ADDRESS, SanitizerSet::LEAK, SanitizerSet::MEMORY, SanitizerSet::THREAD] -- .iter() -- .copied() -- .filter(|&s| self.contains(s)) -- .collect::>() -- .into_iter() -+ [ -+ SanitizerSet::ADDRESS, -+ SanitizerSet::LEAK, -+ SanitizerSet::MEMORY, -+ SanitizerSet::THREAD, -+ SanitizerSet::HWADDRESS, -+ ] -+ .iter() -+ .copied() -+ .filter(|&s| self.contains(s)) -+ .collect::>() -+ .into_iter() - } - } - -diff --git a/compiler/rustc_session/src/options.rs b/compiler/rustc_session/src/options.rs -index f78df8a7e29fa..baa0502521da7 100644 ---- a/compiler/rustc_session/src/options.rs -+++ b/compiler/rustc_session/src/options.rs -@@ -253,7 +253,7 @@ macro_rules! options { - pub const parse_passes: &str = "a space-separated list of passes, or `all`"; - pub const parse_panic_strategy: &str = "either `unwind` or `abort`"; - pub const parse_relro_level: &str = "one of: `full`, `partial`, or `off`"; -- pub const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `leak`, `memory` or `thread`"; -+ pub const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `hwaddress`, `leak`, `memory` or `thread`"; - pub const parse_sanitizer_memory_track_origins: &str = "0, 1, or 2"; - pub const parse_cfguard: &str = - "either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`"; -@@ -476,6 +476,7 @@ macro_rules! options { - "leak" => SanitizerSet::LEAK, - "memory" => SanitizerSet::MEMORY, - "thread" => SanitizerSet::THREAD, -+ "hwaddress" => SanitizerSet::HWADDRESS, - _ => return false, - } - } -diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs -index 69aa72d899fb3..a7ceb9e06a519 100644 ---- a/compiler/rustc_session/src/session.rs -+++ b/compiler/rustc_session/src/session.rs -@@ -1126,7 +1126,8 @@ impl Session { - self.opts.optimize != config::OptLevel::No - // AddressSanitizer uses lifetimes to detect use after scope bugs. - // MemorySanitizer uses lifetimes to detect use of uninitialized stack variables. -- || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY) -+ // HWAddressSanitizer will use lifetimes to detect use after scope bugs in the future. -+ || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY | SanitizerSet::HWADDRESS) - } - - pub fn link_dead_code(&self) -> bool { -@@ -1562,6 +1563,8 @@ fn validate_commandline_args_with_session_available(sess: &Session) { - "x86_64-unknown-freebsd", - "x86_64-unknown-linux-gnu", - ]; -+ const HWASAN_SUPPORTED_TARGETS: &[&str] = -+ &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; - - // Sanitizers can only be used on some tested platforms. - for s in sess.opts.debugging_opts.sanitizer { -@@ -1570,6 +1573,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) { - SanitizerSet::LEAK => LSAN_SUPPORTED_TARGETS, - SanitizerSet::MEMORY => MSAN_SUPPORTED_TARGETS, - SanitizerSet::THREAD => TSAN_SUPPORTED_TARGETS, -+ SanitizerSet::HWADDRESS => HWASAN_SUPPORTED_TARGETS, - _ => panic!("unrecognized sanitizer {}", s), - }; - if !supported_targets.contains(&&*sess.opts.target_triple.triple()) { -diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs -index 20e4f7262acb9..1c37a6b2aca18 100644 ---- a/compiler/rustc_span/src/symbol.rs -+++ b/compiler/rustc_span/src/symbol.rs -@@ -593,6 +593,7 @@ symbols! { - html_no_source, - html_playground_url, - html_root_url, -+ hwaddress, - i, - i128, - i128_type, -diff --git a/compiler/rustc_typeck/src/collect.rs b/compiler/rustc_typeck/src/collect.rs -index b1d98d75196d5..b89cbed3282ee 100644 ---- a/compiler/rustc_typeck/src/collect.rs -+++ b/compiler/rustc_typeck/src/collect.rs -@@ -2628,10 +2628,12 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs { - codegen_fn_attrs.no_sanitize |= SanitizerSet::MEMORY; - } else if item.has_name(sym::thread) { - codegen_fn_attrs.no_sanitize |= SanitizerSet::THREAD; -+ } else if item.has_name(sym::hwaddress) { -+ codegen_fn_attrs.no_sanitize |= SanitizerSet::HWADDRESS; - } else { - tcx.sess - .struct_span_err(item.span(), "invalid argument for `no_sanitize`") -- .note("expected one of: `address`, `memory` or `thread`") -+ .note("expected one of: `address`, `hwaddress`, `memory` or `thread`") - .emit(); - } - } -diff --git a/src/bootstrap/configure.py b/src/bootstrap/configure.py -index 2cabaee68ea67..2e6e9142afe6c 100755 ---- a/src/bootstrap/configure.py -+++ b/src/bootstrap/configure.py -@@ -51,7 +51,7 @@ def v(*args): - o("ninja", "llvm.ninja", "build LLVM using the Ninja generator (for MSVC, requires building in the correct environment)") - o("locked-deps", "build.locked-deps", "force Cargo.lock to be up to date") - o("vendor", "build.vendor", "enable usage of vendored Rust crates") --o("sanitizers", "build.sanitizers", "build the sanitizer runtimes (asan, lsan, msan, tsan)") -+o("sanitizers", "build.sanitizers", "build the sanitizer runtimes (asan, lsan, msan, tsan, hwasan)") - o("dist-src", "rust.dist-src", "when building tarballs enables building a source tarball") - o("cargo-native-static", "build.cargo-native-static", "static native libraries in cargo") - o("profiler", "build.profiler", "build the profiler runtime") -diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs -index 609ac8b366952..b5a8b694c9420 100644 ---- a/src/bootstrap/native.rs -+++ b/src/bootstrap/native.rs -@@ -804,7 +804,7 @@ fn supported_sanitizers( - "aarch64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]), - "aarch64-fuchsia" => common_libs("fuchsia", "aarch64", &["asan"]), - "aarch64-unknown-linux-gnu" => { -- common_libs("linux", "aarch64", &["asan", "lsan", "msan", "tsan"]) -+ common_libs("linux", "aarch64", &["asan", "lsan", "msan", "tsan", "hwasan"]) - } - "x86_64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]), - "x86_64-fuchsia" => common_libs("fuchsia", "x86_64", &["asan"]), -diff --git a/src/test/ui/invalid/invalid-no-sanitize.stderr b/src/test/ui/invalid/invalid-no-sanitize.stderr -index e9983e5fbd24d..4c0b17c7d3769 100644 ---- a/src/test/ui/invalid/invalid-no-sanitize.stderr -+++ b/src/test/ui/invalid/invalid-no-sanitize.stderr -@@ -4,7 +4,7 @@ error: invalid argument for `no_sanitize` - LL | #[no_sanitize(brontosaurus)] - | ^^^^^^^^^^^^ - | -- = note: expected one of: `address`, `memory` or `thread` -+ = note: expected one of: `address`, `hwaddress`, `memory` or `thread` - - error: aborting due to previous error - -diff --git a/src/test/ui/sanitize/hwaddress.rs b/src/test/ui/sanitize/hwaddress.rs -new file mode 100644 -index 0000000000000..ad5d0245457ec ---- /dev/null -+++ b/src/test/ui/sanitize/hwaddress.rs -@@ -0,0 +1,19 @@ -+// needs-sanitizer-support -+// needs-sanitizer-hwaddress -+// -+// compile-flags: -Z sanitizer=hwaddress -O -g -+// -+// run-fail -+// error-pattern: HWAddressSanitizer: tag-mismatch -+ -+#![feature(test)] -+ -+use std::hint::black_box; -+ -+fn main() { -+ let xs = vec![0, 1, 2, 3]; -+ // Avoid optimizing everything out. -+ let xs = black_box(xs.as_ptr()); -+ let code = unsafe { *xs.offset(4) }; -+ std::process::exit(code); -+} -diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs -index 2eba91fd1f4cf..becb6037e0bf4 100644 ---- a/src/tools/compiletest/src/header.rs -+++ b/src/tools/compiletest/src/header.rs -@@ -48,6 +48,7 @@ impl EarlyProps { - let has_lsan = util::LSAN_SUPPORTED_TARGETS.contains(&&*config.target); - let has_msan = util::MSAN_SUPPORTED_TARGETS.contains(&&*config.target); - let has_tsan = util::TSAN_SUPPORTED_TARGETS.contains(&&*config.target); -+ let has_hwasan = util::HWASAN_SUPPORTED_TARGETS.contains(&&*config.target); - - iter_header(testfile, None, rdr, &mut |ln| { - // we should check if any only- exists and if it exists -@@ -101,6 +102,10 @@ impl EarlyProps { - props.ignore = true; - } - -+ if !has_hwasan && config.parse_name_directive(ln, "needs-sanitizer-hwaddress") { -+ props.ignore = true; -+ } -+ - if config.target == "wasm32-unknown-unknown" && config.parse_check_run_results(ln) { - props.ignore = true; - } -diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs -index 292850bd9e277..b302953708c18 100644 ---- a/src/tools/compiletest/src/util.rs -+++ b/src/tools/compiletest/src/util.rs -@@ -110,6 +110,9 @@ pub const TSAN_SUPPORTED_TARGETS: &[&str] = &[ - "x86_64-unknown-linux-gnu", - ]; - -+pub const HWASAN_SUPPORTED_TARGETS: &[&str] = -+ &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; -+ - const BIG_ENDIAN: &[&str] = &[ - "aarch64_be", - "armebv7r",