Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
b6998662
R
Rust
项目概览
int
/
Rust
11 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
b6998662
编写于
8月 21, 2018
作者:
D
Denis Merigoux
提交者:
Eduard-Mihai Burtescu
11月 16, 2018
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Generalized AtomicOrdering for BuilderMethods
上级
27558915
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
69 addition
and
14 deletion
+69
-14
src/librustc_codegen_llvm/builder.rs
src/librustc_codegen_llvm/builder.rs
+38
-12
src/librustc_codegen_llvm/intrinsic.rs
src/librustc_codegen_llvm/intrinsic.rs
+1
-1
src/librustc_codegen_llvm/llvm/ffi.rs
src/librustc_codegen_llvm/llvm/ffi.rs
+16
-0
src/librustc_codegen_llvm/traits.rs
src/librustc_codegen_llvm/traits.rs
+14
-1
未找到文件。
src/librustc_codegen_llvm/builder.rs
浏览文件 @
b6998662
...
...
@@ -488,10 +488,20 @@ fn volatile_load(&self, ptr: &'ll Value) -> &'ll Value {
}
}
fn
atomic_load
(
&
self
,
ptr
:
&
'll
Value
,
order
:
AtomicOrdering
,
size
:
Size
)
->
&
'll
Value
{
fn
atomic_load
(
&
self
,
ptr
:
&
'll
Value
,
order
:
traits
::
AtomicOrdering
,
size
:
Size
,
)
->
&
'll
Value
{
self
.count_insn
(
"load.atomic"
);
unsafe
{
let
load
=
llvm
::
LLVMRustBuildAtomicLoad
(
self
.llbuilder
,
ptr
,
noname
(),
order
);
let
load
=
llvm
::
LLVMRustBuildAtomicLoad
(
self
.llbuilder
,
ptr
,
noname
(),
AtomicOrdering
::
from_generic
(
order
),
);
// LLVM requires the alignment of atomic loads to be at least the size of the type.
llvm
::
LLVMSetAlignment
(
load
,
size
.bytes
()
as
c_uint
);
load
...
...
@@ -568,12 +578,17 @@ fn store_with_flags(
}
fn
atomic_store
(
&
self
,
val
:
&
'll
Value
,
ptr
:
&
'll
Value
,
order
:
AtomicOrdering
,
size
:
Size
)
{
order
:
traits
::
AtomicOrdering
,
size
:
Size
)
{
debug!
(
"Store {:?} -> {:?}"
,
val
,
ptr
);
self
.count_insn
(
"store.atomic"
);
let
ptr
=
self
.check_store
(
val
,
ptr
);
unsafe
{
let
store
=
llvm
::
LLVMRustBuildAtomicStore
(
self
.llbuilder
,
val
,
ptr
,
order
);
let
store
=
llvm
::
LLVMRustBuildAtomicStore
(
self
.llbuilder
,
val
,
ptr
,
AtomicOrdering
::
from_generic
(
order
),
);
// LLVM requires the alignment of atomic stores to be at least the size of the type.
llvm
::
LLVMSetAlignment
(
store
,
size
.bytes
()
as
c_uint
);
}
...
...
@@ -1047,14 +1062,21 @@ fn atomic_cmpxchg(
dst
:
&
'll
Value
,
cmp
:
&
'll
Value
,
src
:
&
'll
Value
,
order
:
AtomicOrdering
,
failure_order
:
AtomicOrdering
,
order
:
traits
::
AtomicOrdering
,
failure_order
:
traits
::
AtomicOrdering
,
weak
:
bool
,
)
->
&
'll
Value
{
let
weak
=
if
weak
{
llvm
::
True
}
else
{
llvm
::
False
};
unsafe
{
llvm
::
LLVMRustBuildAtomicCmpXchg
(
self
.llbuilder
,
dst
,
cmp
,
src
,
order
,
failure_order
,
weak
)
llvm
::
LLVMRustBuildAtomicCmpXchg
(
self
.llbuilder
,
dst
,
cmp
,
src
,
AtomicOrdering
::
from_generic
(
order
),
AtomicOrdering
::
from_generic
(
failure_order
),
weak
)
}
}
fn
atomic_rmw
(
...
...
@@ -1062,7 +1084,7 @@ fn atomic_rmw(
op
:
traits
::
AtomicRmwBinOp
,
dst
:
&
'll
Value
,
src
:
&
'll
Value
,
order
:
AtomicOrdering
,
order
:
traits
::
AtomicOrdering
,
)
->
&
'll
Value
{
unsafe
{
llvm
::
LLVMBuildAtomicRMW
(
...
...
@@ -1070,14 +1092,18 @@ fn atomic_rmw(
AtomicRmwBinOp
::
from_generic
(
op
),
dst
,
src
,
order
,
AtomicOrdering
::
from_generic
(
order
)
,
False
)
}
}
fn
atomic_fence
(
&
self
,
order
:
AtomicOrdering
,
scope
:
SynchronizationScope
)
{
fn
atomic_fence
(
&
self
,
order
:
traits
::
AtomicOrdering
,
scope
:
SynchronizationScope
)
{
unsafe
{
llvm
::
LLVMRustBuildAtomicFence
(
self
.llbuilder
,
order
,
scope
);
llvm
::
LLVMRustBuildAtomicFence
(
self
.llbuilder
,
AtomicOrdering
::
from_generic
(
order
),
scope
);
}
}
...
...
src/librustc_codegen_llvm/intrinsic.rs
浏览文件 @
b6998662
...
...
@@ -439,7 +439,7 @@ pub fn codegen_intrinsic_call(
// This requires that atomic intrinsics follow a specific naming pattern:
// "atomic_<operation>[_<ordering>]", and no ordering means SeqCst
name
if
name
.starts_with
(
"atomic_"
)
=>
{
use
llvm
::
AtomicOrdering
::
*
;
use
traits
::
AtomicOrdering
::
*
;
let
split
:
Vec
<&
str
>
=
name
.split
(
'_'
)
.collect
();
...
...
src/librustc_codegen_llvm/llvm/ffi.rs
浏览文件 @
b6998662
...
...
@@ -277,6 +277,22 @@ pub enum AtomicOrdering {
SequentiallyConsistent
=
7
,
}
impl
AtomicOrdering
{
pub
fn
from_generic
(
ao
:
traits
::
AtomicOrdering
)
->
Self
{
match
ao
{
traits
::
AtomicOrdering
::
NotAtomic
=>
AtomicOrdering
::
NotAtomic
,
traits
::
AtomicOrdering
::
Unordered
=>
AtomicOrdering
::
Unordered
,
traits
::
AtomicOrdering
::
Monotonic
=>
AtomicOrdering
::
Monotonic
,
traits
::
AtomicOrdering
::
Acquire
=>
AtomicOrdering
::
Acquire
,
traits
::
AtomicOrdering
::
Release
=>
AtomicOrdering
::
Release
,
traits
::
AtomicOrdering
::
AcquireRelease
=>
AtomicOrdering
::
AcquireRelease
,
traits
::
AtomicOrdering
::
SequentiallyConsistent
=>
AtomicOrdering
::
SequentiallyConsistent
}
}
}
/// LLVMRustSynchronizationScope
#[derive(Copy,
Clone)]
#[repr(C)]
...
...
src/librustc_codegen_llvm/traits.rs
浏览文件 @
b6998662
...
...
@@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
use
llvm
::{
AtomicOrdering
,
SynchronizationScope
,
AsmDialect
};
use
llvm
::{
SynchronizationScope
,
AsmDialect
};
use
common
::
*
;
use
type_
::
Type
;
use
libc
::
c_char
;
...
...
@@ -82,6 +82,19 @@ pub enum AtomicRmwBinOp {
AtomicUMin
}
pub
enum
AtomicOrdering
{
#[allow(dead_code)]
NotAtomic
,
Unordered
,
Monotonic
,
// Consume, // Not specified yet.
Acquire
,
Release
,
AcquireRelease
,
SequentiallyConsistent
,
}
pub
trait
BuilderMethods
<
'a
,
'll
:
'a
,
'tcx
:
'll
,
Value
:
?
Sized
,
BasicBlock
:
?
Sized
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录