From 32f9b53ed8fe445ea11c7138e827190791058e05 Mon Sep 17 00:00:00 2001 From: "Jonathan A. Kollasch" Date: Fri, 18 May 2018 09:26:53 -0500 Subject: [PATCH 01/13] NetBSD on EABI ARM does not use ARM EHABI --- src/libpanic_unwind/gcc.rs | 4 ++-- src/libunwind/libunwind.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libpanic_unwind/gcc.rs b/src/libpanic_unwind/gcc.rs index eb6dc5b548869..06c264725a9bb 100644 --- a/src/libpanic_unwind/gcc.rs +++ b/src/libpanic_unwind/gcc.rs @@ -143,7 +143,7 @@ const UNWIND_DATA_REG: (i32, i32) = (24, 25); // I0, I1 // The personality routine for most of our targets, except ARM, which has a slightly different ABI // (however, iOS goes here as it uses SjLj unwinding). Also, the 64-bit Windows implementation // lives in seh64_gnu.rs -#[cfg(all(any(target_os = "ios", not(target_arch = "arm"))))] +#[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm"))))] #[lang = "eh_personality"] #[no_mangle] #[allow(unused)] @@ -184,7 +184,7 @@ unsafe extern "C" fn rust_eh_personality(version: c_int, // ARM EHABI personality routine. // http://infocenter.arm.com/help/topic/com.arm.doc.ihi0038b/IHI0038B_ehabi.pdf -#[cfg(all(target_arch = "arm", not(target_os = "ios")))] +#[cfg(all(target_arch = "arm", not(target_os = "ios"), not(target_os = "netbsd")))] #[lang = "eh_personality"] #[no_mangle] unsafe extern "C" fn rust_eh_personality(state: uw::_Unwind_State, diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs index a640a2b777537..73a259bd4438e 100644 --- a/src/libunwind/libunwind.rs +++ b/src/libunwind/libunwind.rs @@ -93,7 +93,7 @@ extern "C" { } cfg_if! { -if #[cfg(all(any(target_os = "ios", not(target_arch = "arm"))))] { +if #[cfg(all(any(target_os = "ios", target_os = "netbsd", not(target_arch = "arm"))))] { // Not ARM EHABI #[repr(C)] #[derive(Copy, Clone, PartialEq)] From 908230ee6d02627bca6e97fae6a1194b143e0b43 Mon Sep 17 00:00:00 2001 From: "Jonathan A. Kollasch" Date: Fri, 18 May 2018 09:26:53 -0500 Subject: [PATCH 02/13] Add armv7-unknown-netbsd-eabihf target --- src/bootstrap/native.rs | 1 + .../spec/armv7_unknown_netbsd_eabihf.rs | 35 +++++++++++++++++++ src/librustc_target/spec/mod.rs | 1 + 3 files changed, 37 insertions(+) create mode 100644 src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index 002044050f351..c542d6dbc524b 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -598,6 +598,7 @@ impl Step for Openssl { "arm-unknown-linux-gnueabihf" => "linux-armv4", "armv7-linux-androideabi" => "android-armv7", "armv7-unknown-linux-gnueabihf" => "linux-armv4", + "armv7-unknown-netbsd-eabihf" => "BSD-generic32", "i586-unknown-linux-gnu" => "linux-elf", "i586-unknown-linux-musl" => "linux-elf", "i686-apple-darwin" => "darwin-i386-cc", diff --git a/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs b/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs new file mode 100644 index 0000000000000..412c354611519 --- /dev/null +++ b/src/librustc_target/spec/armv7_unknown_netbsd_eabihf.rs @@ -0,0 +1,35 @@ +// Copyright 2016 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. + +use spec::{LinkerFlavor, Target, TargetOptions, TargetResult}; + +pub fn target() -> TargetResult { + let base = super::netbsd_base::opts(); + Ok(Target { + llvm_target: "armv7-unknown-netbsdelf-eabihf".to_string(), + target_endian: "little".to_string(), + target_pointer_width: "32".to_string(), + target_c_int_width: "32".to_string(), + data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(), + arch: "arm".to_string(), + target_os: "netbsd".to_string(), + target_env: "eabihf".to_string(), + target_vendor: "unknown".to_string(), + linker_flavor: LinkerFlavor::Gcc, + + options: TargetOptions { + features: "+v7,+vfp3,+d16,+thumb2,-neon".to_string(), + cpu: "generic".to_string(), + max_atomic_width: Some(64), + abi_blacklist: super::arm_base::abi_blacklist(), + .. base + } + }) +} diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index fb20fe9c8918f..0a6c3bb0ded71 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -317,6 +317,7 @@ supported_targets! { ("i686-unknown-openbsd", i686_unknown_openbsd), ("x86_64-unknown-openbsd", x86_64_unknown_openbsd), + ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf), ("i686-unknown-netbsd", i686_unknown_netbsd), ("powerpc-unknown-netbsd", powerpc_unknown_netbsd), ("sparc64-unknown-netbsd", sparc64_unknown_netbsd), From ec779b9f08a55a88b866d2c9d514cb104af5c052 Mon Sep 17 00:00:00 2001 From: "Jonathan A. Kollasch" Date: Fri, 18 May 2018 09:26:53 -0500 Subject: [PATCH 03/13] Add armv6-unknown-netbsd-eabihf target --- src/bootstrap/native.rs | 1 + .../spec/armv6_unknown_netbsd_eabihf.rs | 34 +++++++++++++++++++ src/librustc_target/spec/mod.rs | 1 + 3 files changed, 36 insertions(+) create mode 100644 src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index c542d6dbc524b..93292c658bad2 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -596,6 +596,7 @@ impl Step for Openssl { "arm-linux-androideabi" => "android", "arm-unknown-linux-gnueabi" => "linux-armv4", "arm-unknown-linux-gnueabihf" => "linux-armv4", + "armv6-unknown-netbsd-eabihf" => "BSD-generic32", "armv7-linux-androideabi" => "android-armv7", "armv7-unknown-linux-gnueabihf" => "linux-armv4", "armv7-unknown-netbsd-eabihf" => "BSD-generic32", diff --git a/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs b/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs new file mode 100644 index 0000000000000..38f0f34211daf --- /dev/null +++ b/src/librustc_target/spec/armv6_unknown_netbsd_eabihf.rs @@ -0,0 +1,34 @@ +// Copyright 2014 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. + +use spec::{LinkerFlavor, Target, TargetOptions, TargetResult}; + +pub fn target() -> TargetResult { + let mut base = super::netbsd_base::opts(); + base.max_atomic_width = Some(64); + Ok(Target { + llvm_target: "armv6-unknown-netbsdelf-eabihf".to_string(), + target_endian: "little".to_string(), + target_pointer_width: "32".to_string(), + target_c_int_width: "32".to_string(), + data_layout: "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64".to_string(), + arch: "arm".to_string(), + target_os: "netbsd".to_string(), + target_env: "eabihf".to_string(), + target_vendor: "unknown".to_string(), + linker_flavor: LinkerFlavor::Gcc, + + options: TargetOptions { + features: "+v6,+vfp2".to_string(), + abi_blacklist: super::arm_base::abi_blacklist(), + .. base + } + }) +} diff --git a/src/librustc_target/spec/mod.rs b/src/librustc_target/spec/mod.rs index 0a6c3bb0ded71..12f0f74274348 100644 --- a/src/librustc_target/spec/mod.rs +++ b/src/librustc_target/spec/mod.rs @@ -317,6 +317,7 @@ supported_targets! { ("i686-unknown-openbsd", i686_unknown_openbsd), ("x86_64-unknown-openbsd", x86_64_unknown_openbsd), + ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf), ("armv7-unknown-netbsd-eabihf", armv7_unknown_netbsd_eabihf), ("i686-unknown-netbsd", i686_unknown_netbsd), ("powerpc-unknown-netbsd", powerpc_unknown_netbsd), From f6df1740b6fda41fb0b2dc0634fc4932355e7aa2 Mon Sep 17 00:00:00 2001 From: Benjamin Lamowski Date: Mon, 21 May 2018 20:58:19 -0400 Subject: [PATCH 04/13] rust-gdb: work around the re-used -d argument in cgdb Use --directory= instead of -d, because cgdb reuses the short option. --- src/etc/rust-gdb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/etc/rust-gdb b/src/etc/rust-gdb index 52601cd96f80d..6835d6aa90874 100755 --- a/src/etc/rust-gdb +++ b/src/etc/rust-gdb @@ -21,6 +21,6 @@ GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" # different/specific command (defaults to `gdb`). RUST_GDB="${RUST_GDB:-gdb}" PYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" ${RUST_GDB} \ - -d "$GDB_PYTHON_MODULE_DIRECTORY" \ + --directory="$GDB_PYTHON_MODULE_DIRECTORY" \ -iex "add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY" \ "$@" From 599b79ebf522aa9e7507a602844b2da573160347 Mon Sep 17 00:00:00 2001 From: Michael Woerister Date: Tue, 22 May 2018 15:00:50 +0200 Subject: [PATCH 05/13] Make sure that queries have predictable symbol names. --- src/librustc/ty/maps/plumbing.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/librustc/ty/maps/plumbing.rs b/src/librustc/ty/maps/plumbing.rs index 065b7939ac362..e8863daecd8cb 100644 --- a/src/librustc/ty/maps/plumbing.rs +++ b/src/librustc/ty/maps/plumbing.rs @@ -697,6 +697,16 @@ macro_rules! define_maps { })* } + // This module and the functions in it exist only to provide a + // predictable symbol name prefix for query providers. This is helpful + // for analyzing queries in profilers. + pub(super) mod __query_compute { + $(#[inline(never)] + pub fn $name R, R>(f: F) -> R { + f() + })* + } + $(impl<$tcx> QueryConfig<$tcx> for queries::$name<$tcx> { type Key = $K; type Value = $V; @@ -718,9 +728,12 @@ macro_rules! define_maps { DepNode::new(tcx, $node(*key)) } + #[inline] fn compute(tcx: TyCtxt<'_, 'tcx, '_>, key: Self::Key) -> Self::Value { - let provider = tcx.maps.providers[key.map_crate()].$name; - provider(tcx.global_tcx(), key) + __query_compute::$name(move || { + let provider = tcx.maps.providers[key.map_crate()].$name; + provider(tcx.global_tcx(), key) + }) } fn handle_cycle_error(tcx: TyCtxt<'_, 'tcx, '_>) -> Self::Value { From 58bf6acfbe1983604925d1d80075eb116ef7f97a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 22 May 2018 07:24:47 -0700 Subject: [PATCH 06/13] Update LLVM to pull in another wasm fix Closes #50869 --- src/llvm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm b/src/llvm index 56c931901cfb8..9ad4b7e8d7d16 160000 --- a/src/llvm +++ b/src/llvm @@ -1 +1 @@ -Subproject commit 56c931901cfb85cd6f7ed44c7d7520a8de1edf97 +Subproject commit 9ad4b7e8d7d1618fc9686aa8d3d0b4de3b7a6f36 From 54f0668a1084b8e64355de5b194fc2fd02fe3854 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 22 May 2018 19:23:40 +0200 Subject: [PATCH 07/13] Add -Z no-parallel-llvm flag Codegen issues commonly only manifest under specific circumstances, e.g. if multiple codegen units are used and ThinLTO is enabled. However, these configuration are threaded, making the use of LLVM debugging facilities hard, as output is interleaved. This patch adds a -Z no-parallel-llvm flag, which allows disabling parallelization of codegen and linking, while otherwise preserving behavior with regard to codegen units and LTO. --- src/librustc/session/config.rs | 2 ++ src/librustc_codegen_llvm/back/write.rs | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 960bbfdd1ef71..b3f1b9c8e627c 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1337,6 +1337,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "enable the experimental Chalk-based trait solving engine"), cross_lang_lto: CrossLangLto = (CrossLangLto::Disabled, parse_cross_lang_lto, [TRACKED], "generate build artifacts that are compatible with linker-based LTO."), + no_parallel_llvm: bool = (false, parse_bool, [UNTRACKED], + "don't run LLVM in parallel (while keeping codegen-units and ThinLTO)"), } pub fn default_lib_output() -> CrateType { diff --git a/src/librustc_codegen_llvm/back/write.rs b/src/librustc_codegen_llvm/back/write.rs index 1151e0131313d..baab3c618be58 100644 --- a/src/librustc_codegen_llvm/back/write.rs +++ b/src/librustc_codegen_llvm/back/write.rs @@ -1738,7 +1738,9 @@ fn start_executing_work(tcx: TyCtxt, .binary_search_by_key(&cost, |&(_, cost)| cost) .unwrap_or_else(|e| e); work_items.insert(insertion_index, (work, cost)); - helper.request_token(); + if !cgcx.opts.debugging_opts.no_parallel_llvm { + helper.request_token(); + } } } @@ -1842,7 +1844,9 @@ fn start_executing_work(tcx: TyCtxt, }; work_items.insert(insertion_index, (llvm_work_item, cost)); - helper.request_token(); + if !cgcx.opts.debugging_opts.no_parallel_llvm { + helper.request_token(); + } assert_eq!(main_thread_worker_state, MainThreadWorkerState::Codegenning); main_thread_worker_state = MainThreadWorkerState::Idle; From d7086cac3dd8647d6d8043fc1662fb5fbb895df3 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Tue, 22 May 2018 13:29:28 -0700 Subject: [PATCH 08/13] Fix span for type-only arguments --- src/libsyntax/parse/parser.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 49b30c6f460fe..15ae0198e6811 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -1761,27 +1761,27 @@ impl<'a> Parser<'a> { pub fn parse_arg_general(&mut self, require_name: bool) -> PResult<'a, Arg> { maybe_whole!(self, NtArg, |x| x); - let pat = if require_name || self.is_named_argument() { + let (pat, ty) = if require_name || self.is_named_argument() { debug!("parse_arg_general parse_pat (require_name:{})", require_name); let pat = self.parse_pat()?; self.expect(&token::Colon)?; - pat + (pat, self.parse_ty()?) } else { debug!("parse_arg_general ident_to_pat"); let ident = Ident::new(keywords::Invalid.name(), self.prev_span); - P(Pat { + let ty = self.parse_ty()?; + let pat = P(Pat { id: ast::DUMMY_NODE_ID, node: PatKind::Ident(BindingMode::ByValue(Mutability::Immutable), ident, None), - span: ident.span, - }) + span: ty.span, + }); + (pat, ty) }; - let t = self.parse_ty()?; - Ok(Arg { - ty: t, + ty, pat, id: ast::DUMMY_NODE_ID, }) From 8d0fad5d3832c6c1f14542ea0be038274e454524 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 22 May 2018 15:27:58 +1000 Subject: [PATCH 09/13] Shrink `LiveNode`. `Liveness::users` is a vector that is occasionally enormous. For example, doing a "clean incremental" check build of `inflate`, there is one instance that represents 5,499 live nodes and 1087 vars, which requires 5,977,413 entries. At 24 bytes per entry, that is 143MB. This patch changes LiveNode from a usize to a u32. On 64-bit machines that halves the size of these entries, significantly reducing peak memory usage and memory traffic, and speeding up "clean incremental" builds of `inflate` by about 10%. --- src/librustc/middle/liveness.rs | 34 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/librustc/middle/liveness.rs b/src/librustc/middle/liveness.rs index 3db8c746713fd..ad39f48972f69 100644 --- a/src/librustc/middle/liveness.rs +++ b/src/librustc/middle/liveness.rs @@ -51,8 +51,8 @@ //! enclosing function. On the way down the tree, it identifies those AST //! nodes and variable IDs that will be needed for the liveness analysis //! and assigns them contiguous IDs. The liveness id for an AST node is -//! called a `live_node` (it's a newtype'd usize) and the id for a variable -//! is called a `variable` (another newtype'd usize). +//! called a `live_node` (it's a newtype'd u32) and the id for a variable +//! is called a `variable` (another newtype'd u32). //! //! On the way back up the tree, as we are about to exit from a function //! declaration we allocate a `liveness` instance. Now that we know @@ -112,7 +112,7 @@ use lint; use util::nodemap::{NodeMap, NodeSet}; use std::collections::VecDeque; -use std::{fmt, usize}; +use std::{fmt, u32}; use std::io::prelude::*; use std::io; use std::rc::Rc; @@ -134,23 +134,17 @@ enum LoopKind<'a> { } #[derive(Copy, Clone, PartialEq)] -struct Variable(usize); +struct Variable(u32); -#[derive(Copy, PartialEq)] -struct LiveNode(usize); +#[derive(Copy, Clone, PartialEq)] +struct LiveNode(u32); impl Variable { - fn get(&self) -> usize { let Variable(v) = *self; v } + fn get(&self) -> usize { self.0 as usize } } impl LiveNode { - fn get(&self) -> usize { let LiveNode(v) = *self; v } -} - -impl Clone for LiveNode { - fn clone(&self) -> LiveNode { - LiveNode(self.get()) - } + fn get(&self) -> usize { self.0 as usize } } #[derive(Copy, Clone, PartialEq, Debug)] @@ -233,11 +227,11 @@ impl fmt::Debug for Variable { impl LiveNode { fn is_valid(&self) -> bool { - self.get() != usize::MAX + self.0 != u32::MAX } } -fn invalid_node() -> LiveNode { LiveNode(usize::MAX) } +fn invalid_node() -> LiveNode { LiveNode(u32::MAX) } struct CaptureInfo { ln: LiveNode, @@ -285,7 +279,7 @@ impl<'a, 'tcx> IrMaps<'a, 'tcx> { } fn add_live_node(&mut self, lnk: LiveNodeKind) -> LiveNode { - let ln = LiveNode(self.num_live_nodes); + let ln = LiveNode(self.num_live_nodes as u32); self.lnks.push(lnk); self.num_live_nodes += 1; @@ -303,7 +297,7 @@ impl<'a, 'tcx> IrMaps<'a, 'tcx> { } fn add_variable(&mut self, vk: VarKind) -> Variable { - let v = Variable(self.num_vars); + let v = Variable(self.num_vars as u32); self.var_kinds.push(vk); self.num_vars += 1; @@ -708,7 +702,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { for var_idx in 0..self.ir.num_vars { let idx = node_base_idx + var_idx; if test(idx).is_valid() { - write!(wr, " {:?}", Variable(var_idx))?; + write!(wr, " {:?}", Variable(var_idx as u32))?; } } Ok(()) @@ -848,7 +842,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { debug!("^^ liveness computation results for body {} (entry={:?})", { for ln_idx in 0..self.ir.num_live_nodes { - debug!("{:?}", self.ln_str(LiveNode(ln_idx))); + debug!("{:?}", self.ln_str(LiveNode(ln_idx as u32))); } body.id }, From 1977c62339acceabe711d8ca6bf9404475c7f75d Mon Sep 17 00:00:00 2001 From: Joe ST Date: Wed, 23 May 2018 15:01:11 +0100 Subject: [PATCH 10/13] move type def out of unsafe block from https://github.com/rust-lang/rust/pull/50863#discussion_r190213000 move the union definition outside of the unsafe block --- src/libcore/str/mod.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/libcore/str/mod.rs b/src/libcore/str/mod.rs index 70aaf10f4213e..13d808ede5f65 100644 --- a/src/libcore/str/mod.rs +++ b/src/libcore/str/mod.rs @@ -2246,13 +2246,11 @@ impl str { #[inline(always)] #[rustc_const_unstable(feature="const_str_as_bytes")] pub const fn as_bytes(&self) -> &[u8] { - unsafe { - union Slices<'a> { - str: &'a str, - slice: &'a [u8], - } - Slices { str: self }.slice + union Slices<'a> { + str: &'a str, + slice: &'a [u8], } + unsafe { Slices { str: self }.slice } } /// Converts a mutable string slice to a mutable byte slice. To convert the From e3d9f1921973ee260753a0fb434c70185d2d96db Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Wed, 23 May 2018 16:22:18 -0500 Subject: [PATCH 11/13] rustdoc: hide macro export statements from docs --- src/librustdoc/clean/inline.rs | 3 +++ src/librustdoc/visit_ast.rs | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index a8f4848bf89f2..782c8bf6dd177 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -97,6 +97,9 @@ pub fn try_inline(cx: &DocContext, def: Def, name: ast::Name, visited: &mut FxHa record_extern_fqn(cx, did, clean::TypeKind::Const); clean::ConstantItem(build_const(cx, did)) } + // Macros are eagerly inlined back in visit_ast, don't show their export statements + // FIXME(50647): the eager inline does not take doc(hidden)/doc(no_inline) into account + Def::Macro(..) => return Some(Vec::new()), _ => return None, }; cx.renderinfo.borrow_mut().inlined.insert(did); diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 6db02cc6cc105..8c2555c4b3de2 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -219,6 +219,8 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> { if let Some(exports) = self.cx.tcx.module_exports(def_id) { for export in exports.iter().filter(|e| e.vis == Visibility::Public) { if let Def::Macro(def_id, ..) = export.def { + // FIXME(50647): this eager macro inlining does not take + // doc(hidden)/doc(no_inline) into account if def_id.krate == LOCAL_CRATE { continue // These are `krate.exported_macros`, handled in `self.visit()`. } @@ -237,6 +239,7 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> { unreachable!() }; + debug!("inlining macro {}", def.ident.name); om.macros.push(Macro { def_id, attrs: def.attrs.clone().into(), @@ -561,6 +564,7 @@ impl<'a, 'tcx, 'rcx> RustdocVisitor<'a, 'tcx, 'rcx> { // convert each exported_macro into a doc item fn visit_local_macro(&self, def: &hir::MacroDef) -> Macro { + debug!("visit_local_macro: {}", def.name); let tts = def.body.trees().collect::>(); // Extract the spans of all matchers. They represent the "interface" of the macro. let matchers = tts.chunks(4).map(|arm| arm[0].span()).collect(); From d19b5edfb0bde5bc2929668eeacb543c02f66bb7 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Wed, 23 May 2018 16:39:47 -0500 Subject: [PATCH 12/13] update "pub-use-extern-macros" test to hide the regular import statement --- src/test/rustdoc/pub-use-extern-macros.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/rustdoc/pub-use-extern-macros.rs b/src/test/rustdoc/pub-use-extern-macros.rs index 57d54585d84bc..2c1f2bf0be4f4 100644 --- a/src/test/rustdoc/pub-use-extern-macros.rs +++ b/src/test/rustdoc/pub-use-extern-macros.rs @@ -15,6 +15,7 @@ extern crate macros; // @has pub_use_extern_macros/macro.bar.html +// @!has pub_use_extern_macros/index.html 'pub use macros::bar;' pub use macros::bar; // @has pub_use_extern_macros/macro.baz.html From 4cf0c5fa329011b5e8059185d00dc069616c8979 Mon Sep 17 00:00:00 2001 From: QuietMisdreavus Date: Wed, 23 May 2018 20:53:45 -0500 Subject: [PATCH 13/13] fix @!has conditions in pub-use-extern-macros test --- src/test/rustdoc/pub-use-extern-macros.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/rustdoc/pub-use-extern-macros.rs b/src/test/rustdoc/pub-use-extern-macros.rs index 2c1f2bf0be4f4..a6e707cc2adea 100644 --- a/src/test/rustdoc/pub-use-extern-macros.rs +++ b/src/test/rustdoc/pub-use-extern-macros.rs @@ -15,15 +15,15 @@ extern crate macros; // @has pub_use_extern_macros/macro.bar.html -// @!has pub_use_extern_macros/index.html 'pub use macros::bar;' +// @!has pub_use_extern_macros/index.html '//code' 'pub use macros::bar;' pub use macros::bar; // @has pub_use_extern_macros/macro.baz.html -// @!has pub_use_extern_macros/index.html 'pub use macros::baz;' +// @!has pub_use_extern_macros/index.html '//code' 'pub use macros::baz;' #[doc(inline)] pub use macros::baz; // @has pub_use_extern_macros/macro.quux.html -// @!has pub_use_extern_macros/index.html 'pub use macros::quux;' +// @!has pub_use_extern_macros/index.html '//code' 'pub use macros::quux;' #[doc(hidden)] pub use macros::quux;