Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
e7d0fa34
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,发现更多精彩内容 >>
提交
e7d0fa34
编写于
7月 26, 2017
作者:
M
Michael Woerister
提交者:
Michael Woerister
7月 31, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
async-llvm(17): Create MSVC __imp_ symbols immediately for each module.
上级
0ad9eaa9
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
27 addition
and
39 deletion
+27
-39
src/librustc_trans/base.rs
src/librustc_trans/base.rs
+27
-39
未找到文件。
src/librustc_trans/base.rs
浏览文件 @
e7d0fa34
...
...
@@ -804,7 +804,7 @@ enum MetadataKind {
// code references on its own.
// See #26591, #27438
fn
create_imps
(
sess
:
&
Session
,
llvm_module
s
:
&
[
ModuleLlvm
]
)
{
llvm_module
:
&
ModuleLlvm
)
{
// The x86 ABI seems to require that leading underscores are added to symbol
// names, so we need an extra underscore on 32-bit. There's also a leading
// '\x01' here which disables LLVM's symbol mangling (e.g. no extra
...
...
@@ -815,8 +815,7 @@ fn create_imps(sess: &Session,
"
\x01
__imp_"
};
unsafe
{
for
ll
in
llvm_modules
{
let
exported
:
Vec
<
_
>
=
iter_globals
(
ll
.llmod
)
let
exported
:
Vec
<
_
>
=
iter_globals
(
llvm_module
.llmod
)
.filter
(|
&
val
|
{
llvm
::
LLVMRustGetLinkage
(
val
)
==
llvm
::
Linkage
::
ExternalLinkage
&&
...
...
@@ -824,13 +823,13 @@ fn create_imps(sess: &Session,
})
.collect
();
let
i8p_ty
=
Type
::
i8p_llcx
(
ll
.llcx
);
let
i8p_ty
=
Type
::
i8p_llcx
(
llvm_module
.llcx
);
for
val
in
exported
{
let
name
=
CStr
::
from_ptr
(
llvm
::
LLVMGetValueName
(
val
));
let
mut
imp_name
=
prefix
.as_bytes
()
.to_vec
();
imp_name
.extend
(
name
.to_bytes
());
let
imp_name
=
CString
::
new
(
imp_name
)
.unwrap
();
let
imp
=
llvm
::
LLVMAddGlobal
(
ll
.llmod
,
let
imp
=
llvm
::
LLVMAddGlobal
(
llvm_module
.llmod
,
i8p_ty
.to_ref
(),
imp_name
.as_ptr
()
as
*
const
_
);
let
init
=
llvm
::
LLVMConstBitCast
(
val
,
i8p_ty
.to_ref
());
...
...
@@ -838,7 +837,6 @@ fn create_imps(sess: &Session,
llvm
::
LLVMRustSetLinkage
(
imp
,
llvm
::
Linkage
::
ExternalLinkage
);
}
}
}
}
struct
ValueIter
{
...
...
@@ -1125,6 +1123,12 @@ fn module_translation<'a, 'tcx>(
}
}
// Adjust exported symbols for MSVC dllimport
if
ccx
.sess
()
.target.target.options.is_like_msvc
&&
ccx
.sess
()
.crate_types
.borrow
()
.iter
()
.any
(|
ct
|
*
ct
==
config
::
CrateTypeRlib
)
{
create_imps
(
ccx
.sess
(),
&
llvm_module
);
}
ModuleTranslation
{
name
:
cgu_name
,
symbol_name_hash
,
...
...
@@ -1170,22 +1174,6 @@ fn module_translation<'a, 'tcx>(
let
sess
=
shared_ccx
.sess
();
// Get the list of llvm modules we created. We'll do a few wacky
// transforms on them now.
let
llvm_modules
:
Vec
<
_
>
=
modules
.iter
()
.filter_map
(|
module
|
match
module
.source
{
ModuleSource
::
Translated
(
llvm
)
=>
Some
(
llvm
),
_
=>
None
,
})
.collect
();
if
sess
.target.target.options.is_like_msvc
&&
sess
.crate_types
.borrow
()
.iter
()
.any
(|
ct
|
*
ct
==
config
::
CrateTypeRlib
)
{
create_imps
(
sess
,
&
llvm_modules
);
}
// Translate an allocator shim, if any
//
// If LTO is enabled and we've got some previous LLVM module we translated
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录