When building for the target, some build paths end up embedded in the binaries. 
These changes remove that. Further investigation is needed to work out the way
to resolve these issues properly upstream.

Upstream-Status: Inappropriate [patches need rework]
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>

Index: rustc-1.65.0-src/src/tools/clippy/src/driver.rs
===================================================================
--- rustc-1.65.0-src.orig/src/tools/clippy/src/driver.rs
+++ rustc-1.65.0-src/src/tools/clippy/src/driver.rs
@@ -259,7 +259,6 @@ pub fn main() {
                     .and_then(|out| String::from_utf8(out.stdout).ok())
                     .map(|s| PathBuf::from(s.trim()))
             })
-            .or_else(|| option_env!("SYSROOT").map(PathBuf::from))
             .or_else(|| {
                 let home = option_env!("RUSTUP_HOME")
                     .or(option_env!("MULTIRUST_HOME"))
Index: rustc-1.65.0-src/compiler/rustc_codegen_llvm/src/context.rs
===================================================================
--- rustc-1.65.0-src.orig/compiler/rustc_codegen_llvm/src/context.rs
+++ rustc-1.65.0-src/compiler/rustc_codegen_llvm/src/context.rs
@@ -155,46 +155,6 @@ pub unsafe fn create_module<'ll>(
         }
     }
 
-    // Ensure the data-layout values hardcoded remain the defaults.
-    if sess.target.is_builtin {
-        let tm = crate::back::write::create_informational_target_machine(tcx.sess);
-        llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm);
-        llvm::LLVMRustDisposeTargetMachine(tm);
-
-        let llvm_data_layout = llvm::LLVMGetDataLayoutStr(llmod);
-        let llvm_data_layout = str::from_utf8(CStr::from_ptr(llvm_data_layout).to_bytes())
-            .expect("got a non-UTF8 data-layout from LLVM");
-
-        // Unfortunately LLVM target specs change over time, and right now we
-        // don't have proper support to work with any more than one
-        // `data_layout` than the one that is in the rust-lang/rust repo. If
-        // this compiler is configured against a custom LLVM, we may have a
-        // differing data layout, even though we should update our own to use
-        // that one.
-        //
-        // As an interim hack, if CFG_LLVM_ROOT is not an empty string then we
-        // disable this check entirely as we may be configured with something
-        // that has a different target layout.
-        //
-        // Unsure if this will actually cause breakage when rustc is configured
-        // as such.
-        //
-        // FIXME(#34960)
-        let cfg_llvm_root = option_env!("CFG_LLVM_ROOT").unwrap_or("");
-        let custom_llvm_used = cfg_llvm_root.trim() != "";
-
-        if !custom_llvm_used && target_data_layout != llvm_data_layout {
-            bug!(
-                "data-layout for target `{rustc_target}`, `{rustc_layout}`, \
-                  differs from LLVM target's `{llvm_target}` default layout, `{llvm_layout}`",
-                rustc_target = sess.opts.target_triple,
-                rustc_layout = target_data_layout,
-                llvm_target = sess.target.llvm_target,
-                llvm_layout = llvm_data_layout
-            );
-        }
-    }
-
     let data_layout = SmallCStr::new(&target_data_layout);
     llvm::LLVMSetDataLayout(llmod, data_layout.as_ptr());
 
