From 8756ef6385ef8a1c77d46f44b54e4580cfcadc6d Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 16 Jan 2018 17:30:11 +0100 Subject: [PATCH 1/2] Don't include DefIndex in plugin- and proc-macro registrar fn symbol. --- src/librustc/session/mod.rs | 16 +++++++--------- src/librustc_metadata/creader.rs | 16 +++++++--------- src/librustc_plugin/load.rs | 4 ++-- src/librustc_trans/back/symbol_export.rs | 3 +-- src/librustc_trans/back/symbol_names.rs | 6 ++---- 5 files changed, 19 insertions(+), 26 deletions(-) diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 3ae7d01823c..94fcfb7e2aa 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -11,7 +11,7 @@ pub use self::code_stats::{CodeStats, DataTypeKind, FieldInfo}; pub use self::code_stats::{SizeKind, TypeSizeInfo, VariantInfo}; -use hir::def_id::{CrateNum, DefIndex}; +use hir::def_id::CrateNum; use ich::Fingerprint; use lint; @@ -558,18 +558,16 @@ impl Session { /// Returns the symbol name for the registrar function, /// given the crate Svh and the function DefIndex. - pub fn generate_plugin_registrar_symbol(&self, disambiguator: CrateDisambiguator, - index: DefIndex) + pub fn generate_plugin_registrar_symbol(&self, + disambiguator: CrateDisambiguator) -> String { - format!("__rustc_plugin_registrar__{}_{}", disambiguator.to_fingerprint().to_hex(), - index.to_proc_macro_index()) + format!("__rustc_plugin_registrar_{}__", disambiguator.to_fingerprint().to_hex()) } - pub fn generate_derive_registrar_symbol(&self, disambiguator: CrateDisambiguator, - index: DefIndex) + pub fn generate_derive_registrar_symbol(&self, + disambiguator: CrateDisambiguator) -> String { - format!("__rustc_derive_registrar__{}_{}", disambiguator.to_fingerprint().to_hex(), - index.to_proc_macro_index()) + format!("__rustc_derive_registrar_{}__", disambiguator.to_fingerprint().to_hex()) } pub fn sysroot<'a>(&'a self) -> &'a Path { diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index 946eecaa45f..246f5c9255e 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -15,7 +15,7 @@ use locator::{self, CratePaths}; use native_libs::relevant_lib; use schema::CrateRoot; -use rustc::hir::def_id::{CrateNum, DefIndex, CRATE_DEF_INDEX}; +use rustc::hir::def_id::{CrateNum, CRATE_DEF_INDEX}; use rustc::hir::svh::Svh; use rustc::middle::allocator::AllocatorKind; use rustc::middle::cstore::DepKind; @@ -532,8 +532,7 @@ impl<'a> CrateLoader<'a> { Err(err) => self.sess.span_fatal(span, &err), }; - let sym = self.sess.generate_derive_registrar_symbol(root.disambiguator, - root.macro_derive_registrar.unwrap()); + let sym = self.sess.generate_derive_registrar_symbol(root.disambiguator); let registrar = unsafe { let sym = match lib.symbol(&sym) { Ok(f) => f, @@ -588,7 +587,7 @@ impl<'a> CrateLoader<'a> { pub fn find_plugin_registrar(&mut self, span: Span, name: &str) - -> Option<(PathBuf, CrateDisambiguator, DefIndex)> { + -> Option<(PathBuf, CrateDisambiguator)> { let name = Symbol::intern(name); let ekrate = self.read_extension_crate(span, name, name); @@ -603,11 +602,11 @@ impl<'a> CrateLoader<'a> { } let root = ekrate.metadata.get_root(); - match (ekrate.dylib.as_ref(), root.plugin_registrar_fn) { - (Some(dylib), Some(reg)) => { - Some((dylib.to_path_buf(), root.disambiguator, reg)) + match ekrate.dylib.as_ref() { + Some(dylib) => { + Some((dylib.to_path_buf(), root.disambiguator)) } - (None, Some(_)) => { + None => { span_err!(self.sess, span, E0457, "plugin `{}` only found in rlib format, but must be available \ in dylib format", @@ -616,7 +615,6 @@ impl<'a> CrateLoader<'a> { // empty dylib. None } - _ => None, } } diff --git a/src/librustc_plugin/load.rs b/src/librustc_plugin/load.rs index 8a4ec03b20e..a46b85d93cb 100644 --- a/src/librustc_plugin/load.rs +++ b/src/librustc_plugin/load.rs @@ -100,8 +100,8 @@ impl<'a> PluginLoader<'a> { fn load_plugin(&mut self, span: Span, name: &str, args: Vec) { let registrar = self.reader.find_plugin_registrar(span, name); - if let Some((lib, disambiguator, index)) = registrar { - let symbol = self.sess.generate_plugin_registrar_symbol(disambiguator, index); + if let Some((lib, disambiguator)) = registrar { + let symbol = self.sess.generate_plugin_registrar_symbol(disambiguator); let fun = self.dylink_registrar(span, lib, symbol); self.plugins.push(PluginRegistrar { fun, diff --git a/src/librustc_trans/back/symbol_export.rs b/src/librustc_trans/back/symbol_export.rs index fa6fe2e9e93..15ff59c7df9 100644 --- a/src/librustc_trans/back/symbol_export.rs +++ b/src/librustc_trans/back/symbol_export.rs @@ -115,9 +115,8 @@ pub fn provide(providers: &mut Providers) { if let Some(id) = tcx.sess.derive_registrar_fn.get() { let def_id = tcx.hir.local_def_id(id); - let idx = def_id.index; let disambiguator = tcx.sess.local_crate_disambiguator(); - let registrar = tcx.sess.generate_derive_registrar_symbol(disambiguator, idx); + let registrar = tcx.sess.generate_derive_registrar_symbol(disambiguator); local_crate.push((registrar, Some(def_id), SymbolExportLevel::C)); } diff --git a/src/librustc_trans/back/symbol_names.rs b/src/librustc_trans/back/symbol_names.rs index 825f306499a..3ceff659ea9 100644 --- a/src/librustc_trans/back/symbol_names.rs +++ b/src/librustc_trans/back/symbol_names.rs @@ -257,14 +257,12 @@ fn compute_symbol_name<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, instance: Instance if let Some(id) = node_id { if tcx.sess.plugin_registrar_fn.get() == Some(id) { - let idx = def_id.index; let disambiguator = tcx.sess.local_crate_disambiguator(); - return tcx.sess.generate_plugin_registrar_symbol(disambiguator, idx); + return tcx.sess.generate_plugin_registrar_symbol(disambiguator); } if tcx.sess.derive_registrar_fn.get() == Some(id) { - let idx = def_id.index; let disambiguator = tcx.sess.local_crate_disambiguator(); - return tcx.sess.generate_derive_registrar_symbol(disambiguator, idx); + return tcx.sess.generate_derive_registrar_symbol(disambiguator); } } From f0a7d8e2bd5a878ef65b34406637c1032507a675 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 16 Jan 2018 19:31:15 +0100 Subject: [PATCH 2/2] Add incremental-fulldeps test suite and regression test for #47290. --- src/bootstrap/check.rs | 5 +++ .../auxiliary/incremental_proc_macro_aux.rs | 31 +++++++++++++++++++ .../incremental_proc_macro.rs | 27 ++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 src/test/incremental-fulldeps/auxiliary/incremental_proc_macro_aux.rs create mode 100644 src/test/incremental-fulldeps/incremental_proc_macro.rs diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index ed110762cb3..ecaf4d0c08c 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -568,6 +568,11 @@ static HOST_COMPILETESTS: &[Test] = &[ mode: "compile-fail", suite: "compile-fail-fulldeps", }, + Test { + path: "src/test/incremental-fulldeps", + mode: "incremental", + suite: "incremental-fulldeps", + }, Test { path: "src/test/run-make", mode: "run-make", suite: "run-make" }, Test { path: "src/test/rustdoc", mode: "rustdoc", suite: "rustdoc" }, diff --git a/src/test/incremental-fulldeps/auxiliary/incremental_proc_macro_aux.rs b/src/test/incremental-fulldeps/auxiliary/incremental_proc_macro_aux.rs new file mode 100644 index 00000000000..e9f9ba86f23 --- /dev/null +++ b/src/test/incremental-fulldeps/auxiliary/incremental_proc_macro_aux.rs @@ -0,0 +1,31 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// no-prefer-dynamic + +#![crate_type = "proc-macro"] + +extern crate proc_macro; + +use proc_macro::TokenStream; + +// Add a function to shift DefIndex of registrar function +#[cfg(cfail2)] +fn foo() {} + +#[proc_macro_derive(IncrementalMacro)] +pub fn derive(input: TokenStream) -> TokenStream { + #[cfg(cfail2)] + { + foo(); + } + + "".parse().unwrap() +} diff --git a/src/test/incremental-fulldeps/incremental_proc_macro.rs b/src/test/incremental-fulldeps/incremental_proc_macro.rs new file mode 100644 index 00000000000..e4345070853 --- /dev/null +++ b/src/test/incremental-fulldeps/incremental_proc_macro.rs @@ -0,0 +1,27 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// aux-build:incremental_proc_macro_aux.rs +// ignore-stage1 +// revisions: cfail1 cfail2 +// must-compile-successfully + +// This test makes sure that we still find the proc-macro registrar function +// when we compile proc-macros incrementally (see #47292). + +#![crate_type = "rlib"] + +#[macro_use] +extern crate incremental_proc_macro_aux; + +#[derive(IncrementalMacro)] +pub struct Foo { + x: u32 +}