Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
7e09d1e1
R
Rust
项目概览
int
/
Rust
接近 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7e09d1e1
编写于
7月 26, 2017
作者:
M
Michael Woerister
提交者:
Michael Woerister
7月 31, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
async-llvm(18): Instantiate OngoingCrateTranslation before starting translation.
上级
e7d0fa34
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
84 addition
and
75 deletion
+84
-75
src/librustc/middle/cstore.rs
src/librustc/middle/cstore.rs
+4
-6
src/librustc_driver/driver.rs
src/librustc_driver/driver.rs
+3
-3
src/librustc_incremental/persist/save.rs
src/librustc_incremental/persist/save.rs
+2
-2
src/librustc_metadata/cstore_impl.rs
src/librustc_metadata/cstore_impl.rs
+3
-2
src/librustc_metadata/encoder.rs
src/librustc_metadata/encoder.rs
+2
-5
src/librustc_trans/base.rs
src/librustc_trans/base.rs
+70
-57
未找到文件。
src/librustc/middle/cstore.rs
浏览文件 @
7e09d1e1
...
...
@@ -50,7 +50,7 @@
// lonely orphan structs and enums looking for a better home
#[derive(Clone,
Debug)]
#[derive(Clone,
Debug
,
Copy
)]
pub
struct
LinkMeta
{
pub
crate_hash
:
Svh
,
}
...
...
@@ -161,15 +161,13 @@ pub struct ExternCrate {
}
pub
struct
EncodedMetadata
{
pub
raw_data
:
Vec
<
u8
>
,
pub
hashes
:
EncodedMetadataHashes
,
pub
raw_data
:
Vec
<
u8
>
}
impl
EncodedMetadata
{
pub
fn
new
()
->
EncodedMetadata
{
EncodedMetadata
{
raw_data
:
Vec
::
new
(),
hashes
:
EncodedMetadataHashes
::
new
(),
}
}
}
...
...
@@ -294,7 +292,7 @@ fn encode_metadata<'a, 'tcx>(&self,
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
link_meta
:
&
LinkMeta
,
reachable
:
&
NodeSet
)
->
EncodedMetadata
;
->
(
EncodedMetadata
,
EncodedMetadataHashes
)
;
fn
metadata_encoding_version
(
&
self
)
->
&
[
u8
];
}
...
...
@@ -424,7 +422,7 @@ fn encode_metadata<'a, 'tcx>(&self,
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
link_meta
:
&
LinkMeta
,
reachable
:
&
NodeSet
)
->
EncodedMetadata
{
->
(
EncodedMetadata
,
EncodedMetadataHashes
)
{
bug!
(
"encode_metadata"
)
}
fn
metadata_encoding_version
(
&
self
)
->
&
[
u8
]
{
bug!
(
"metadata_encoding_version"
)
}
...
...
src/librustc_driver/driver.rs
浏览文件 @
7e09d1e1
...
...
@@ -206,7 +206,7 @@ pub fn compile_input(sess: &Session,
println!
(
"Pre-trans"
);
tcx
.print_debug_stats
();
}
let
trans
=
phase_4_translate_to_llvm
(
tcx
,
analysis
,
&
incremental_hashes_map
,
let
trans
=
phase_4_translate_to_llvm
(
tcx
,
analysis
,
incremental_hashes_map
,
&
outputs
);
if
log_enabled!
(::
log
::
LogLevel
::
Info
)
{
...
...
@@ -1051,7 +1051,7 @@ pub fn phase_3_run_analysis_passes<'tcx, F, R>(sess: &'tcx Session,
/// be discarded.
pub
fn
phase_4_translate_to_llvm
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
analysis
:
ty
::
CrateAnalysis
,
incremental_hashes_map
:
&
IncrementalHashesMap
,
incremental_hashes_map
:
IncrementalHashesMap
,
output_filenames
:
&
OutputFilenames
)
->
write
::
OngoingCrateTranslation
{
let
time_passes
=
tcx
.sess
.time_passes
();
...
...
@@ -1063,7 +1063,7 @@ pub fn phase_4_translate_to_llvm<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let
translation
=
time
(
time_passes
,
"translation"
,
move
||
trans
::
trans_crate
(
tcx
,
analysis
,
&
incremental_hashes_map
,
output_filenames
));
move
||
trans
::
trans_crate
(
tcx
,
analysis
,
incremental_hashes_map
,
output_filenames
));
translation
}
...
...
src/librustc_incremental/persist/save.rs
浏览文件 @
7e09d1e1
...
...
@@ -34,7 +34,7 @@
use
super
::
work_product
;
pub
fn
save_dep_graph
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
incremental_hashes_map
:
&
IncrementalHashesMap
,
incremental_hashes_map
:
IncrementalHashesMap
,
metadata_hashes
:
&
EncodedMetadataHashes
,
svh
:
Svh
)
{
debug!
(
"save_dep_graph()"
);
...
...
@@ -51,7 +51,7 @@ pub fn save_dep_graph<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
eprintln!
(
"incremental: {} edges in dep-graph"
,
query
.graph
.len_edges
());
}
let
mut
hcx
=
HashContext
::
new
(
tcx
,
incremental_hashes_map
);
let
mut
hcx
=
HashContext
::
new
(
tcx
,
&
incremental_hashes_map
);
let
preds
=
Predecessors
::
new
(
&
query
,
&
mut
hcx
);
let
mut
current_metadata_hashes
=
FxHashMap
();
...
...
src/librustc_metadata/cstore_impl.rs
浏览文件 @
7e09d1e1
...
...
@@ -15,7 +15,8 @@
use
rustc
::
ty
::
maps
::
QueryConfig
;
use
rustc
::
middle
::
cstore
::{
CrateStore
,
CrateSource
,
LibSource
,
DepKind
,
NativeLibrary
,
MetadataLoader
,
LinkMeta
,
LinkagePreference
,
LoadedMacro
,
EncodedMetadata
};
LinkagePreference
,
LoadedMacro
,
EncodedMetadata
,
EncodedMetadataHashes
};
use
rustc
::
hir
::
def
;
use
rustc
::
middle
::
lang_items
;
use
rustc
::
session
::
Session
;
...
...
@@ -443,7 +444,7 @@ fn encode_metadata<'a, 'tcx>(&self,
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
link_meta
:
&
LinkMeta
,
reachable
:
&
NodeSet
)
->
EncodedMetadata
->
(
EncodedMetadata
,
EncodedMetadataHashes
)
{
encoder
::
encode_metadata
(
tcx
,
link_meta
,
reachable
)
}
...
...
src/librustc_metadata/encoder.rs
浏览文件 @
7e09d1e1
...
...
@@ -1638,7 +1638,7 @@ fn visit_impl_item(&mut self, _impl_item: &'v hir::ImplItem) {
pub
fn
encode_metadata
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
link_meta
:
&
LinkMeta
,
exported_symbols
:
&
NodeSet
)
->
EncodedMetadata
->
(
EncodedMetadata
,
EncodedMetadataHashes
)
{
let
mut
cursor
=
Cursor
::
new
(
vec!
[]);
cursor
.write_all
(
METADATA_HEADER
)
.unwrap
();
...
...
@@ -1681,10 +1681,7 @@ pub fn encode_metadata<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
result
[
header
+
2
]
=
(
pos
>>
8
)
as
u8
;
result
[
header
+
3
]
=
(
pos
>>
0
)
as
u8
;
EncodedMetadata
{
raw_data
:
result
,
hashes
:
metadata_hashes
,
}
(
EncodedMetadata
{
raw_data
:
result
},
metadata_hashes
)
}
pub
fn
get_repr_options
<
'a
,
'tcx
,
'gcx
>
(
tcx
:
&
TyCtxt
<
'a
,
'tcx
,
'gcx
>
,
did
:
DefId
)
->
ReprOptions
{
...
...
src/librustc_trans/base.rs
浏览文件 @
7e09d1e1
...
...
@@ -38,7 +38,7 @@
use
metadata
;
use
rustc
::
hir
::
def_id
::
LOCAL_CRATE
;
use
rustc
::
middle
::
lang_items
::
StartFnLangItem
;
use
rustc
::
middle
::
cstore
::
EncodedMetadata
;
use
rustc
::
middle
::
cstore
::
{
EncodedMetadata
,
EncodedMetadataHashes
}
;
use
rustc
::
ty
::{
self
,
Ty
,
TyCtxt
};
use
rustc
::
dep_graph
::
AssertDepGraphSafe
;
use
rustc
::
middle
::
cstore
::
LinkMeta
;
...
...
@@ -729,7 +729,8 @@ fn contains_null(s: &str) -> bool {
fn
write_metadata
<
'a
,
'gcx
>
(
tcx
:
TyCtxt
<
'a
,
'gcx
,
'gcx
>
,
link_meta
:
&
LinkMeta
,
exported_symbols
:
&
NodeSet
)
->
(
ContextRef
,
ModuleRef
,
EncodedMetadata
)
{
->
(
ContextRef
,
ModuleRef
,
EncodedMetadata
,
EncodedMetadataHashes
)
{
use
std
::
io
::
Write
;
use
flate2
::
Compression
;
use
flate2
::
write
::
DeflateEncoder
;
...
...
@@ -759,15 +760,18 @@ enum MetadataKind {
})
.max
()
.unwrap
();
if
kind
==
MetadataKind
::
None
{
return
(
metadata_llcx
,
metadata_llmod
,
EncodedMetadata
::
new
());
return
(
metadata_llcx
,
metadata_llmod
,
EncodedMetadata
::
new
(),
EncodedMetadataHashes
::
new
());
}
let
cstore
=
&
tcx
.sess.cstore
;
let
metadata
=
cstore
.encode_metadata
(
tcx
,
&
link_meta
,
exported_symbols
);
let
(
metadata
,
hashes
)
=
cstore
.encode_metadata
(
tcx
,
&
link_meta
,
exported_symbols
);
if
kind
==
MetadataKind
::
Uncompressed
{
return
(
metadata_llcx
,
metadata_llmod
,
metadata
);
return
(
metadata_llcx
,
metadata_llmod
,
metadata
,
hashes
);
}
assert
!
(
kind
==
MetadataKind
::
Compressed
);
...
...
@@ -795,7 +799,7 @@ enum MetadataKind {
let
directive
=
CString
::
new
(
directive
)
.unwrap
();
llvm
::
LLVMSetModuleInlineAsm
(
metadata_llmod
,
directive
.as_ptr
())
}
return
(
metadata_llcx
,
metadata_llmod
,
metadata
);
return
(
metadata_llcx
,
metadata_llmod
,
metadata
,
hashes
);
}
// Create a `__imp_<symbol> = &symbol` global for every public static `symbol`.
...
...
@@ -919,7 +923,7 @@ pub fn find_exported_symbols(tcx: TyCtxt, reachable: &NodeSet) -> NodeSet {
pub
fn
trans_crate
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
analysis
:
ty
::
CrateAnalysis
,
incremental_hashes_map
:
&
IncrementalHashesMap
,
incremental_hashes_map
:
IncrementalHashesMap
,
output_filenames
:
&
OutputFilenames
)
->
OngoingCrateTranslation
{
// Be careful with this krate: obviously it gives access to the
...
...
@@ -927,19 +931,16 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
// `TransCrate`, you need to be careful to register "reads" of the
// particular items that will be processed.
let
krate
=
tcx
.hir
.krate
();
let
ty
::
CrateAnalysis
{
reachable
,
..
}
=
analysis
;
let
check_overflow
=
tcx
.sess
.overflow_checks
();
let
link_meta
=
link
::
build_link_meta
(
incremental_hashes_map
);
let
link_meta
=
link
::
build_link_meta
(
&
incremental_hashes_map
);
let
exported_symbol_node_ids
=
find_exported_symbols
(
tcx
,
&
reachable
);
let
shared_ccx
=
SharedCrateContext
::
new
(
tcx
,
check_overflow
,
output_filenames
);
// Translate the metadata.
let
(
metadata_llcx
,
metadata_llmod
,
metadata
)
=
let
(
metadata_llcx
,
metadata_llmod
,
metadata
,
metadata_incr_hashes
)
=
time
(
tcx
.sess
.time_passes
(),
"write metadata"
,
||
{
write_metadata
(
tcx
,
&
link_meta
,
&
exported_symbol_node_ids
)
});
...
...
@@ -976,6 +977,11 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
ongoing_translation
.submit_translated_module_to_llvm
(
tcx
.sess
,
metadata_module
);
ongoing_translation
.signal_translation_done
();
assert_and_save_dep_graph
(
tcx
,
incremental_hashes_map
,
metadata_incr_hashes
,
link_meta
);
return
ongoing_translation
;
}
...
...
@@ -989,6 +995,35 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
assert
!
(
codegen_units
.len
()
<=
1
||
!
tcx
.sess
.lto
());
let
linker_info
=
LinkerInfo
::
new
(
&
shared_ccx
,
&
exported_symbols
);
let
subsystem
=
attr
::
first_attr_value_str_by_name
(
&
krate
.attrs
,
"windows_subsystem"
);
let
windows_subsystem
=
subsystem
.map
(|
subsystem
|
{
if
subsystem
!=
"windows"
&&
subsystem
!=
"console"
{
tcx
.sess
.fatal
(
&
format!
(
"invalid windows subsystem `{}`, only
\
`windows` and `console` are allowed"
,
subsystem
));
}
subsystem
.to_string
()
});
let
no_integrated_as
=
tcx
.sess.opts.cg.no_integrated_as
||
(
tcx
.sess.target.target.options.no_integrated_as
&&
(
output_filenames
.outputs
.contains_key
(
&
OutputType
::
Object
)
||
output_filenames
.outputs
.contains_key
(
&
OutputType
::
Exe
)));
let
ongoing_translation
=
write
::
run_passes
(
tcx
.sess
,
output_filenames
,
tcx
.crate_name
(
LOCAL_CRATE
),
link_meta
,
metadata
,
exported_symbols
.clone
(),
no_builtins
,
windows_subsystem
,
linker_info
,
no_integrated_as
);
let
translation_items
=
Arc
::
new
(
translation_items
);
let
mut
all_stats
=
Stats
::
default
();
...
...
@@ -1209,48 +1244,10 @@ fn module_translation<'a, 'tcx>(
None
};
let
linker_info
=
LinkerInfo
::
new
(
&
shared_ccx
,
&
exported_symbols
);
let
subsystem
=
attr
::
first_attr_value_str_by_name
(
&
krate
.attrs
,
"windows_subsystem"
);
let
windows_subsystem
=
subsystem
.map
(|
subsystem
|
{
if
subsystem
!=
"windows"
&&
subsystem
!=
"console"
{
tcx
.sess
.fatal
(
&
format!
(
"invalid windows subsystem `{}`, only
\
`windows` and `console` are allowed"
,
subsystem
));
}
subsystem
.to_string
()
});
let
outputs
=
output_filenames
;
let
no_integrated_as
=
sess
.opts.cg.no_integrated_as
||
(
sess
.target.target.options.no_integrated_as
&&
(
outputs
.outputs
.contains_key
(
&
OutputType
::
Object
)
||
outputs
.outputs
.contains_key
(
&
OutputType
::
Exe
)));
time
(
sess
.time_passes
(),
"assert dep graph"
,
||
rustc_incremental
::
assert_dep_graph
(
tcx
));
time
(
sess
.time_passes
(),
"serialize dep graph"
,
||
rustc_incremental
::
save_dep_graph
(
tcx
,
incremental_hashes_map
,
&
metadata
.hashes
,
link_meta
.crate_hash
));
// ---
let
ongoing_translation
=
write
::
run_passes
(
sess
,
outputs
,
tcx
.crate_name
(
LOCAL_CRATE
),
link_meta
,
metadata
,
exported_symbols
,
no_builtins
,
windows_subsystem
,
linker_info
,
no_integrated_as
);
assert_and_save_dep_graph
(
tcx
,
incremental_hashes_map
,
metadata_incr_hashes
,
link_meta
);
ongoing_translation
.submit_translated_module_to_llvm
(
sess
,
metadata_module
);
...
...
@@ -1267,6 +1264,22 @@ fn module_translation<'a, 'tcx>(
ongoing_translation
}
fn
assert_and_save_dep_graph
<
'a
,
'tcx
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
incremental_hashes_map
:
IncrementalHashesMap
,
metadata_incr_hashes
:
EncodedMetadataHashes
,
link_meta
:
LinkMeta
)
{
time
(
tcx
.sess
.time_passes
(),
"assert dep graph"
,
||
rustc_incremental
::
assert_dep_graph
(
tcx
));
time
(
tcx
.sess
.time_passes
(),
"serialize dep graph"
,
||
rustc_incremental
::
save_dep_graph
(
tcx
,
incremental_hashes_map
,
&
metadata_incr_hashes
,
link_meta
.crate_hash
));
}
#[inline(never)]
// give this a place in the profiler
fn
assert_symbols_are_distinct
<
'a
,
'tcx
,
I
>
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
trans_items
:
I
)
where
I
:
Iterator
<
Item
=&
'a
TransItem
<
'tcx
>>
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录