Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e82bb915
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,发现更多精彩内容 >>
提交
e82bb915
编写于
8月 21, 2015
作者:
V
Vadim Chugunov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix dllimports of static data from rlibs
上级
cefe5f25
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
105 addition
and
31 deletion
+105
-31
src/librustc_trans/trans/base.rs
src/librustc_trans/trans/base.rs
+69
-31
src/test/run-make/msvc-data-only/Makefile
src/test/run-make/msvc-data-only/Makefile
+8
-0
src/test/run-make/msvc-data-only/bar.rs
src/test/run-make/msvc-data-only/bar.rs
+15
-0
src/test/run-make/msvc-data-only/foo.rs
src/test/run-make/msvc-data-only/foo.rs
+13
-0
未找到文件。
src/librustc_trans/trans/base.rs
浏览文件 @
e82bb915
...
...
@@ -2570,20 +2570,6 @@ fn internalize_symbols(cx: &SharedCrateContext, reachable: &HashSet<&str>) {
unsafe
{
let
mut
declared
=
HashSet
::
new
();
let
iter_globals
=
|
llmod
|
{
ValueIter
{
cur
:
llvm
::
LLVMGetFirstGlobal
(
llmod
),
step
:
llvm
::
LLVMGetNextGlobal
,
}
};
let
iter_functions
=
|
llmod
|
{
ValueIter
{
cur
:
llvm
::
LLVMGetFirstFunction
(
llmod
),
step
:
llvm
::
LLVMGetNextFunction
,
}
};
// Collect all external declarations in all compilation units.
for
ccx
in
cx
.iter
()
{
for
val
in
iter_globals
(
ccx
.llmod
())
.chain
(
iter_functions
(
ccx
.llmod
()))
{
...
...
@@ -2623,28 +2609,74 @@ fn internalize_symbols(cx: &SharedCrateContext, reachable: &HashSet<&str>) {
}
}
}
}
// Create a `__imp_<symbol> = &symbol` global for every public static `symbol`.
// This is required to satisfy `dllimport` references to static data in .rlibs
// when using MSVC linker. We do this only for data, as linker can fix up
// code references on its own.
// See #26591, #27438
fn
create_imps
(
cx
:
&
SharedCrateContext
,
_
reachable
:
&
HashSet
<&
str
>
)
{
unsafe
{
struct
ValueIter
{
cur
:
ValueRef
,
step
:
unsafe
extern
"C"
fn
(
ValueRef
)
->
ValueRef
,
for
ccx
in
cx
.iter
()
{
let
exported
:
Vec
<
_
>
=
iter_globals
(
ccx
.llmod
())
.filter
(|
&
val
|
llvm
::
LLVMGetLinkage
(
val
)
==
llvm
::
ExternalLinkage
as
c_uint
&&
llvm
::
LLVMIsDeclaration
(
val
)
==
0
)
.collect
();
let
i8p_ty
=
Type
::
i8p
(
&
ccx
);
for
val
in
exported
{
let
name
=
CStr
::
from_ptr
(
llvm
::
LLVMGetValueName
(
val
));
let
imp_name
=
String
::
from
(
"__imp_"
)
+
str
::
from_utf8
(
name
.to_bytes
())
.unwrap
();
let
imp_name
=
CString
::
new
(
imp_name
)
.unwrap
();
let
imp
=
llvm
::
LLVMAddGlobal
(
ccx
.llmod
(),
i8p_ty
.to_ref
(),
imp_name
.as_ptr
()
as
*
const
_
);
llvm
::
LLVMSetInitializer
(
imp
,
llvm
::
LLVMConstBitCast
(
val
,
i8p_ty
.to_ref
()));
llvm
::
SetLinkage
(
imp
,
llvm
::
ExternalLinkage
);
}
}
}
}
impl
Iterator
for
ValueIter
{
type
Item
=
ValueRef
;
struct
ValueIter
{
cur
:
ValueRef
,
step
:
unsafe
extern
"C"
fn
(
ValueRef
)
->
ValueRef
,
}
fn
next
(
&
mut
self
)
->
Option
<
ValueRef
>
{
let
old
=
self
.cur
;
if
!
old
.is_null
()
{
self
.cur
=
unsafe
{
let
step
:
unsafe
extern
"C"
fn
(
ValueRef
)
->
ValueRef
=
mem
::
transmute_copy
(
&
self
.step
);
step
(
old
)
};
Some
(
old
)
}
else
{
None
}
impl
Iterator
for
ValueIter
{
type
Item
=
ValueRef
;
fn
next
(
&
mut
self
)
->
Option
<
ValueRef
>
{
let
old
=
self
.cur
;
if
!
old
.is_null
()
{
self
.cur
=
unsafe
{
let
step
:
unsafe
extern
"C"
fn
(
ValueRef
)
->
ValueRef
=
mem
::
transmute_copy
(
&
self
.step
);
step
(
old
)
};
Some
(
old
)
}
else
{
None
}
}
}
fn
iter_globals
(
llmod
:
llvm
::
ModuleRef
)
->
ValueIter
{
unsafe
{
ValueIter
{
cur
:
llvm
::
LLVMGetFirstGlobal
(
llmod
),
step
:
llvm
::
LLVMGetNextGlobal
,
}
}
}
fn
iter_functions
(
llmod
:
llvm
::
ModuleRef
)
->
ValueIter
{
unsafe
{
ValueIter
{
cur
:
llvm
::
LLVMGetFirstFunction
(
llmod
),
step
:
llvm
::
LLVMGetNextFunction
,
}
}
}
...
...
@@ -2824,6 +2856,12 @@ pub fn trans_crate(tcx: &ty::ctxt, analysis: ty::CrateAnalysis) -> CrateTranslat
&
reachable_symbols
.iter
()
.map
(|
x
|
&
x
[
..
])
.collect
());
}
if
sess
.target.target.options.is_like_msvc
&&
sess
.crate_types
.borrow
()
.iter
()
.any
(|
ct
|
*
ct
==
config
::
CrateTypeRlib
||
*
ct
==
config
::
CrateTypeStaticlib
)
{
create_imps
(
&
shared_ccx
,
&
reachable_symbols
.iter
()
.map
(|
x
|
&
x
[
..
])
.collect
());
}
let
metadata_module
=
ModuleTranslation
{
llcx
:
shared_ccx
.metadata_llcx
(),
llmod
:
shared_ccx
.metadata_llmod
(),
...
...
src/test/run-make/msvc-data-only/Makefile
0 → 100644
浏览文件 @
e82bb915
# Test that on *-pc-windows-msvc we can link to a rlib containing only data.
# See #26591, #27438
-include
../tools.mk
all
:
$(RUSTC)
foo.rs
$(RUSTC)
bar.rs
src/test/run-make/msvc-data-only/bar.rs
0 → 100644
浏览文件 @
e82bb915
// Copyright 2015 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.
extern
crate
foo
;
fn
main
()
{
println!
(
"The answer is {} !"
,
foo
::
FOO
);
}
src/test/run-make/msvc-data-only/foo.rs
0 → 100644
浏览文件 @
e82bb915
// Copyright 2015 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.
#![crate_type
=
"rlib"
]
pub
static
FOO
:
i32
=
42
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录