1
Fork 0

Deny bare trait objects in in src/librustc_codegen_llvm

This commit is contained in:
ljedrz 2018-07-11 12:49:11 +02:00
parent ae5b629efd
commit ea473502f3
8 changed files with 34 additions and 33 deletions

View file

@ -48,7 +48,7 @@ enum Addition {
}, },
Archive { Archive {
archive: ArchiveRO, archive: ArchiveRO,
skip: Box<FnMut(&str) -> bool>, skip: Box<dyn FnMut(&str) -> bool>,
}, },
} }

View file

@ -251,7 +251,7 @@ fn filename_for_metadata(sess: &Session, crate_name: &str, outputs: &OutputFilen
pub(crate) fn each_linked_rlib(sess: &Session, pub(crate) fn each_linked_rlib(sess: &Session,
info: &CrateInfo, info: &CrateInfo,
f: &mut FnMut(CrateNum, &Path)) -> Result<(), String> { f: &mut dyn FnMut(CrateNum, &Path)) -> Result<(), String> {
let crates = info.used_crates_static.iter(); let crates = info.used_crates_static.iter();
let fmts = sess.dependency_formats.borrow(); let fmts = sess.dependency_formats.borrow();
let fmts = fmts.get(&config::CrateTypeExecutable) let fmts = fmts.get(&config::CrateTypeExecutable)
@ -984,7 +984,7 @@ fn exec_linker(sess: &Session, cmd: &mut Command, out_filename: &Path, tmpdir: &
} }
} }
fn link_args(cmd: &mut Linker, fn link_args(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
crate_type: config::CrateType, crate_type: config::CrateType,
tmpdir: &Path, tmpdir: &Path,
@ -1195,7 +1195,7 @@ fn link_args(cmd: &mut Linker,
// Also note that the native libraries linked here are only the ones located // Also note that the native libraries linked here are only the ones located
// in the current crate. Upstream crates with native library dependencies // in the current crate. Upstream crates with native library dependencies
// may have their native library pulled in above. // may have their native library pulled in above.
fn add_local_native_libraries(cmd: &mut Linker, fn add_local_native_libraries(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
codegen_results: &CodegenResults) { codegen_results: &CodegenResults) {
sess.target_filesearch(PathKind::All).for_each_lib_search_path(|path, k| { sess.target_filesearch(PathKind::All).for_each_lib_search_path(|path, k| {
@ -1226,7 +1226,7 @@ fn add_local_native_libraries(cmd: &mut Linker,
// Rust crates are not considered at all when creating an rlib output. All // Rust crates are not considered at all when creating an rlib output. All
// dependencies will be linked when producing the final output (instead of // dependencies will be linked when producing the final output (instead of
// the intermediate rlib version) // the intermediate rlib version)
fn add_upstream_rust_crates(cmd: &mut Linker, fn add_upstream_rust_crates(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
crate_type: config::CrateType, crate_type: config::CrateType,
@ -1350,7 +1350,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
// it's packed in a .rlib, it contains stuff that are not objects that will // it's packed in a .rlib, it contains stuff that are not objects that will
// make the linker error. So we must remove those bits from the .rlib before // make the linker error. So we must remove those bits from the .rlib before
// linking it. // linking it.
fn link_sanitizer_runtime(cmd: &mut Linker, fn link_sanitizer_runtime(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
tmpdir: &Path, tmpdir: &Path,
@ -1419,7 +1419,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
// (aka we're making an executable), we can just pass the rlib blindly to // (aka we're making an executable), we can just pass the rlib blindly to
// the linker (fast) because it's fine if it's not actually included as // the linker (fast) because it's fine if it's not actually included as
// we're at the end of the dependency chain. // we're at the end of the dependency chain.
fn add_static_crate(cmd: &mut Linker, fn add_static_crate(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
tmpdir: &Path, tmpdir: &Path,
@ -1524,7 +1524,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
} }
// Same thing as above, but for dynamic crates instead of static crates. // Same thing as above, but for dynamic crates instead of static crates.
fn add_dynamic_crate(cmd: &mut Linker, sess: &Session, cratepath: &Path) { fn add_dynamic_crate(cmd: &mut dyn Linker, sess: &Session, cratepath: &Path) {
// If we're performing LTO, then it should have been previously required // If we're performing LTO, then it should have been previously required
// that all upstream rust dependencies were available in an rlib format. // that all upstream rust dependencies were available in an rlib format.
assert!(!is_full_lto_enabled(sess)); assert!(!is_full_lto_enabled(sess));
@ -1559,7 +1559,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker,
// generic function calls a native function, then the generic function must // generic function calls a native function, then the generic function must
// be instantiated in the target crate, meaning that the native symbol must // be instantiated in the target crate, meaning that the native symbol must
// also be resolved in the target crate. // also be resolved in the target crate.
fn add_upstream_native_libraries(cmd: &mut Linker, fn add_upstream_native_libraries(cmd: &mut dyn Linker,
sess: &Session, sess: &Session,
codegen_results: &CodegenResults, codegen_results: &CodegenResults,
crate_type: config::CrateType) { crate_type: config::CrateType) {

View file

@ -44,7 +44,7 @@ impl LinkerInfo {
pub fn to_linker<'a>(&'a self, pub fn to_linker<'a>(&'a self,
cmd: Command, cmd: Command,
sess: &'a Session) -> Box<Linker+'a> { sess: &'a Session) -> Box<dyn Linker+'a> {
match sess.linker_flavor() { match sess.linker_flavor() {
LinkerFlavor::Lld(LldFlavor::Link) | LinkerFlavor::Lld(LldFlavor::Link) |
LinkerFlavor::Msvc => { LinkerFlavor::Msvc => {
@ -52,14 +52,14 @@ impl LinkerInfo {
cmd, cmd,
sess, sess,
info: self info: self
}) as Box<Linker> }) as Box<dyn Linker>
} }
LinkerFlavor::Em => { LinkerFlavor::Em => {
Box::new(EmLinker { Box::new(EmLinker {
cmd, cmd,
sess, sess,
info: self info: self
}) as Box<Linker> }) as Box<dyn Linker>
} }
LinkerFlavor::Gcc => { LinkerFlavor::Gcc => {
Box::new(GccLinker { Box::new(GccLinker {
@ -68,7 +68,7 @@ impl LinkerInfo {
info: self, info: self,
hinted_static: false, hinted_static: false,
is_ld: false, is_ld: false,
}) as Box<Linker> }) as Box<dyn Linker>
} }
LinkerFlavor::Lld(LldFlavor::Ld) | LinkerFlavor::Lld(LldFlavor::Ld) |
@ -80,14 +80,14 @@ impl LinkerInfo {
info: self, info: self,
hinted_static: false, hinted_static: false,
is_ld: true, is_ld: true,
}) as Box<Linker> }) as Box<dyn Linker>
} }
LinkerFlavor::Lld(LldFlavor::Wasm) => { LinkerFlavor::Lld(LldFlavor::Wasm) => {
Box::new(WasmLd { Box::new(WasmLd {
cmd, cmd,
sess, sess,
}) as Box<Linker> }) as Box<dyn Linker>
} }
} }
} }

View file

@ -22,7 +22,7 @@ pub struct RPathConfig<'a> {
pub is_like_osx: bool, pub is_like_osx: bool,
pub has_rpath: bool, pub has_rpath: bool,
pub linker_is_gnu: bool, pub linker_is_gnu: bool,
pub get_install_prefix_lib_path: &'a mut FnMut() -> PathBuf, pub get_install_prefix_lib_path: &'a mut dyn FnMut() -> PathBuf,
} }
pub fn get_rpath_flags(config: &mut RPathConfig) -> Vec<String> { pub fn get_rpath_flags(config: &mut RPathConfig) -> Vec<String> {

View file

@ -140,7 +140,7 @@ pub fn create_target_machine(sess: &Session, find_features: bool) -> TargetMachi
// that `is_pie_binary` is false. When we discover LLVM target features // that `is_pie_binary` is false. When we discover LLVM target features
// `sess.crate_types` is uninitialized so we cannot access it. // `sess.crate_types` is uninitialized so we cannot access it.
pub fn target_machine_factory(sess: &Session, find_features: bool) pub fn target_machine_factory(sess: &Session, find_features: bool)
-> Arc<Fn() -> Result<TargetMachineRef, String> + Send + Sync> -> Arc<dyn Fn() -> Result<TargetMachineRef, String> + Send + Sync>
{ {
let reloc_model = get_reloc_model(sess); let reloc_model = get_reloc_model(sess);
@ -343,7 +343,7 @@ pub struct CodegenContext {
regular_module_config: Arc<ModuleConfig>, regular_module_config: Arc<ModuleConfig>,
metadata_module_config: Arc<ModuleConfig>, metadata_module_config: Arc<ModuleConfig>,
allocator_module_config: Arc<ModuleConfig>, allocator_module_config: Arc<ModuleConfig>,
pub tm_factory: Arc<Fn() -> Result<TargetMachineRef, String> + Send + Sync>, pub tm_factory: Arc<dyn Fn() -> Result<TargetMachineRef, String> + Send + Sync>,
pub msvc_imps_needed: bool, pub msvc_imps_needed: bool,
pub target_pointer_width: String, pub target_pointer_width: String,
debuginfo: config::DebugInfoLevel, debuginfo: config::DebugInfoLevel,
@ -362,7 +362,7 @@ pub struct CodegenContext {
// compiling incrementally // compiling incrementally
pub incr_comp_session_dir: Option<PathBuf>, pub incr_comp_session_dir: Option<PathBuf>,
// Channel back to the main control thread to send messages to // Channel back to the main control thread to send messages to
coordinator_send: Sender<Box<Any + Send>>, coordinator_send: Sender<Box<dyn Any + Send>>,
// A reference to the TimeGraph so we can register timings. None means that // A reference to the TimeGraph so we can register timings. None means that
// measuring is disabled. // measuring is disabled.
time_graph: Option<TimeGraph>, time_graph: Option<TimeGraph>,
@ -884,7 +884,7 @@ pub fn start_async_codegen(tcx: TyCtxt,
time_graph: Option<TimeGraph>, time_graph: Option<TimeGraph>,
link: LinkMeta, link: LinkMeta,
metadata: EncodedMetadata, metadata: EncodedMetadata,
coordinator_receive: Receiver<Box<Any + Send>>, coordinator_receive: Receiver<Box<dyn Any + Send>>,
total_cgus: usize) total_cgus: usize)
-> OngoingCodegen { -> OngoingCodegen {
let sess = tcx.sess; let sess = tcx.sess;
@ -1412,7 +1412,7 @@ fn start_executing_work(tcx: TyCtxt,
crate_info: &CrateInfo, crate_info: &CrateInfo,
shared_emitter: SharedEmitter, shared_emitter: SharedEmitter,
codegen_worker_send: Sender<Message>, codegen_worker_send: Sender<Message>,
coordinator_receive: Receiver<Box<Any + Send>>, coordinator_receive: Receiver<Box<dyn Any + Send>>,
total_cgus: usize, total_cgus: usize,
jobserver: Client, jobserver: Client,
time_graph: Option<TimeGraph>, time_graph: Option<TimeGraph>,
@ -1976,7 +1976,7 @@ fn spawn_work(cgcx: CodegenContext, work: WorkItem) {
// Set up a destructor which will fire off a message that we're done as // Set up a destructor which will fire off a message that we're done as
// we exit. // we exit.
struct Bomb { struct Bomb {
coordinator_send: Sender<Box<Any + Send>>, coordinator_send: Sender<Box<dyn Any + Send>>,
result: Option<WorkItemResult>, result: Option<WorkItemResult>,
worker_id: usize, worker_id: usize,
} }
@ -2056,7 +2056,7 @@ pub unsafe fn with_llvm_pmb(llmod: ModuleRef,
config: &ModuleConfig, config: &ModuleConfig,
opt_level: llvm::CodeGenOptLevel, opt_level: llvm::CodeGenOptLevel,
prepare_for_thin_lto: bool, prepare_for_thin_lto: bool,
f: &mut FnMut(llvm::PassManagerBuilderRef)) { f: &mut dyn FnMut(llvm::PassManagerBuilderRef)) {
use std::ptr; use std::ptr;
// Create the PassManagerBuilder for LLVM. We configure it with // Create the PassManagerBuilder for LLVM. We configure it with
@ -2243,7 +2243,7 @@ pub struct OngoingCodegen {
linker_info: LinkerInfo, linker_info: LinkerInfo,
crate_info: CrateInfo, crate_info: CrateInfo,
time_graph: Option<TimeGraph>, time_graph: Option<TimeGraph>,
coordinator_send: Sender<Box<Any + Send>>, coordinator_send: Sender<Box<dyn Any + Send>>,
codegen_worker_receive: Receiver<Message>, codegen_worker_receive: Receiver<Message>,
shared_emitter_main: SharedEmitterMain, shared_emitter_main: SharedEmitterMain,
future: thread::JoinHandle<Result<CompiledModules, ()>>, future: thread::JoinHandle<Result<CompiledModules, ()>>,

View file

@ -717,7 +717,7 @@ pub fn iter_globals(llmod: llvm::ModuleRef) -> ValueIter {
} }
pub fn codegen_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, pub fn codegen_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
rx: mpsc::Receiver<Box<Any + Send>>) rx: mpsc::Receiver<Box<dyn Any + Send>>)
-> OngoingCodegen { -> OngoingCodegen {
check_for_rustc_errors_attr(tcx); check_for_rustc_errors_attr(tcx);

View file

@ -916,7 +916,7 @@ fn gen_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
name: &str, name: &str,
inputs: Vec<Ty<'tcx>>, inputs: Vec<Ty<'tcx>>,
output: Ty<'tcx>, output: Ty<'tcx>,
codegen: &mut for<'b> FnMut(Builder<'b, 'tcx>)) codegen: &mut dyn for<'b> FnMut(Builder<'b, 'tcx>))
-> ValueRef { -> ValueRef {
let rust_fn_ty = cx.tcx.mk_fn_ptr(ty::Binder::bind(cx.tcx.mk_fn_sig( let rust_fn_ty = cx.tcx.mk_fn_ptr(ty::Binder::bind(cx.tcx.mk_fn_sig(
inputs.into_iter(), inputs.into_iter(),
@ -936,7 +936,7 @@ fn gen_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
// //
// This function is only generated once and is then cached. // This function is only generated once and is then cached.
fn get_rust_try_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, fn get_rust_try_fn<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
codegen: &mut for<'b> FnMut(Builder<'b, 'tcx>)) codegen: &mut dyn for<'b> FnMut(Builder<'b, 'tcx>))
-> ValueRef { -> ValueRef {
if let Some(llfn) = cx.rust_try_fn.get() { if let Some(llfn) = cx.rust_try_fn.get() {
return llfn; return llfn;

View file

@ -23,6 +23,7 @@
#![feature(custom_attribute)] #![feature(custom_attribute)]
#![feature(fs_read_write)] #![feature(fs_read_write)]
#![allow(unused_attributes)] #![allow(unused_attributes)]
#![deny(bare_trait_objects)]
#![feature(libc)] #![feature(libc)]
#![feature(quote)] #![feature(quote)]
#![feature(range_contains)] #![feature(range_contains)]
@ -125,7 +126,7 @@ impl !Send for LlvmCodegenBackend {} // Llvm is on a per-thread basis
impl !Sync for LlvmCodegenBackend {} impl !Sync for LlvmCodegenBackend {}
impl LlvmCodegenBackend { impl LlvmCodegenBackend {
pub fn new() -> Box<CodegenBackend> { pub fn new() -> Box<dyn CodegenBackend> {
box LlvmCodegenBackend(()) box LlvmCodegenBackend(())
} }
} }
@ -178,7 +179,7 @@ impl CodegenBackend for LlvmCodegenBackend {
target_features(sess) target_features(sess)
} }
fn metadata_loader(&self) -> Box<MetadataLoader + Sync> { fn metadata_loader(&self) -> Box<dyn MetadataLoader + Sync> {
box metadata::LlvmMetadataLoader box metadata::LlvmMetadataLoader
} }
@ -198,14 +199,14 @@ impl CodegenBackend for LlvmCodegenBackend {
fn codegen_crate<'a, 'tcx>( fn codegen_crate<'a, 'tcx>(
&self, &self,
tcx: TyCtxt<'a, 'tcx, 'tcx>, tcx: TyCtxt<'a, 'tcx, 'tcx>,
rx: mpsc::Receiver<Box<Any + Send>> rx: mpsc::Receiver<Box<dyn Any + Send>>
) -> Box<Any> { ) -> Box<dyn Any> {
box base::codegen_crate(tcx, rx) box base::codegen_crate(tcx, rx)
} }
fn join_codegen_and_link( fn join_codegen_and_link(
&self, &self,
ongoing_codegen: Box<Any>, ongoing_codegen: Box<dyn Any>,
sess: &Session, sess: &Session,
dep_graph: &DepGraph, dep_graph: &DepGraph,
outputs: &OutputFilenames, outputs: &OutputFilenames,
@ -247,7 +248,7 @@ impl CodegenBackend for LlvmCodegenBackend {
/// This is the entrypoint for a hot plugged rustc_codegen_llvm /// This is the entrypoint for a hot plugged rustc_codegen_llvm
#[no_mangle] #[no_mangle]
pub fn __rustc_codegen_backend() -> Box<CodegenBackend> { pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
LlvmCodegenBackend::new() LlvmCodegenBackend::new()
} }