Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
97e41435
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,发现更多精彩内容 >>
提交
97e41435
编写于
10月 12, 2016
作者:
F
Felix S. Klock II
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix ICE by injecting bitcasts if types mismatch when building invokes or calls.
上级
a29c49f5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
32 addition
and
17 deletion
+32
-17
src/librustc_trans/builder.rs
src/librustc_trans/builder.rs
+32
-17
未找到文件。
src/librustc_trans/builder.rs
浏览文件 @
97e41435
...
...
@@ -22,6 +22,7 @@
use
util
::
nodemap
::
FnvHashMap
;
use
libc
::{
c_uint
,
c_char
};
use
std
::
borrow
::
Cow
;
use
std
::
ffi
::
CString
;
use
std
::
ptr
;
use
syntax_pos
::
Span
;
...
...
@@ -175,8 +176,7 @@ pub fn invoke(&self,
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
));
check_call
(
"invoke"
,
llfn
,
args
);
let
args
=
self
.check_call
(
"invoke"
,
llfn
,
args
);
let
bundle
=
bundle
.as_ref
()
.map
(|
b
|
b
.raw
())
.unwrap_or
(
ptr
::
null_mut
());
unsafe
{
...
...
@@ -857,8 +857,7 @@ pub fn call(&self, llfn: ValueRef, args: &[ValueRef],
.collect
::
<
Vec
<
String
>>
()
.join
(
", "
));
check_call
(
"call"
,
llfn
,
args
);
let
args
=
self
.check_call
(
"call"
,
llfn
,
args
);
let
bundle
=
bundle
.as_ref
()
.map
(|
b
|
b
.raw
())
.unwrap_or
(
ptr
::
null_mut
());
unsafe
{
...
...
@@ -1100,10 +1099,11 @@ pub fn atomic_fence(&self, order: AtomicOrdering, scope: SynchronizationScope) {
llvm
::
LLVMRustBuildAtomicFence
(
self
.llbuilder
,
order
,
scope
);
}
}
}
fn
check_call
(
typ
:
&
str
,
llfn
:
ValueRef
,
args
:
&
[
ValueRef
])
{
if
cfg!
(
debug_assertions
)
{
fn
check_call
<
'b
>
(
&
self
,
typ
:
&
str
,
llfn
:
ValueRef
,
args
:
&
'b
[
ValueRef
])
->
Cow
<
'b
,
[
ValueRef
]
>
{
let
mut
fn_ty
=
val_ty
(
llfn
);
// Strip off pointers
while
fn_ty
.kind
()
==
llvm
::
TypeKind
::
Pointer
{
...
...
@@ -1115,16 +1115,31 @@ fn check_call(typ: &str, llfn: ValueRef, args: &[ValueRef]) {
let
param_tys
=
fn_ty
.func_params
();
let
iter
=
param_tys
.into_iter
()
.zip
(
args
.iter
()
.map
(|
&
v
|
val_ty
(
v
)));
for
(
i
,
(
expected_ty
,
actual_ty
))
in
iter
.enumerate
()
{
if
expected_ty
!=
actual_ty
{
bug!
(
"Type mismatch in function call of {:?}.
\
Expected {:?} for param {}, got {:?}"
,
Value
(
llfn
),
expected_ty
,
i
,
actual_ty
);
let
all_args_match
=
param_tys
.iter
()
.zip
(
args
.iter
()
.map
(|
&
v
|
val_ty
(
v
)))
.all
(|(
expected_ty
,
actual_ty
)|
*
expected_ty
==
actual_ty
);
if
all_args_match
{
return
Cow
::
Borrowed
(
args
);
}
let
casted_args
:
Vec
<
_
>
=
param_tys
.into_iter
()
.zip
(
args
.iter
())
.enumerate
()
.map
(|(
i
,
(
expected_ty
,
&
actual_val
))|
{
let
actual_ty
=
val_ty
(
actual_val
);
if
expected_ty
!=
actual_ty
{
debug!
(
"Type mismatch in function call of {:?}.
\
Expected {:?} for param {}, got {:?}; injecting bitcast"
,
Value
(
llfn
),
expected_ty
,
i
,
actual_ty
);
self
.bitcast
(
actual_val
,
expected_ty
)
}
else
{
actual_val
}
})
.collect
();
}
}
return
Cow
::
Owned
(
casted_args
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录