Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
dd0781ea
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,发现更多精彩内容 >>
提交
dd0781ea
编写于
10月 28, 2016
作者:
J
Jeffrey Seyfried
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Register and stability check `#[no_link]` crates.
上级
a1d45d94
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
50 addition
and
41 deletion
+50
-41
src/librustc/middle/cstore.rs
src/librustc/middle/cstore.rs
+2
-0
src/librustc/middle/dependency_format.rs
src/librustc/middle/dependency_format.rs
+2
-0
src/librustc_llvm/lib.rs
src/librustc_llvm/lib.rs
+1
-0
src/librustc_metadata/creader.rs
src/librustc_metadata/creader.rs
+25
-27
src/librustc_metadata/cstore.rs
src/librustc_metadata/cstore.rs
+7
-6
src/librustc_metadata/decoder.rs
src/librustc_metadata/decoder.rs
+5
-1
src/librustc_resolve/build_reduced_graph.rs
src/librustc_resolve/build_reduced_graph.rs
+3
-2
src/librustc_resolve/lib.rs
src/librustc_resolve/lib.rs
+1
-1
src/test/compile-fail/no-link.rs
src/test/compile-fail/no-link.rs
+4
-4
未找到文件。
src/librustc/middle/cstore.rs
浏览文件 @
dd0781ea
...
...
@@ -65,6 +65,8 @@ pub struct CrateSource {
#[derive(RustcEncodable,
RustcDecodable,
Copy,
Clone,
Ord,
PartialOrd,
Eq,
PartialEq,
Debug)]
pub
enum
DepKind
{
/// A dependency that is only used for its macros.
MacrosOnly
,
/// A dependency that is always injected into the dependency list and so
/// doesn't need to be linked to an rlib, e.g. the injected allocator.
Implicit
,
...
...
src/librustc/middle/dependency_format.rs
浏览文件 @
dd0781ea
...
...
@@ -124,6 +124,7 @@ fn calculate_type(sess: &session::Session,
return
v
;
}
for
cnum
in
sess
.cstore
.crates
()
{
if
sess
.cstore
.dep_kind
(
cnum
)
==
DepKind
::
MacrosOnly
{
continue
}
let
src
=
sess
.cstore
.used_crate_source
(
cnum
);
if
src
.rlib
.is_some
()
{
continue
}
sess
.err
(
&
format!
(
"dependency `{}` not found in rlib format"
,
...
...
@@ -156,6 +157,7 @@ fn calculate_type(sess: &session::Session,
// dependencies, ensuring there are no conflicts. The only valid case for a
// dependency to be relied upon twice is for both cases to rely on a dylib.
for
cnum
in
sess
.cstore
.crates
()
{
if
sess
.cstore
.dep_kind
(
cnum
)
==
DepKind
::
MacrosOnly
{
continue
}
let
name
=
sess
.cstore
.crate_name
(
cnum
);
let
src
=
sess
.cstore
.used_crate_source
(
cnum
);
if
src
.dylib
.is_some
()
{
...
...
src/librustc_llvm/lib.rs
浏览文件 @
dd0781ea
...
...
@@ -29,6 +29,7 @@
#![feature(staged_api)]
#![feature(linked_from)]
#![feature(concat_idents)]
#![cfg_attr(not(stage0),
feature(rustc_private))]
extern
crate
libc
;
#[macro_use]
...
...
src/librustc_metadata/creader.rs
浏览文件 @
dd0781ea
...
...
@@ -67,16 +67,12 @@ fn dump_crates(cstore: &CStore) {
})
}
fn
should_link
(
i
:
&
ast
::
Item
)
->
bool
{
!
attr
::
contains_name
(
&
i
.attrs
,
"no_link"
)
}
#[derive(Debug)]
struct
ExternCrateInfo
{
ident
:
String
,
name
:
String
,
id
:
ast
::
NodeId
,
should_link
:
bool
,
dep_kind
:
DepKind
,
}
fn
register_native_lib
(
sess
:
&
Session
,
...
...
@@ -168,7 +164,11 @@ fn extract_crate_info(&self, i: &ast::Item) -> Option<ExternCrateInfo> {
ident
:
i
.ident
.to_string
(),
name
:
name
,
id
:
i
.id
,
should_link
:
should_link
(
i
),
dep_kind
:
if
attr
::
contains_name
(
&
i
.attrs
,
"no_link"
)
{
DepKind
::
MacrosOnly
}
else
{
DepKind
::
Explicit
},
})
}
_
=>
None
...
...
@@ -283,7 +283,7 @@ fn register_crate(&mut self,
let
Library
{
dylib
,
rlib
,
metadata
}
=
lib
;
let
cnum_map
=
self
.resolve_crate_deps
(
root
,
&
crate_root
,
&
metadata
,
cnum
,
span
);
let
cnum_map
=
self
.resolve_crate_deps
(
root
,
&
crate_root
,
&
metadata
,
cnum
,
span
,
dep_kind
);
if
crate_root
.macro_derive_registrar
.is_some
()
{
self
.sess
.span_err
(
span
,
"crates of the `proc-macro` crate type
\
...
...
@@ -427,7 +427,8 @@ fn resolve_crate_deps(&mut self,
crate_root
:
&
CrateRoot
,
metadata
:
&
MetadataBlob
,
krate
:
CrateNum
,
span
:
Span
)
span
:
Span
,
dep_kind
:
DepKind
)
->
cstore
::
CrateNumMap
{
debug!
(
"resolving deps of external crate"
);
// The map from crate numbers in the crate we're resolving to local crate
...
...
@@ -435,13 +436,14 @@ fn resolve_crate_deps(&mut self,
let
deps
=
crate_root
.crate_deps
.decode
(
metadata
);
let
map
:
FxHashMap
<
_
,
_
>
=
deps
.enumerate
()
.map
(|(
crate_num
,
dep
)|
{
debug!
(
"resolving dep crate {} hash: `{}`"
,
dep
.name
,
dep
.hash
);
let
(
local_cnum
,
..
)
=
self
.resolve_crate
(
root
,
&
dep
.name
.as_str
(),
&
dep
.name
.as_str
(),
Some
(
&
dep
.hash
),
span
,
PathKind
::
Dependency
,
dep
.kind
);
let
dep_name
=
&
dep
.name
.as_str
();
let
dep_kind
=
match
dep_kind
{
DepKind
::
MacrosOnly
=>
DepKind
::
MacrosOnly
,
_
=>
dep
.kind
,
};
let
(
local_cnum
,
..
)
=
self
.resolve_crate
(
root
,
dep_name
,
dep_name
,
Some
(
&
dep
.hash
),
span
,
PathKind
::
Dependency
,
dep_kind
,
);
(
CrateNum
::
new
(
crate_num
+
1
),
local_cnum
)
})
.collect
();
...
...
@@ -455,8 +457,8 @@ fn resolve_crate_deps(&mut self,
}
fn
read_extension_crate
(
&
mut
self
,
span
:
Span
,
info
:
&
ExternCrateInfo
)
->
ExtensionCrate
{
info!
(
"read extension crate {} `extern crate {} as {}`
linked={
}"
,
info
.id
,
info
.name
,
info
.ident
,
info
.
should_link
);
info!
(
"read extension crate {} `extern crate {} as {}`
dep_kind={:?
}"
,
info
.id
,
info
.name
,
info
.ident
,
info
.
dep_kind
);
let
target_triple
=
&
self
.sess.opts.target_triple
[
..
];
let
is_cross
=
target_triple
!=
config
::
host_triple
();
let
mut
target_only
=
false
;
...
...
@@ -641,7 +643,7 @@ pub fn find_plugin_registrar(&mut self, span: Span, name: &str)
name
:
name
.to_string
(),
ident
:
name
.to_string
(),
id
:
ast
::
DUMMY_NODE_ID
,
should_link
:
false
,
dep_kind
:
DepKind
::
MacrosOnly
,
});
if
ekrate
.target_only
{
...
...
@@ -984,30 +986,26 @@ fn process_item(&mut self, item: &ast::Item, definitions: &Definitions, load_mac
let
ekrate
=
self
.read_extension_crate
(
item
.span
,
&
info
);
let
loaded_macros
=
self
.read_macros
(
item
,
&
ekrate
);
// If this is a proc-macro crate or `#[no_link]` crate, it is only used at compile time,
// so we return here to avoid registering the crate.
if
loaded_macros
.is_proc_macros
()
||
!
info
.should_link
{
// If this is a proc-macro crate, return here to avoid registering.
if
loaded_macros
.is_proc_macros
()
{
return
Some
(
loaded_macros
);
}
// Register crate now to avoid double-reading metadata
if
let
PMDSource
::
Owned
(
lib
)
=
ekrate
.metadata
{
if
ekrate
.target_only
||
config
::
host_triple
()
==
self
.sess.opts.target_triple
{
let
ExternCrateInfo
{
ref
ident
,
ref
name
,
..
}
=
info
;
self
.register_crate
(
&
None
,
ident
,
name
,
item
.span
,
lib
,
DepKind
::
Explicit
);
let
ExternCrateInfo
{
ref
ident
,
ref
name
,
dep_kind
,
..
}
=
info
;
self
.register_crate
(
&
None
,
ident
,
name
,
item
.span
,
lib
,
dep_kind
);
}
}
Some
(
loaded_macros
)
}
else
{
if
!
info
.should_link
{
return
None
;
}
None
};
let
(
cnum
,
..
)
=
self
.resolve_crate
(
&
None
,
&
info
.ident
,
&
info
.name
,
None
,
item
.span
,
PathKind
::
Crate
,
DepKind
::
Explicit
,
&
None
,
&
info
.ident
,
&
info
.name
,
None
,
item
.span
,
PathKind
::
Crate
,
info
.dep_kind
,
);
let
def_id
=
definitions
.opt_local_def_id
(
item
.id
)
.unwrap
();
...
...
src/librustc_metadata/cstore.rs
浏览文件 @
dd0781ea
...
...
@@ -192,12 +192,13 @@ pub fn do_get_used_crates(&self,
let
mut
libs
=
self
.metas
.borrow
()
.iter
()
.map
(|(
&
cnum
,
data
)|
{
(
cnum
,
match
prefer
{
LinkagePreference
::
RequireDynamic
=>
data
.source.dylib
.clone
()
.map
(|
p
|
p
.0
),
LinkagePreference
::
RequireStatic
=>
data
.source.rlib
.clone
()
.map
(|
p
|
p
.0
),
})
.filter_map
(|(
&
cnum
,
data
)|
{
if
data
.dep_kind
.get
()
==
DepKind
::
MacrosOnly
{
return
None
;
}
let
path
=
match
prefer
{
LinkagePreference
::
RequireDynamic
=>
data
.source.dylib
.clone
()
.map
(|
p
|
p
.0
),
LinkagePreference
::
RequireStatic
=>
data
.source.rlib
.clone
()
.map
(|
p
|
p
.0
),
};
Some
((
cnum
,
path
))
})
.collect
::
<
Vec
<
_
>>
();
libs
.sort_by
(|
&
(
a
,
_
),
&
(
b
,
_
)|
{
...
...
src/librustc_metadata/decoder.rs
浏览文件 @
dd0781ea
...
...
@@ -21,7 +21,7 @@
use
rustc
::
hir
;
use
rustc
::
hir
::
intravisit
::
IdRange
;
use
rustc
::
middle
::
cstore
::{
InlinedItem
,
LinkagePreference
};
use
rustc
::
middle
::
cstore
::{
DepKind
,
InlinedItem
,
LinkagePreference
};
use
rustc
::
hir
::
def
::{
self
,
Def
,
CtorKind
};
use
rustc
::
hir
::
def_id
::{
CrateNum
,
DefId
,
DefIndex
,
LOCAL_CRATE
};
use
rustc
::
middle
::
lang_items
;
...
...
@@ -690,6 +690,10 @@ pub fn get_lang_items(&self) -> Vec<(DefIndex, usize)> {
pub
fn
each_child_of_item
<
F
>
(
&
self
,
id
:
DefIndex
,
mut
callback
:
F
)
where
F
:
FnMut
(
def
::
Export
)
{
if
self
.dep_kind
.get
()
==
DepKind
::
MacrosOnly
{
return
}
// Find the item.
let
item
=
match
self
.maybe_entry
(
id
)
{
None
=>
return
,
...
...
src/librustc_resolve/build_reduced_graph.rs
浏览文件 @
dd0781ea
...
...
@@ -22,7 +22,7 @@
use
Resolver
;
use
{
resolve_error
,
resolve_struct_error
,
ResolutionError
};
use
rustc
::
middle
::
cstore
::
LoadedMacros
;
use
rustc
::
middle
::
cstore
::
{
DepKind
,
LoadedMacros
}
;
use
rustc
::
hir
::
def
::
*
;
use
rustc
::
hir
::
def_id
::{
CrateNum
,
CRATE_DEF_INDEX
,
DefId
};
use
rustc
::
ty
;
...
...
@@ -499,8 +499,9 @@ fn build_reduced_graph_for_external_crate_def(&mut self, parent: Module<'b>,
fn
get_extern_crate_root
(
&
mut
self
,
cnum
:
CrateNum
)
->
Module
<
'b
>
{
let
def_id
=
DefId
{
krate
:
cnum
,
index
:
CRATE_DEF_INDEX
};
let
macros_only
=
self
.session.cstore
.dep_kind
(
cnum
)
==
DepKind
::
MacrosOnly
;
let
arenas
=
self
.arenas
;
*
self
.extern_crate_roots
.entry
(
cnum
)
.or_insert_with
(||
{
*
self
.extern_crate_roots
.entry
(
(
cnum
,
macros_only
)
)
.or_insert_with
(||
{
arenas
.alloc_module
(
ModuleS
{
populated
:
Cell
::
new
(
false
),
..
ModuleS
::
new
(
None
,
ModuleKind
::
Def
(
Def
::
Mod
(
def_id
),
keywords
::
Invalid
.name
()))
...
...
src/librustc_resolve/lib.rs
浏览文件 @
dd0781ea
...
...
@@ -1083,7 +1083,7 @@ pub struct Resolver<'a> {
// There will be an anonymous module created around `g` with the ID of the
// entry block for `f`.
module_map
:
NodeMap
<
Module
<
'a
>>
,
extern_crate_roots
:
FxHashMap
<
CrateNum
,
Module
<
'a
>>
,
extern_crate_roots
:
FxHashMap
<
(
CrateNum
,
bool
/* MacrosOnly? */
)
,
Module
<
'a
>>
,
// Whether or not to print error messages. Can be set to true
// when getting additional info for error message suggestions,
...
...
src/test/compile-fail/no-link.rs
浏览文件 @
dd0781ea
...
...
@@ -8,11 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// aux-build:empty-struct.rs
#[no_link]
extern
crate
libc
;
extern
crate
empty_struct
;
fn
main
()
{
unsafe
{
libc
::
abs
(
0
);
//~ ERROR unresolved name
}
empty_struct
::
XEmpty1
;
//~ ERROR unresolved name
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录