summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2020-04-03 22:55:12 +0200
committerGitHub <noreply@github.com>2020-04-03 22:55:12 +0200
commit80690b0418aa2f352fda2fe436233e00356cb95a (patch)
tree89280a94adc976f98b842ab2bcba8ca3a4ba8134
parentaa42d12d16982713bde501bb8a258196129499b6 (diff)
parentf030635e667d3927ccaf4dbbab1c096485d87049 (diff)
downloadrust-80690b0418aa2f352fda2fe436233e00356cb95a.tar.gz
Rollup merge of #70720 - ecstatic-morse:issue-70637, r=oli-obk
Place TLS initializers with relocations in .tdata Should fix #70673, although I'm not sure how to test this. Perhaps @joshlf could find a MCVE? Also adds more context to the FIXME. r? @oli-obk
-rw-r--r--src/librustc_codegen_llvm/consts.rs29
-rw-r--r--src/test/ui/issues/issue-70673.rs12
2 files changed, 25 insertions, 16 deletions
diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs
index 2d5564abfb2..9fd22c8b07b 100644
--- a/src/librustc_codegen_llvm/consts.rs
+++ b/src/librustc_codegen_llvm/consts.rs
@@ -436,24 +436,21 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> {
//
// We could remove this hack whenever we decide to drop macOS 10.10 support.
if self.tcx.sess.target.target.options.is_like_osx {
- assert_eq!(alloc.relocations().len(), 0);
-
- let is_zeroed = {
- // Treats undefined bytes as if they were defined with the byte value that
- // happens to be currently assigned in mir. This is valid since reading
- // undef bytes may yield arbitrary values.
- //
- // FIXME: ignore undef bytes even with representation `!= 0`.
- //
- // The `inspect` method is okay here because we checked relocations, and
- // because we are doing this access to inspect the final interpreter state
- // (not as part of the interpreter execution).
- alloc
+ // The `inspect` method is okay here because we checked relocations, and
+ // because we are doing this access to inspect the final interpreter state
+ // (not as part of the interpreter execution).
+ //
+ // FIXME: This check requires that the (arbitrary) value of undefined bytes
+ // happens to be zero. Instead, we should only check the value of defined bytes
+ // and set all undefined bytes to zero if this allocation is headed for the
+ // BSS.
+ let all_bytes_are_zero = alloc.relocations().is_empty()
+ && alloc
.inspect_with_undef_and_ptr_outside_interpreter(0..alloc.len())
.iter()
- .all(|b| *b == 0)
- };
- let sect_name = if is_zeroed {
+ .all(|&byte| byte == 0);
+
+ let sect_name = if all_bytes_are_zero {
CStr::from_bytes_with_nul_unchecked(b"__DATA,__thread_bss\0")
} else {
CStr::from_bytes_with_nul_unchecked(b"__DATA,__thread_data\0")
diff --git a/src/test/ui/issues/issue-70673.rs b/src/test/ui/issues/issue-70673.rs
new file mode 100644
index 00000000000..3561f401277
--- /dev/null
+++ b/src/test/ui/issues/issue-70673.rs
@@ -0,0 +1,12 @@
+// Regression test for https://github.com/rust-lang/rust/issues/70673.
+
+// run-pass
+
+#![feature(thread_local)]
+
+#[thread_local]
+static A: &u8 = &42;
+
+fn main() {
+ dbg!(*A);
+}