Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
12ff05fc
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,发现更多精彩内容 >>
提交
12ff05fc
编写于
9月 24, 2016
作者:
A
Austin Hicks
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Clean up matches that determine integers for specific alignment requirements
上级
40381896
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
31 addition
and
23 deletion
+31
-23
src/librustc/ty/layout.rs
src/librustc/ty/layout.rs
+23
-14
src/librustc_trans/adt.rs
src/librustc_trans/adt.rs
+8
-9
未找到文件。
src/librustc/ty/layout.rs
浏览文件 @
12ff05fc
...
...
@@ -339,6 +339,16 @@ pub fn size(&self) -> Size {
}
}
pub
fn
align
(
&
self
,
dl
:
&
TargetDataLayout
)
->
Align
{
match
*
self
{
I1
=>
dl
.i1_align
,
I8
=>
dl
.i8_align
,
I16
=>
dl
.i16_align
,
I32
=>
dl
.i32_align
,
I64
=>
dl
.i64_align
,
}
}
pub
fn
to_ty
<
'a
,
'tcx
>
(
&
self
,
tcx
:
&
ty
::
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
signed
:
bool
)
->
Ty
<
'tcx
>
{
match
(
*
self
,
signed
)
{
...
...
@@ -377,6 +387,18 @@ pub fn fit_unsigned(x: u64) -> Integer {
}
}
//Find the smallest integer with the given alignment.
pub
fn
for_abi_align
(
dl
:
&
TargetDataLayout
,
align
:
Align
)
->
Option
<
Integer
>
{
let
wanted
=
align
.abi
();
for
&
candidate
in
&
[
I8
,
I16
,
I32
,
I64
]
{
let
ty
=
Int
(
candidate
);
if
wanted
==
ty
.align
(
dl
)
.abi
()
&&
wanted
==
ty
.size
(
dl
)
.bytes
()
{
return
Some
(
candidate
);
}
}
None
}
/// Get the Integer type from an attr::IntType.
pub
fn
from_attr
(
dl
:
&
TargetDataLayout
,
ity
:
attr
::
IntType
)
->
Integer
{
match
ity
{
...
...
@@ -1149,20 +1171,7 @@ pub fn compute_uncached(ty: Ty<'gcx>,
// won't be so conservative.
// Use the initial field alignment
let
wanted
=
start_align
.abi
();
let
mut
ity
=
min_ity
;
for
&
candidate
in
&
[
I16
,
I32
,
I64
]
{
let
ty
=
Int
(
candidate
);
if
wanted
==
ty
.align
(
dl
)
.abi
()
&&
wanted
==
ty
.size
(
dl
)
.bytes
()
{
ity
=
candidate
;
break
;
}
}
// FIXME(eddyb) conservative only to avoid diverging from trans::adt.
if
align
.abi
()
!=
start_align
.abi
()
{
ity
=
min_ity
;
}
let
mut
ity
=
Integer
::
for_abi_align
(
dl
,
start_align
)
.unwrap_or
(
min_ity
);
// If the alignment is not larger than the chosen discriminant size,
// don't use the alignment as the final size.
...
...
src/librustc_trans/adt.rs
浏览文件 @
12ff05fc
...
...
@@ -286,16 +286,15 @@ fn generic_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
fn
union_fill
(
cx
:
&
CrateContext
,
size
:
u64
,
align
:
u64
)
->
Type
{
assert_eq!
(
size
%
align
,
0
);
assert_eq!
(
align
.count_ones
(),
1
,
"Alignment must be a power fof 2. Got {}"
,
align
);
let
align_units
=
size
/
align
;
match
align
{
1
=>
Type
::
array
(
&
Type
::
i8
(
cx
),
align_units
),
2
=>
Type
::
array
(
&
Type
::
i16
(
cx
),
align_units
),
4
=>
Type
::
array
(
&
Type
::
i32
(
cx
),
align_units
),
8
if
machine
::
llalign_of_min
(
cx
,
Type
::
i64
(
cx
))
==
8
=>
Type
::
array
(
&
Type
::
i64
(
cx
),
align_units
),
a
if
a
.count_ones
()
==
1
=>
Type
::
array
(
&
Type
::
vector
(
&
Type
::
i32
(
cx
),
a
/
4
),
align_units
),
_
=>
bug!
(
"unsupported union alignment: {}"
,
align
)
let
dl
=
&
cx
.tcx
()
.data_layout
;
let
layout_align
=
layout
::
Align
::
from_bytes
(
align
,
align
)
.unwrap
();
if
let
Some
(
ity
)
=
layout
::
Integer
::
for_abi_align
(
dl
,
layout_align
)
{
Type
::
array
(
&
Type
::
from_integer
(
cx
,
ity
),
align_units
)
}
else
{
Type
::
array
(
&
Type
::
vector
(
&
Type
::
i32
(
cx
),
align
/
4
),
align_units
)
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录