Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
d5de680e
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,发现更多精彩内容 >>
提交
d5de680e
编写于
9月 17, 2021
作者:
Y
Yilin Chen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Work around invalid DWARF bugs for fat LTO
Signed-off-by:
N
Yilin Chen
<
sticnarf@gmail.com
>
上级
1c03f0d0
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
20 addition
and
10 deletion
+20
-10
compiler/rustc_codegen_llvm/src/back/lto.rs
compiler/rustc_codegen_llvm/src/back/lto.rs
+16
-2
compiler/rustc_codegen_llvm/src/llvm/ffi.rs
compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+2
-6
compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
+2
-2
未找到文件。
compiler/rustc_codegen_llvm/src/back/lto.rs
浏览文件 @
d5de680e
...
...
@@ -325,6 +325,20 @@ fn fat_lto(
drop
(
linker
);
save_temp_bitcode
(
&
cgcx
,
&
module
,
"lto.input"
);
// Fat LTO also suffers from the invalid DWARF issue similar to Thin LTO.
// Here we rewrite all `DICompileUnit` pointers if there is only one `DICompileUnit`.
// This only works around the problem when codegen-units = 1.
// Refer to the comments in the `optimize_thin_module` function for more details.
let
mut
cu1
=
ptr
::
null_mut
();
let
mut
cu2
=
ptr
::
null_mut
();
unsafe
{
llvm
::
LLVMRustLTOGetDICompileUnit
(
llmod
,
&
mut
cu1
,
&
mut
cu2
)
};
if
!
cu2
.is_null
()
{
let
_
timer
=
cgcx
.prof
.generic_activity_with_arg
(
"LLVM_fat_lto_patch_debuginfo"
,
&*
module
.name
);
unsafe
{
llvm
::
LLVMRustLTOPatchDICompileUnit
(
llmod
,
cu1
)
};
save_temp_bitcode
(
cgcx
,
&
module
,
"fat-lto-after-patch"
);
}
// Internalize everything below threshold to help strip out more modules and such.
unsafe
{
let
ptr
=
symbols_below_threshold
.as_ptr
();
...
...
@@ -748,7 +762,7 @@ pub unsafe fn optimize_thin_module(
// an error.
let
mut
cu1
=
ptr
::
null_mut
();
let
mut
cu2
=
ptr
::
null_mut
();
llvm
::
LLVMRust
Thin
LTOGetDICompileUnit
(
llmod
,
&
mut
cu1
,
&
mut
cu2
);
llvm
::
LLVMRustLTOGetDICompileUnit
(
llmod
,
&
mut
cu1
,
&
mut
cu2
);
if
!
cu2
.is_null
()
{
let
msg
=
"multiple source DICompileUnits found"
;
return
Err
(
write
::
llvm_err
(
&
diag_handler
,
msg
));
...
...
@@ -847,7 +861,7 @@ pub unsafe fn optimize_thin_module(
let
_
timer
=
cgcx
.prof
.generic_activity_with_arg
(
"LLVM_thin_lto_patch_debuginfo"
,
thin_module
.name
());
llvm
::
LLVMRust
Thin
LTOPatchDICompileUnit
(
llmod
,
cu1
);
llvm
::
LLVMRustLTOPatchDICompileUnit
(
llmod
,
cu1
);
save_temp_bitcode
(
cgcx
,
&
module
,
"thin-lto-after-patch"
);
}
...
...
compiler/rustc_codegen_llvm/src/llvm/ffi.rs
浏览文件 @
d5de680e
...
...
@@ -2377,12 +2377,8 @@ pub fn LLVMRustGetBitcodeSliceFromObjectData(
len
:
usize
,
out_len
:
&
mut
usize
,
)
->
*
const
u8
;
pub
fn
LLVMRustThinLTOGetDICompileUnit
(
M
:
&
Module
,
CU1
:
&
mut
*
mut
c_void
,
CU2
:
&
mut
*
mut
c_void
,
);
pub
fn
LLVMRustThinLTOPatchDICompileUnit
(
M
:
&
Module
,
CU
:
*
mut
c_void
);
pub
fn
LLVMRustLTOGetDICompileUnit
(
M
:
&
Module
,
CU1
:
&
mut
*
mut
c_void
,
CU2
:
&
mut
*
mut
c_void
);
pub
fn
LLVMRustLTOPatchDICompileUnit
(
M
:
&
Module
,
CU
:
*
mut
c_void
);
pub
fn
LLVMRustLinkerNew
(
M
:
&
'a
Module
)
->
&
'a
mut
Linker
<
'a
>
;
pub
fn
LLVMRustLinkerAdd
(
...
...
compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
浏览文件 @
d5de680e
...
...
@@ -1740,7 +1740,7 @@ LLVMRustGetBitcodeSliceFromObjectData(const char *data,
// Rewrite all `DICompileUnit` pointers to the `DICompileUnit` specified. See
// the comment in `back/lto.rs` for why this exists.
extern
"C"
void
LLVMRust
Thin
LTOGetDICompileUnit
(
LLVMModuleRef
Mod
,
LLVMRustLTOGetDICompileUnit
(
LLVMModuleRef
Mod
,
DICompileUnit
**
A
,
DICompileUnit
**
B
)
{
Module
*
M
=
unwrap
(
Mod
);
...
...
@@ -1758,7 +1758,7 @@ LLVMRustThinLTOGetDICompileUnit(LLVMModuleRef Mod,
// Rewrite all `DICompileUnit` pointers to the `DICompileUnit` specified. See
// the comment in `back/lto.rs` for why this exists.
extern
"C"
void
LLVMRust
Thin
LTOPatchDICompileUnit
(
LLVMModuleRef
Mod
,
DICompileUnit
*
Unit
)
{
LLVMRustLTOPatchDICompileUnit
(
LLVMModuleRef
Mod
,
DICompileUnit
*
Unit
)
{
Module
*
M
=
unwrap
(
Mod
);
// If the original source module didn't have a `DICompileUnit` then try to
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录