1 #![doc(html_root_url = "https://doc.rust-lang.org/nightly/")]
3 #![feature(bool_to_option)]
4 #![feature(box_patterns)]
5 #![feature(box_syntax)]
6 #![feature(core_intrinsics)]
8 #![feature(slice_patterns)]
9 #![feature(stmt_expr_attributes)]
10 #![feature(try_blocks)]
11 #![feature(in_band_lifetimes)]
13 #![feature(trusted_len)]
14 #![feature(associated_type_bounds)]
16 #![recursion_limit="256"]
18 //! This crate contains codegen code that is used by all codegen backends (LLVM and others).
19 //! The backend-agnostic functions of this crate use functions defined in various traits that
20 //! have to be implemented by each backends.
22 #[macro_use] extern crate log;
23 #[macro_use] extern crate rustc;
24 #[macro_use] extern crate syntax;
26 use std
::path
::{Path, PathBuf}
;
27 use rustc
::dep_graph
::WorkProduct
;
28 use rustc
::session
::config
::{OutputFilenames, OutputType, RUST_CGU_EXT}
;
29 use rustc
::middle
::lang_items
::LangItem
;
30 use rustc
::hir
::def_id
::CrateNum
;
31 use rustc
::ty
::query
::Providers
;
32 use rustc_data_structures
::fx
::{FxHashMap, FxHashSet}
;
33 use rustc_data_structures
::sync
::Lrc
;
34 use rustc_data_structures
::svh
::Svh
;
35 use rustc
::middle
::cstore
::{LibSource, CrateSource, NativeLibrary}
;
36 use rustc
::middle
::dependency_format
::Dependencies
;
37 use syntax_pos
::symbol
::Symbol
;
49 pub struct ModuleCodegen
<M
> {
50 /// The name of the module. When the crate may be saved between
51 /// compilations, incremental compilation requires that name be
52 /// unique amongst **all** crates. Therefore, it should contain
53 /// something unique to this crate (e.g., a module path) as well
54 /// as the crate name and disambiguator.
55 /// We currently generate these names via CodegenUnit::build_cgu_name().
61 // FIXME(eddyb) maybe include the crate name in this?
62 pub const METADATA_FILENAME
: &str = "lib.rmeta";
63 pub const RLIB_BYTECODE_EXTENSION
: &str = "bc.z";
66 impl<M
> ModuleCodegen
<M
> {
67 pub fn into_compiled_module(self,
70 emit_bc_compressed
: bool
,
71 outputs
: &OutputFilenames
) -> CompiledModule
{
73 .then(|| outputs
.temp_path(OutputType
::Object
, Some(&self.name
)));
74 let bytecode
= emit_bc
75 .then(|| outputs
.temp_path(OutputType
::Bitcode
, Some(&self.name
)));
76 let bytecode_compressed
= emit_bc_compressed
.then(|| {
77 outputs
.temp_path(OutputType
::Bitcode
, Some(&self.name
))
78 .with_extension(RLIB_BYTECODE_EXTENSION
)
82 name
: self.name
.clone(),
92 pub struct CompiledModule
{
95 pub object
: Option
<PathBuf
>,
96 pub bytecode
: Option
<PathBuf
>,
97 pub bytecode_compressed
: Option
<PathBuf
>,
100 pub struct CachedModuleCodegen
{
102 pub source
: WorkProduct
,
105 #[derive(Copy, Clone, Debug, PartialEq)]
106 pub enum ModuleKind
{
112 bitflags
::bitflags
! {
113 pub struct MemFlags
: u8 {
114 const VOLATILE
= 1 << 0;
115 const NONTEMPORAL
= 1 << 1;
116 const UNALIGNED
= 1 << 2;
120 /// Misc info we load from metadata to persist beyond the tcx.
122 pub struct CrateInfo
{
123 pub panic_runtime
: Option
<CrateNum
>,
124 pub compiler_builtins
: Option
<CrateNum
>,
125 pub profiler_runtime
: Option
<CrateNum
>,
126 pub sanitizer_runtime
: Option
<CrateNum
>,
127 pub is_no_builtins
: FxHashSet
<CrateNum
>,
128 pub native_libraries
: FxHashMap
<CrateNum
, Lrc
<Vec
<NativeLibrary
>>>,
129 pub crate_name
: FxHashMap
<CrateNum
, String
>,
130 pub used_libraries
: Lrc
<Vec
<NativeLibrary
>>,
131 pub link_args
: Lrc
<Vec
<String
>>,
132 pub used_crate_source
: FxHashMap
<CrateNum
, Lrc
<CrateSource
>>,
133 pub used_crates_static
: Vec
<(CrateNum
, LibSource
)>,
134 pub used_crates_dynamic
: Vec
<(CrateNum
, LibSource
)>,
135 pub lang_item_to_crate
: FxHashMap
<LangItem
, CrateNum
>,
136 pub missing_lang_items
: FxHashMap
<CrateNum
, Vec
<LangItem
>>,
137 pub dependency_formats
: Lrc
<Dependencies
>,
141 pub struct CodegenResults
{
142 pub crate_name
: Symbol
,
143 pub modules
: Vec
<CompiledModule
>,
144 pub allocator_module
: Option
<CompiledModule
>,
145 pub metadata_module
: Option
<CompiledModule
>,
147 pub metadata
: rustc
::middle
::cstore
::EncodedMetadata
,
148 pub windows_subsystem
: Option
<String
>,
149 pub linker_info
: back
::linker
::LinkerInfo
,
150 pub crate_info
: CrateInfo
,
153 pub fn provide(providers
: &mut Providers
<'_
>) {
154 crate::back
::symbol_export
::provide(providers
);
155 crate::base
::provide_both(providers
);
158 pub fn provide_extern(providers
: &mut Providers
<'_
>) {
159 crate::back
::symbol_export
::provide_extern(providers
);
160 crate::base
::provide_both(providers
);
163 /// Checks if the given filename ends with the `.rcgu.o` extension that `rustc`
164 /// uses for the object files it generates.
165 pub fn looks_like_rust_object_file(filename
: &str) -> bool
{
166 let path
= Path
::new(filename
);
167 let ext
= path
.extension().and_then(|s
| s
.to_str());
168 if ext
!= Some(OutputType
::Object
.extension()) {
169 // The file name does not end with ".o", so it can't be an object file.
173 // Strip the ".o" at the end
174 let ext2
= path
.file_stem()
175 .and_then(|s
| Path
::new(s
).extension())
176 .and_then(|s
| s
.to_str());
178 // Check if the "inner" extension
179 ext2
== Some(RUST_CGU_EXT
)