66 lines
2.6 KiB
Diff
66 lines
2.6 KiB
Diff
From 2a42d59c3671f3ab68d8ff49c46240842aff6eb6 Mon Sep 17 00:00:00 2001
|
|
From: Steven Walter <swalter@lexmark.com>
|
|
Date: Wed, 18 Nov 2015 08:33:26 -0500
|
|
Subject: [PATCH 07/10] Allow overriding crate_hash with -C crate_hash
|
|
|
|
The current crate hash is not stable from run-to-run. This causes
|
|
problems with bitbake; it needs a guarantee that every build with the
|
|
same input will generate compatible output, otherwise sstate won't work.
|
|
Using -C crate_hash, we can do that by using the bitbake input hash to
|
|
determine the crate hash; the bitbake input hash will be stable, but
|
|
still different for different rust recipes.
|
|
|
|
Upstream-Status: not-appropriate
|
|
|
|
Upstream wants to fix it's actual object generation here. See
|
|
https://github.com/rust-lang/rust/issues/34902 (and others) for details.
|
|
---
|
|
src/librustc/session/config.rs | 2 ++
|
|
src/librustc_trans/back/link.rs | 12 +++++++++++-
|
|
2 files changed, 13 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs
|
|
index 563f3ac..52a5130 100644
|
|
--- a/src/librustc/session/config.rs
|
|
+++ b/src/librustc/session/config.rs
|
|
@@ -804,6 +804,8 @@ options! {CodegenOptions, CodegenSetter, basic_codegen_options,
|
|
"choose the code model to use (rustc --print code-models for details)"),
|
|
metadata: Vec<String> = (Vec::new(), parse_list, [TRACKED],
|
|
"metadata to mangle symbol names with"),
|
|
+ crate_hash: String = ("".to_string(), parse_string, [TRACKED],
|
|
+ "override crate hash with given value"),
|
|
extra_filename: String = ("".to_string(), parse_string, [UNTRACKED],
|
|
"extra data to put in each output filename"),
|
|
codegen_units: usize = (1, parse_uint, [UNTRACKED],
|
|
diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs
|
|
index 3cf2500..0e48063 100644
|
|
--- a/src/librustc_trans/back/link.rs
|
|
+++ b/src/librustc_trans/back/link.rs
|
|
@@ -125,12 +125,22 @@ pub fn find_crate_name(sess: Option<&Session>,
|
|
|
|
}
|
|
|
|
+use std::hash::{Hasher, SipHasher};
|
|
+use rustc::hir::svh::Svh;
|
|
+
|
|
pub fn build_link_meta<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
|
|
name: &str)
|
|
-> LinkMeta {
|
|
+ let crate_hash = if tcx.sess.opts.cg.crate_hash != "" {
|
|
+ let mut state = SipHasher::new();
|
|
+ state.write(tcx.sess.opts.cg.crate_hash.as_bytes());
|
|
+ Svh::new(state.finish())
|
|
+ } else {
|
|
+ tcx.calculate_krate_hash()
|
|
+ };
|
|
let r = LinkMeta {
|
|
crate_name: name.to_owned(),
|
|
- crate_hash: tcx.calculate_krate_hash(),
|
|
+ crate_hash: crate_hash,
|
|
};
|
|
info!("{:?}", r);
|
|
return r;
|
|
--
|
|
2.10.0
|
|
|