Moved Backend interface into rustc_codegen_utils
This commit is contained in:
parent
b06836e71a
commit
b02e5cce16
17 changed files with 129 additions and 113 deletions
|
@ -24,7 +24,8 @@ use rustc::util::common::time_ext;
|
|||
use rustc_data_structures::fx::FxHashMap;
|
||||
use rustc_codegen_utils::symbol_export;
|
||||
use time_graph::Timeline;
|
||||
use {ModuleCodegen, ModuleLlvm, ModuleKind};
|
||||
use ModuleLlvm;
|
||||
use rustc_codegen_utils::{ModuleCodegen, ModuleKind};
|
||||
|
||||
use libc;
|
||||
|
||||
|
|
|
@ -26,8 +26,8 @@ use rustc::util::nodemap::FxHashMap;
|
|||
use time_graph::{self, TimeGraph, Timeline};
|
||||
use llvm::{self, DiagnosticInfo, PassManager, SMDiagnostic};
|
||||
use llvm_util;
|
||||
use {CodegenResults, ModuleCodegen, CompiledModule, ModuleKind, ModuleLlvm,
|
||||
CachedModuleCodegen};
|
||||
use {CodegenResults, ModuleLlvm};
|
||||
use rustc_codegen_utils::{ModuleCodegen, ModuleKind, CachedModuleCodegen, CompiledModule};
|
||||
use CrateInfo;
|
||||
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||
use rustc::ty::TyCtxt;
|
||||
|
|
|
@ -24,9 +24,7 @@
|
|||
//! int) and rec(x=int, y=int, z=int) will have the same llvm::Type.
|
||||
|
||||
use super::ModuleLlvm;
|
||||
use super::ModuleCodegen;
|
||||
use super::ModuleKind;
|
||||
use super::CachedModuleCodegen;
|
||||
use rustc_codegen_utils::{ModuleCodegen, ModuleKind, CachedModuleCodegen};
|
||||
use super::LlvmCodegenBackend;
|
||||
|
||||
use abi;
|
||||
|
@ -1197,25 +1195,3 @@ pub fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
|
|||
Visibility::Protected => llvm::Visibility::Protected,
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME(mw): Anything that is produced via DepGraph::with_task() must implement
|
||||
// the HashStable trait. Normally DepGraph::with_task() calls are
|
||||
// hidden behind queries, but CGU creation is a special case in two
|
||||
// ways: (1) it's not a query and (2) CGU are output nodes, so their
|
||||
// Fingerprints are not actually needed. It remains to be clarified
|
||||
// how exactly this case will be handled in the red/green system but
|
||||
// for now we content ourselves with providing a no-op HashStable
|
||||
// implementation for CGUs.
|
||||
mod temp_stable_hash_impls {
|
||||
use rustc_data_structures::stable_hasher::{StableHasherResult, StableHasher,
|
||||
HashStable};
|
||||
use {ModuleCodegen, ModuleLlvm};
|
||||
|
||||
impl<HCX> HashStable<HCX> for ModuleCodegen<ModuleLlvm> {
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
_: &mut HCX,
|
||||
_: &mut StableHasher<W>) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use super::HasCodegen;
|
||||
use mir::place::PlaceRef;
|
||||
use rustc::hir::{GlobalAsm, InlineAsm};
|
||||
|
|
|
@ -213,7 +213,8 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
|
|||
fn set_cleanup(&self, landing_pad: Self::Value);
|
||||
fn resume(&self, exn: Self::Value) -> Self::Value;
|
||||
fn cleanup_pad(&self, parent: Option<Self::Value>, args: &[Self::Value]) -> Self::Funclet;
|
||||
fn cleanup_ret(&self, funclet: &Self::Funclet, unwind: Option<Self::BasicBlock>) -> Self::Value;
|
||||
fn cleanup_ret(&self, funclet: &Self::Funclet, unwind: Option<Self::BasicBlock>)
|
||||
-> Self::Value;
|
||||
fn catch_pad(&self, parent: Self::Value, args: &[Self::Value]) -> Self::Funclet;
|
||||
fn catch_ret(&self, funclet: &Self::Funclet, unwind: Self::BasicBlock) -> Self::Value;
|
||||
fn catch_switch(
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use super::HasCodegen;
|
||||
use debuginfo::{FunctionDebugContext, MirDebugScope, VariableAccess, VariableKind};
|
||||
use monomorphize::Instance;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use monomorphize::Instance;
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::mir::mono::{Linkage, Visibility};
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use super::HasCodegen;
|
||||
use abi::FnType;
|
||||
use mir::operand::OperandRef;
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use libc::c_uint;
|
||||
use monomorphize::partitioning::CodegenUnit;
|
||||
use rustc::mir::mono::Stats;
|
||||
|
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
mod abi;
|
||||
mod asm;
|
||||
mod backend;
|
||||
mod builder;
|
||||
mod consts;
|
||||
mod debuginfo;
|
||||
|
@ -22,7 +21,6 @@ mod type_;
|
|||
|
||||
pub use self::abi::{AbiBuilderMethods, AbiMethods};
|
||||
pub use self::asm::{AsmBuilderMethods, AsmMethods};
|
||||
pub use self::backend::{Backend, BackendMethods, BackendTypes};
|
||||
pub use self::builder::BuilderMethods;
|
||||
pub use self::consts::ConstMethods;
|
||||
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
|
||||
|
@ -33,8 +31,7 @@ pub use self::statics::StaticMethods;
|
|||
pub use self::type_::{
|
||||
ArgTypeMethods, BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods, TypeMethods,
|
||||
};
|
||||
|
||||
use std::fmt;
|
||||
pub use rustc_codegen_utils::interfaces::{Backend, BackendMethods, BackendTypes, CodegenObject};
|
||||
|
||||
pub trait CodegenMethods<'tcx>:
|
||||
Backend<'tcx>
|
||||
|
@ -76,6 +73,3 @@ pub trait HasCodegen<'tcx>: Backend<'tcx> {
|
|||
DIScope = Self::DIScope,
|
||||
>;
|
||||
}
|
||||
|
||||
pub trait CodegenObject: Copy + PartialEq + fmt::Debug {}
|
||||
impl<T: Copy + PartialEq + fmt::Debug> CodegenObject for T {}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use rustc::hir::def_id::DefId;
|
||||
use rustc::ty::layout::Align;
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use super::backend::Backend;
|
||||
use super::Backend;
|
||||
use super::HasCodegen;
|
||||
use mir::place::PlaceRef;
|
||||
use rustc::ty::layout::TyLayout;
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
#![feature(static_nobundle)]
|
||||
|
||||
use back::write::create_target_machine;
|
||||
use rustc::dep_graph::WorkProduct;
|
||||
use syntax_pos::symbol::Symbol;
|
||||
|
||||
#[macro_use] extern crate bitflags;
|
||||
|
@ -67,7 +66,6 @@ extern crate cc; // Used to locate MSVC
|
|||
extern crate tempfile;
|
||||
extern crate memmap;
|
||||
|
||||
use back::bytecode::RLIB_BYTECODE_EXTENSION;
|
||||
use interfaces::*;
|
||||
use time_graph::TimeGraph;
|
||||
use std::sync::mpsc::Receiver;
|
||||
|
@ -93,7 +91,7 @@ use rustc::util::time_graph;
|
|||
use rustc::util::nodemap::{FxHashSet, FxHashMap};
|
||||
use rustc::util::profiling::ProfileCategory;
|
||||
use rustc_mir::monomorphize;
|
||||
use rustc_codegen_utils::{CompiledModule, ModuleKind};
|
||||
use rustc_codegen_utils::{ModuleCodegen, CompiledModule};
|
||||
use rustc_codegen_utils::codegen_backend::CodegenBackend;
|
||||
use rustc_data_structures::svh::Svh;
|
||||
|
||||
|
@ -329,56 +327,6 @@ pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
|
|||
LlvmCodegenBackend::new()
|
||||
}
|
||||
|
||||
pub struct ModuleCodegen<M> {
|
||||
/// The name of the module. When the crate may be saved between
|
||||
/// compilations, incremental compilation requires that name be
|
||||
/// unique amongst **all** crates. Therefore, it should contain
|
||||
/// something unique to this crate (e.g., a module path) as well
|
||||
/// as the crate name and disambiguator.
|
||||
/// We currently generate these names via CodegenUnit::build_cgu_name().
|
||||
name: String,
|
||||
module_llvm: M,
|
||||
kind: ModuleKind,
|
||||
}
|
||||
|
||||
struct CachedModuleCodegen {
|
||||
name: String,
|
||||
source: WorkProduct,
|
||||
}
|
||||
|
||||
impl ModuleCodegen<ModuleLlvm> {
|
||||
fn into_compiled_module(self,
|
||||
emit_obj: bool,
|
||||
emit_bc: bool,
|
||||
emit_bc_compressed: bool,
|
||||
outputs: &OutputFilenames) -> CompiledModule {
|
||||
let object = if emit_obj {
|
||||
Some(outputs.temp_path(OutputType::Object, Some(&self.name)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let bytecode = if emit_bc {
|
||||
Some(outputs.temp_path(OutputType::Bitcode, Some(&self.name)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let bytecode_compressed = if emit_bc_compressed {
|
||||
Some(outputs.temp_path(OutputType::Bitcode, Some(&self.name))
|
||||
.with_extension(RLIB_BYTECODE_EXTENSION))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
CompiledModule {
|
||||
name: self.name.clone(),
|
||||
kind: self.kind,
|
||||
object,
|
||||
bytecode,
|
||||
bytecode_compressed,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct ModuleLlvm {
|
||||
llcx: &'static mut llvm::Context,
|
||||
llmod_raw: *const llvm::Module,
|
||||
|
|
|
@ -113,3 +113,25 @@ pub enum TypeKind {
|
|||
X86_MMX,
|
||||
Token,
|
||||
}
|
||||
|
||||
// FIXME(mw): Anything that is produced via DepGraph::with_task() must implement
|
||||
// the HashStable trait. Normally DepGraph::with_task() calls are
|
||||
// hidden behind queries, but CGU creation is a special case in two
|
||||
// ways: (1) it's not a query and (2) CGU are output nodes, so their
|
||||
// Fingerprints are not actually needed. It remains to be clarified
|
||||
// how exactly this case will be handled in the red/green system but
|
||||
// for now we content ourselves with providing a no-op HashStable
|
||||
// implementation for CGUs.
|
||||
mod temp_stable_hash_impls {
|
||||
use rustc_data_structures::stable_hasher::{StableHasherResult, StableHasher,
|
||||
HashStable};
|
||||
use ModuleCodegen;
|
||||
|
||||
impl<HCX, M> HashStable<HCX> for ModuleCodegen<M> {
|
||||
fn hash_stable<W: StableHasherResult>(&self,
|
||||
_: &mut HCX,
|
||||
_: &mut StableHasher<W>) {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,10 +17,10 @@ use rustc::middle::cstore::EncodedMetadata;
|
|||
use rustc::mir::mono::Stats;
|
||||
use rustc::session::Session;
|
||||
use rustc::ty::TyCtxt;
|
||||
use rustc::util::time_graph::TimeGraph;
|
||||
use std::any::Any;
|
||||
use std::sync::mpsc::Receiver;
|
||||
use syntax_pos::symbol::InternedString;
|
||||
use time_graph::TimeGraph;
|
||||
use ModuleCodegen;
|
||||
|
||||
pub trait BackendTypes {
|
18
src/librustc_codegen_utils/interfaces/mod.rs
Normal file
18
src/librustc_codegen_utils/interfaces/mod.rs
Normal file
|
@ -0,0 +1,18 @@
|
|||
// 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.
|
||||
|
||||
mod backend;
|
||||
|
||||
pub use self::backend::{Backend, BackendMethods, BackendTypes};
|
||||
|
||||
use std::fmt;
|
||||
|
||||
pub trait CodegenObject: Copy + PartialEq + fmt::Debug {}
|
||||
impl<T: Copy + PartialEq + fmt::Debug> CodegenObject for T {}
|
|
@ -21,6 +21,7 @@
|
|||
#![feature(custom_attribute)]
|
||||
#![feature(nll)]
|
||||
#![allow(unused_attributes)]
|
||||
#![allow(dead_code)]
|
||||
#![feature(quote)]
|
||||
#![feature(rustc_diagnostic_macros)]
|
||||
|
||||
|
@ -46,8 +47,11 @@ use std::path::PathBuf;
|
|||
|
||||
use rustc::session::Session;
|
||||
use rustc::ty::TyCtxt;
|
||||
use rustc::dep_graph::WorkProduct;
|
||||
use rustc::session::config::{OutputFilenames, OutputType};
|
||||
|
||||
pub mod command;
|
||||
pub mod interfaces;
|
||||
pub mod link;
|
||||
pub mod linker;
|
||||
pub mod codegen_backend;
|
||||
|
@ -56,6 +60,74 @@ pub mod symbol_names;
|
|||
pub mod symbol_names_test;
|
||||
pub mod common;
|
||||
|
||||
pub struct ModuleCodegen<M> {
|
||||
/// The name of the module. When the crate may be saved between
|
||||
/// compilations, incremental compilation requires that name be
|
||||
/// unique amongst **all** crates. Therefore, it should contain
|
||||
/// something unique to this crate (e.g., a module path) as well
|
||||
/// as the crate name and disambiguator.
|
||||
/// We currently generate these names via CodegenUnit::build_cgu_name().
|
||||
pub name: String,
|
||||
pub module_llvm: M,
|
||||
pub kind: ModuleKind,
|
||||
}
|
||||
|
||||
pub const RLIB_BYTECODE_EXTENSION: &str = "bc.z";
|
||||
|
||||
impl<M> ModuleCodegen<M> {
|
||||
pub fn into_compiled_module(self,
|
||||
emit_obj: bool,
|
||||
emit_bc: bool,
|
||||
emit_bc_compressed: bool,
|
||||
outputs: &OutputFilenames) -> CompiledModule {
|
||||
let object = if emit_obj {
|
||||
Some(outputs.temp_path(OutputType::Object, Some(&self.name)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let bytecode = if emit_bc {
|
||||
Some(outputs.temp_path(OutputType::Bitcode, Some(&self.name)))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
let bytecode_compressed = if emit_bc_compressed {
|
||||
Some(outputs.temp_path(OutputType::Bitcode, Some(&self.name))
|
||||
.with_extension(RLIB_BYTECODE_EXTENSION))
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
CompiledModule {
|
||||
name: self.name.clone(),
|
||||
kind: self.kind,
|
||||
object,
|
||||
bytecode,
|
||||
bytecode_compressed,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct CompiledModule {
|
||||
pub name: String,
|
||||
pub kind: ModuleKind,
|
||||
pub object: Option<PathBuf>,
|
||||
pub bytecode: Option<PathBuf>,
|
||||
pub bytecode_compressed: Option<PathBuf>,
|
||||
}
|
||||
|
||||
pub struct CachedModuleCodegen {
|
||||
pub name: String,
|
||||
pub source: WorkProduct,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
pub enum ModuleKind {
|
||||
Regular,
|
||||
Metadata,
|
||||
Allocator,
|
||||
}
|
||||
|
||||
/// check for the #[rustc_error] annotation, which forces an
|
||||
/// error in codegen. This is used to write compile-fail tests
|
||||
/// that actually test that compilation succeeds without
|
||||
|
@ -70,22 +142,6 @@ pub fn check_for_rustc_errors_attr(tcx: TyCtxt) {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug, PartialEq)]
|
||||
pub enum ModuleKind {
|
||||
Regular,
|
||||
Metadata,
|
||||
Allocator,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct CompiledModule {
|
||||
pub name: String,
|
||||
pub kind: ModuleKind,
|
||||
pub object: Option<PathBuf>,
|
||||
pub bytecode: Option<PathBuf>,
|
||||
pub bytecode_compressed: Option<PathBuf>,
|
||||
}
|
||||
|
||||
pub fn find_library(name: &str, search_paths: &[PathBuf], sess: &Session)
|
||||
-> PathBuf {
|
||||
// On Windows, static libraries sometimes show up as libfoo.a and other
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue