1 #![feature(rustc_private)]
4 extern crate rustc_codegen_utils
;
6 extern crate rustc_data_structures
;
7 extern crate rustc_hir
;
8 extern crate rustc_target
;
9 extern crate rustc_driver
;
10 extern crate rustc_span
;
15 use rustc_span
::symbol
::Symbol
;
16 use rustc
::session
::Session
;
17 use rustc
::session
::config
::OutputFilenames
;
18 use rustc
::ty
::TyCtxt
;
19 use rustc
::ty
::query
::Providers
;
20 use rustc
::middle
::cstore
::{EncodedMetadata, MetadataLoader, MetadataLoaderDyn}
;
21 use rustc
::dep_graph
::DepGraph
;
22 use rustc
::util
::common
::ErrorReported
;
23 use rustc_codegen_utils
::codegen_backend
::CodegenBackend
;
24 use rustc_data_structures
::sync
::MetadataRef
;
25 use rustc_data_structures
::owning_ref
::OwningRef
;
26 use rustc_target
::spec
::Target
;
28 pub struct NoLlvmMetadataLoader
;
30 impl MetadataLoader
for NoLlvmMetadataLoader
{
31 fn get_rlib_metadata(&self, _
: &Target
, filename
: &Path
) -> Result
<MetadataRef
, String
> {
32 let buf
= std
::fs
::read(filename
).map_err(|e
| format
!("metadata file open err: {:?}", e
))?
;
33 let buf
: OwningRef
<Vec
<u8>, [u8]> = OwningRef
::new(buf
);
34 Ok(rustc_erase_owner
!(buf
.map_owner_box()))
37 fn get_dylib_metadata(&self, target
: &Target
, filename
: &Path
) -> Result
<MetadataRef
, String
> {
38 self.get_rlib_metadata(target
, filename
)
44 impl CodegenBackend
for TheBackend
{
45 fn metadata_loader(&self) -> Box
<MetadataLoaderDyn
> {
46 Box
::new(NoLlvmMetadataLoader
)
49 fn provide(&self, providers
: &mut Providers
) {
50 rustc_codegen_utils
::symbol_names
::provide(providers
);
52 providers
.target_features_whitelist
= |tcx
, _cnum
| {
53 tcx
.arena
.alloc(Default
::default()) // Just a dummy
55 providers
.is_reachable_non_generic
= |_tcx
, _defid
| true;
56 providers
.exported_symbols
= |_tcx
, _crate
| Arc
::new(Vec
::new());
59 fn provide_extern(&self, providers
: &mut Providers
) {
60 providers
.is_reachable_non_generic
= |_tcx
, _defid
| true;
63 fn codegen_crate
<'a
, 'tcx
>(
66 _metadata
: EncodedMetadata
,
67 _need_metadata_module
: bool
,
69 use rustc_hir
::def_id
::LOCAL_CRATE
;
71 Box
::new(tcx
.crate_name(LOCAL_CRATE
) as Symbol
)
76 ongoing_codegen
: Box
<dyn Any
>,
78 _dep_graph
: &DepGraph
,
79 ) -> Result
<Box
<dyn Any
>, ErrorReported
> {
80 let crate_name
= ongoing_codegen
.downcast
::<Symbol
>()
81 .expect("in join_codegen: ongoing_codegen is not a Symbol");
88 codegen_results
: Box
<dyn Any
>,
89 outputs
: &OutputFilenames
,
90 ) -> Result
<(), ErrorReported
> {
92 use rustc
::session
::config
::CrateType
;
93 use rustc_codegen_utils
::link
::out_filename
;
94 let crate_name
= codegen_results
.downcast
::<Symbol
>()
95 .expect("in link: codegen_results is not a Symbol");
96 for &crate_type
in sess
.opts
.crate_types
.iter() {
97 if crate_type
!= CrateType
::Rlib
{
98 sess
.fatal(&format
!("Crate type is {:?}", crate_type
));
101 out_filename(sess
, crate_type
, &outputs
, &*crate_name
.as_str());
102 let mut out_file
= ::std
::fs
::File
::create(output_name
).unwrap();
103 write
!(out_file
, "This has been \"compiled\" successfully.").unwrap();
109 /// This is the entrypoint for a hot plugged rustc_codegen_llvm
111 pub fn __rustc_codegen_backend() -> Box
<dyn CodegenBackend
> {