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_data_structures::fx::FxHashMap;
|
||||||
use rustc_codegen_utils::symbol_export;
|
use rustc_codegen_utils::symbol_export;
|
||||||
use time_graph::Timeline;
|
use time_graph::Timeline;
|
||||||
use {ModuleCodegen, ModuleLlvm, ModuleKind};
|
use ModuleLlvm;
|
||||||
|
use rustc_codegen_utils::{ModuleCodegen, ModuleKind};
|
||||||
|
|
||||||
use libc;
|
use libc;
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,8 @@ use rustc::util::nodemap::FxHashMap;
|
||||||
use time_graph::{self, TimeGraph, Timeline};
|
use time_graph::{self, TimeGraph, Timeline};
|
||||||
use llvm::{self, DiagnosticInfo, PassManager, SMDiagnostic};
|
use llvm::{self, DiagnosticInfo, PassManager, SMDiagnostic};
|
||||||
use llvm_util;
|
use llvm_util;
|
||||||
use {CodegenResults, ModuleCodegen, CompiledModule, ModuleKind, ModuleLlvm,
|
use {CodegenResults, ModuleLlvm};
|
||||||
CachedModuleCodegen};
|
use rustc_codegen_utils::{ModuleCodegen, ModuleKind, CachedModuleCodegen, CompiledModule};
|
||||||
use CrateInfo;
|
use CrateInfo;
|
||||||
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||||
use rustc::ty::TyCtxt;
|
use rustc::ty::TyCtxt;
|
||||||
|
|
|
@ -24,9 +24,7 @@
|
||||||
//! int) and rec(x=int, y=int, z=int) will have the same llvm::Type.
|
//! int) and rec(x=int, y=int, z=int) will have the same llvm::Type.
|
||||||
|
|
||||||
use super::ModuleLlvm;
|
use super::ModuleLlvm;
|
||||||
use super::ModuleCodegen;
|
use rustc_codegen_utils::{ModuleCodegen, ModuleKind, CachedModuleCodegen};
|
||||||
use super::ModuleKind;
|
|
||||||
use super::CachedModuleCodegen;
|
|
||||||
use super::LlvmCodegenBackend;
|
use super::LlvmCodegenBackend;
|
||||||
|
|
||||||
use abi;
|
use abi;
|
||||||
|
@ -1197,25 +1195,3 @@ pub fn visibility_to_llvm(linkage: Visibility) -> llvm::Visibility {
|
||||||
Visibility::Protected => llvm::Visibility::Protected,
|
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
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use super::HasCodegen;
|
use super::HasCodegen;
|
||||||
use mir::place::PlaceRef;
|
use mir::place::PlaceRef;
|
||||||
use rustc::hir::{GlobalAsm, InlineAsm};
|
use rustc::hir::{GlobalAsm, InlineAsm};
|
||||||
|
|
|
@ -213,7 +213,8 @@ pub trait BuilderMethods<'a, 'tcx: 'a>:
|
||||||
fn set_cleanup(&self, landing_pad: Self::Value);
|
fn set_cleanup(&self, landing_pad: Self::Value);
|
||||||
fn resume(&self, exn: Self::Value) -> 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_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_pad(&self, parent: Self::Value, args: &[Self::Value]) -> Self::Funclet;
|
||||||
fn catch_ret(&self, funclet: &Self::Funclet, unwind: Self::BasicBlock) -> Self::Value;
|
fn catch_ret(&self, funclet: &Self::Funclet, unwind: Self::BasicBlock) -> Self::Value;
|
||||||
fn catch_switch(
|
fn catch_switch(
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use super::HasCodegen;
|
use super::HasCodegen;
|
||||||
use debuginfo::{FunctionDebugContext, MirDebugScope, VariableAccess, VariableKind};
|
use debuginfo::{FunctionDebugContext, MirDebugScope, VariableAccess, VariableKind};
|
||||||
use monomorphize::Instance;
|
use monomorphize::Instance;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use monomorphize::Instance;
|
use monomorphize::Instance;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
use rustc::mir::mono::{Linkage, Visibility};
|
use rustc::mir::mono::{Linkage, Visibility};
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use super::HasCodegen;
|
use super::HasCodegen;
|
||||||
use abi::FnType;
|
use abi::FnType;
|
||||||
use mir::operand::OperandRef;
|
use mir::operand::OperandRef;
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use libc::c_uint;
|
use libc::c_uint;
|
||||||
use monomorphize::partitioning::CodegenUnit;
|
use monomorphize::partitioning::CodegenUnit;
|
||||||
use rustc::mir::mono::Stats;
|
use rustc::mir::mono::Stats;
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
|
|
||||||
mod abi;
|
mod abi;
|
||||||
mod asm;
|
mod asm;
|
||||||
mod backend;
|
|
||||||
mod builder;
|
mod builder;
|
||||||
mod consts;
|
mod consts;
|
||||||
mod debuginfo;
|
mod debuginfo;
|
||||||
|
@ -22,7 +21,6 @@ mod type_;
|
||||||
|
|
||||||
pub use self::abi::{AbiBuilderMethods, AbiMethods};
|
pub use self::abi::{AbiBuilderMethods, AbiMethods};
|
||||||
pub use self::asm::{AsmBuilderMethods, AsmMethods};
|
pub use self::asm::{AsmBuilderMethods, AsmMethods};
|
||||||
pub use self::backend::{Backend, BackendMethods, BackendTypes};
|
|
||||||
pub use self::builder::BuilderMethods;
|
pub use self::builder::BuilderMethods;
|
||||||
pub use self::consts::ConstMethods;
|
pub use self::consts::ConstMethods;
|
||||||
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
|
pub use self::debuginfo::{DebugInfoBuilderMethods, DebugInfoMethods};
|
||||||
|
@ -33,8 +31,7 @@ pub use self::statics::StaticMethods;
|
||||||
pub use self::type_::{
|
pub use self::type_::{
|
||||||
ArgTypeMethods, BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods, TypeMethods,
|
ArgTypeMethods, BaseTypeMethods, DerivedTypeMethods, LayoutTypeMethods, TypeMethods,
|
||||||
};
|
};
|
||||||
|
pub use rustc_codegen_utils::interfaces::{Backend, BackendMethods, BackendTypes, CodegenObject};
|
||||||
use std::fmt;
|
|
||||||
|
|
||||||
pub trait CodegenMethods<'tcx>:
|
pub trait CodegenMethods<'tcx>:
|
||||||
Backend<'tcx>
|
Backend<'tcx>
|
||||||
|
@ -76,6 +73,3 @@ pub trait HasCodegen<'tcx>: Backend<'tcx> {
|
||||||
DIScope = Self::DIScope,
|
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
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
use rustc::ty::layout::Align;
|
use rustc::ty::layout::Align;
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
use super::backend::Backend;
|
use super::Backend;
|
||||||
use super::HasCodegen;
|
use super::HasCodegen;
|
||||||
use mir::place::PlaceRef;
|
use mir::place::PlaceRef;
|
||||||
use rustc::ty::layout::TyLayout;
|
use rustc::ty::layout::TyLayout;
|
||||||
|
|
|
@ -37,7 +37,6 @@
|
||||||
#![feature(static_nobundle)]
|
#![feature(static_nobundle)]
|
||||||
|
|
||||||
use back::write::create_target_machine;
|
use back::write::create_target_machine;
|
||||||
use rustc::dep_graph::WorkProduct;
|
|
||||||
use syntax_pos::symbol::Symbol;
|
use syntax_pos::symbol::Symbol;
|
||||||
|
|
||||||
#[macro_use] extern crate bitflags;
|
#[macro_use] extern crate bitflags;
|
||||||
|
@ -67,7 +66,6 @@ extern crate cc; // Used to locate MSVC
|
||||||
extern crate tempfile;
|
extern crate tempfile;
|
||||||
extern crate memmap;
|
extern crate memmap;
|
||||||
|
|
||||||
use back::bytecode::RLIB_BYTECODE_EXTENSION;
|
|
||||||
use interfaces::*;
|
use interfaces::*;
|
||||||
use time_graph::TimeGraph;
|
use time_graph::TimeGraph;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
|
@ -93,7 +91,7 @@ use rustc::util::time_graph;
|
||||||
use rustc::util::nodemap::{FxHashSet, FxHashMap};
|
use rustc::util::nodemap::{FxHashSet, FxHashMap};
|
||||||
use rustc::util::profiling::ProfileCategory;
|
use rustc::util::profiling::ProfileCategory;
|
||||||
use rustc_mir::monomorphize;
|
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_codegen_utils::codegen_backend::CodegenBackend;
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
|
|
||||||
|
@ -329,56 +327,6 @@ pub fn __rustc_codegen_backend() -> Box<dyn CodegenBackend> {
|
||||||
LlvmCodegenBackend::new()
|
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 {
|
pub struct ModuleLlvm {
|
||||||
llcx: &'static mut llvm::Context,
|
llcx: &'static mut llvm::Context,
|
||||||
llmod_raw: *const llvm::Module,
|
llmod_raw: *const llvm::Module,
|
||||||
|
|
|
@ -113,3 +113,25 @@ pub enum TypeKind {
|
||||||
X86_MMX,
|
X86_MMX,
|
||||||
Token,
|
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::mir::mono::Stats;
|
||||||
use rustc::session::Session;
|
use rustc::session::Session;
|
||||||
use rustc::ty::TyCtxt;
|
use rustc::ty::TyCtxt;
|
||||||
|
use rustc::util::time_graph::TimeGraph;
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
use syntax_pos::symbol::InternedString;
|
use syntax_pos::symbol::InternedString;
|
||||||
use time_graph::TimeGraph;
|
|
||||||
use ModuleCodegen;
|
use ModuleCodegen;
|
||||||
|
|
||||||
pub trait BackendTypes {
|
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(custom_attribute)]
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![allow(unused_attributes)]
|
#![allow(unused_attributes)]
|
||||||
|
#![allow(dead_code)]
|
||||||
#![feature(quote)]
|
#![feature(quote)]
|
||||||
#![feature(rustc_diagnostic_macros)]
|
#![feature(rustc_diagnostic_macros)]
|
||||||
|
|
||||||
|
@ -46,8 +47,11 @@ use std::path::PathBuf;
|
||||||
|
|
||||||
use rustc::session::Session;
|
use rustc::session::Session;
|
||||||
use rustc::ty::TyCtxt;
|
use rustc::ty::TyCtxt;
|
||||||
|
use rustc::dep_graph::WorkProduct;
|
||||||
|
use rustc::session::config::{OutputFilenames, OutputType};
|
||||||
|
|
||||||
pub mod command;
|
pub mod command;
|
||||||
|
pub mod interfaces;
|
||||||
pub mod link;
|
pub mod link;
|
||||||
pub mod linker;
|
pub mod linker;
|
||||||
pub mod codegen_backend;
|
pub mod codegen_backend;
|
||||||
|
@ -56,6 +60,74 @@ pub mod symbol_names;
|
||||||
pub mod symbol_names_test;
|
pub mod symbol_names_test;
|
||||||
pub mod common;
|
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
|
/// check for the #[rustc_error] annotation, which forces an
|
||||||
/// error in codegen. This is used to write compile-fail tests
|
/// error in codegen. This is used to write compile-fail tests
|
||||||
/// that actually test that compilation succeeds without
|
/// 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)
|
pub fn find_library(name: &str, search_paths: &[PathBuf], sess: &Session)
|
||||||
-> PathBuf {
|
-> PathBuf {
|
||||||
// On Windows, static libraries sometimes show up as libfoo.a and other
|
// On Windows, static libraries sometimes show up as libfoo.a and other
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue