Skip to content

Rollup of 7 pull requests #52574

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 15 commits into from
Jul 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ci/docker/run.sh
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ objdir=$root_dir/obj

mkdir -p $HOME/.cargo
mkdir -p $objdir/tmp
mkdir $objdir/cores
mkdir -p $objdir/cores

args=
if [ "$SCCACHE_BUCKET" != "" ]; then
Expand Down
2 changes: 1 addition & 1 deletion src/libcore/slice/rotate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ impl<T> RawArray<T> {
/// # Safety
///
/// The specified range must be valid for reading and writing.
/// The type `T` must have non-zero size.
///
/// # Algorithm
///
Expand All @@ -73,6 +72,7 @@ pub unsafe fn ptr_rotate<T>(mut left: usize, mid: *mut T, mut right: usize) {
loop {
let delta = cmp::min(left, right);
if delta <= RawArray::<T>::cap() {
// We will always hit this immediately for ZST.
break;
}

Expand Down
8 changes: 7 additions & 1 deletion src/librustc/hir/map/blocks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,12 @@ impl MaybeFnLike for ast::Item {
}
}

impl MaybeFnLike for ast::ImplItem {
fn is_fn_like(&self) -> bool {
match self.node { ast::ImplItemKind::Method(..) => true, _ => false, }
}
}

impl MaybeFnLike for ast::TraitItem {
fn is_fn_like(&self) -> bool {
match self.node {
Expand Down Expand Up @@ -141,7 +147,7 @@ impl<'a> FnLikeNode<'a> {
let fn_like = match node {
map::NodeItem(item) => item.is_fn_like(),
map::NodeTraitItem(tm) => tm.is_fn_like(),
map::NodeImplItem(_) => true,
map::NodeImplItem(it) => it.is_fn_like(),
map::NodeExpr(e) => e.is_fn_like(),
_ => false
};
Expand Down
14 changes: 0 additions & 14 deletions src/librustc_codegen_llvm/back/lto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -759,20 +759,6 @@ impl ThinModule {
cgcx.save_temp_bitcode(&module, "thin-lto-after-pm");
timeline.record("thin-done");

// FIXME: this is a hack around a bug in LLVM right now. Discovered in
// #46910 it was found out that on 32-bit MSVC LLVM will hit a codegen
// error if there's an available_externally function in the LLVM module.
// Typically we don't actually use these functions but ThinLTO makes
// heavy use of them when inlining across modules.
//
// Tracked upstream at https://bugs.llvm.org/show_bug.cgi?id=35736 this
// function call (and its definition on the C++ side of things)
// shouldn't be necessary eventually and we can safetly delete these few
// lines.
llvm::LLVMRustThinLTORemoveAvailableExternally(llmod);
cgcx.save_temp_bitcode(&module, "thin-lto-after-rm-ae");
timeline.record("no-ae");

Ok(module)
}
}
19 changes: 1 addition & 18 deletions src/librustc_codegen_llvm/builder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
use llvm;
use llvm::{AtomicRmwBinOp, AtomicOrdering, SynchronizationScope, AsmDialect};
use llvm::{Opcode, IntPredicate, RealPredicate, False, OperandBundleDef};
use llvm::{ValueRef, BasicBlockRef, BuilderRef, ModuleRef};
use llvm::{ValueRef, BasicBlockRef, BuilderRef};
use common::*;
use type_::Type;
use value::Value;
Expand Down Expand Up @@ -1157,23 +1157,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
}
}

pub fn trap(&self) {
unsafe {
let bb: BasicBlockRef = llvm::LLVMGetInsertBlock(self.llbuilder);
let fn_: ValueRef = llvm::LLVMGetBasicBlockParent(bb);
let m: ModuleRef = llvm::LLVMGetGlobalParent(fn_);
let p = "llvm.trap\0".as_ptr();
let t: ValueRef = llvm::LLVMGetNamedFunction(m, p as *const _);
assert!((t as isize != 0));
let args: &[ValueRef] = &[];
self.count_insn("trap");
llvm::LLVMRustBuildCall(self.llbuilder, t,
args.as_ptr(), args.len() as c_uint,
ptr::null_mut(),
noname());
}
}

pub fn landing_pad(&self, ty: Type, pers_fn: ValueRef,
num_clauses: usize) -> ValueRef {
self.count_insn("landingpad");
Expand Down
1 change: 0 additions & 1 deletion src/librustc_llvm/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1791,7 +1791,6 @@ extern "C" {
CU1: *mut *mut c_void,
CU2: *mut *mut c_void);
pub fn LLVMRustThinLTOPatchDICompileUnit(M: ModuleRef, CU: *mut c_void);
pub fn LLVMRustThinLTORemoveAvailableExternally(M: ModuleRef);

pub fn LLVMRustLinkerNew(M: ModuleRef) -> LinkerRef;
pub fn LLVMRustLinkerAdd(linker: LinkerRef,
Expand Down
17 changes: 17 additions & 0 deletions src/libsyntax/ext/expand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,13 @@ impl Invocation {
InvocationKind::Derive { ref path, .. } => path.span,
}
}

pub fn attr_id(&self) -> Option<ast::AttrId> {
match self.kind {
InvocationKind::Attr { attr: Some(ref attr), .. } => Some(attr.id),
_ => None,
}
}
}

pub struct MacroExpander<'a, 'b:'a> {
Expand Down Expand Up @@ -331,10 +338,20 @@ impl<'a, 'b> MacroExpander<'a, 'b> {

let scope =
if self.monotonic { invoc.expansion_data.mark } else { orig_expansion_data.mark };
let attr_id_before = invoc.attr_id();
let ext = match self.cx.resolver.resolve_invoc(&mut invoc, scope, force) {
Ok(ext) => Some(ext),
Err(Determinacy::Determined) => None,
Err(Determinacy::Undetermined) => {
// Sometimes attributes which we thought were invocations
// end up being custom attributes for custom derives. If
// that's the case our `invoc` will have changed out from
// under us. If this is the case we're making progress so we
// want to flag it as such, and we test this by looking if
// the `attr_id()` method has been changing over time.
if invoc.attr_id() != attr_id_before {
progress = true;
}
undetermined_invocations.push(invoc);
continue
}
Expand Down
14 changes: 0 additions & 14 deletions src/rustllvm/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1228,15 +1228,6 @@ LLVMRustThinLTOPatchDICompileUnit(LLVMModuleRef Mod, DICompileUnit *Unit) {
MD->addOperand(Unit);
}

extern "C" void
LLVMRustThinLTORemoveAvailableExternally(LLVMModuleRef Mod) {
Module *M = unwrap(Mod);
for (Function &F : M->functions()) {
if (F.hasAvailableExternallyLinkage())
F.deleteBody();
}
}

#else

extern "C" bool
Expand Down Expand Up @@ -1328,9 +1319,4 @@ LLVMRustThinLTOPatchDICompileUnit(LLVMModuleRef Mod) {
report_fatal_error("ThinLTO not available");
}

extern "C" void
LLVMRustThinLTORemoveAvailableExternally(LLVMModuleRef Mod) {
report_fatal_error("ThinLTO not available");
}

#endif // LLVM_VERSION_GE(4, 0)
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, 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::*;

#[proc_macro_derive(A, attributes(b))]
pub fn foo(_x: TokenStream) -> TokenStream {
TokenStream::new()
}
24 changes: 24 additions & 0 deletions src/test/run-pass-fulldeps/proc-macro/derive-two-attrs.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// 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 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// aux-build:derive-two-attrs.rs

#![feature(use_extern_macros)]

extern crate derive_two_attrs as foo;

use foo::A;

#[derive(A)]
#[b]
#[b]
struct B;

fn main() {}
10 changes: 0 additions & 10 deletions src/test/run-pass/const-block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,13 +39,6 @@ static BLOCK_FN: fn(usize) -> usize = { foo::<usize> };

static BLOCK_ENUM_CONSTRUCTOR: fn(usize) -> Option<usize> = { Some };

// FIXME #13972
// static BLOCK_UNSAFE_SAFE_PTR: &'static isize = unsafe { &*(0xdeadbeef as *const isize) };
// static BLOCK_UNSAFE_SAFE_PTR_2: &'static isize = unsafe {
// const X: *const isize = 0xdeadbeef as *const isize;
// &*X
// };

pub fn main() {
assert_eq!(BLOCK_INTEGRAL, 1);
assert_eq!(BLOCK_EXPLICIT_UNIT, ());
Expand All @@ -58,7 +51,4 @@ pub fn main() {
assert_eq!(BLOCK_FN_INFERRED(300), 300);
assert_eq!(BLOCK_FN(300), 300);
assert_eq!(BLOCK_ENUM_CONSTRUCTOR(200), Some(200));
// FIXME #13972
// assert_eq!(BLOCK_UNSAFE_SAFE_PTR as *const isize as usize, 0xdeadbeef);
// assert_eq!(BLOCK_UNSAFE_SAFE_PTR_2 as *const isize as usize, 0xdeadbeef);
}
1 change: 0 additions & 1 deletion src/test/run-pass/sepcomp-lib-lto.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
// aux-build:sepcomp_lib.rs
// compile-flags: -C lto -g
// no-prefer-dynamic
// ignore-android FIXME #18800

extern crate sepcomp_lib;
use sepcomp_lib::a::one;
Expand Down