Skip to content

Commit d6a1341

Browse files
authored
Gate atomic intrinsics on presence of instructions (#324)
Don't emit the intrinsics for platforms which don't actually have the instructions to do atomic loads/stores. Closes #322
1 parent 40ef6cb commit d6a1341

File tree

2 files changed

+16
-0
lines changed

2 files changed

+16
-0
lines changed

src/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#![cfg_attr(feature = "compiler-builtins", compiler_builtins)]
22
#![feature(abi_unadjusted)]
33
#![feature(asm)]
4+
#![feature(cfg_target_has_atomic)]
45
#![feature(compiler_builtins)]
56
#![feature(core_intrinsics)]
67
#![feature(lang_items)]

src/mem.rs

+15
Original file line numberDiff line numberDiff line change
@@ -129,50 +129,65 @@ where
129129
}
130130

131131
intrinsics! {
132+
#[cfg(target_has_atomic_load_store = "8")]
132133
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_1(dest: *mut u8, src: *const u8, bytes: usize) -> () {
133134
memcpy_element_unordered_atomic(dest, src, bytes);
134135
}
136+
#[cfg(target_has_atomic_load_store = "16")]
135137
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_2(dest: *mut u16, src: *const u16, bytes: usize) -> () {
136138
memcpy_element_unordered_atomic(dest, src, bytes);
137139
}
140+
#[cfg(target_has_atomic_load_store = "32")]
138141
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_4(dest: *mut u32, src: *const u32, bytes: usize) -> () {
139142
memcpy_element_unordered_atomic(dest, src, bytes);
140143
}
144+
#[cfg(target_has_atomic_load_store = "64")]
141145
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
142146
memcpy_element_unordered_atomic(dest, src, bytes);
143147
}
148+
#[cfg(target_has_atomic_load_store = "128")]
144149
pub extern "C" fn __llvm_memcpy_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
145150
memcpy_element_unordered_atomic(dest, src, bytes);
146151
}
147152

153+
#[cfg(target_has_atomic_load_store = "8")]
148154
pub extern "C" fn __llvm_memmove_element_unordered_atomic_1(dest: *mut u8, src: *const u8, bytes: usize) -> () {
149155
memmove_element_unordered_atomic(dest, src, bytes);
150156
}
157+
#[cfg(target_has_atomic_load_store = "16")]
151158
pub extern "C" fn __llvm_memmove_element_unordered_atomic_2(dest: *mut u16, src: *const u16, bytes: usize) -> () {
152159
memmove_element_unordered_atomic(dest, src, bytes);
153160
}
161+
#[cfg(target_has_atomic_load_store = "32")]
154162
pub extern "C" fn __llvm_memmove_element_unordered_atomic_4(dest: *mut u32, src: *const u32, bytes: usize) -> () {
155163
memmove_element_unordered_atomic(dest, src, bytes);
156164
}
165+
#[cfg(target_has_atomic_load_store = "64")]
157166
pub extern "C" fn __llvm_memmove_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () {
158167
memmove_element_unordered_atomic(dest, src, bytes);
159168
}
169+
#[cfg(target_has_atomic_load_store = "128")]
160170
pub extern "C" fn __llvm_memmove_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () {
161171
memmove_element_unordered_atomic(dest, src, bytes);
162172
}
163173

174+
#[cfg(target_has_atomic_load_store = "8")]
164175
pub extern "C" fn __llvm_memset_element_unordered_atomic_1(s: *mut u8, c: u8, bytes: usize) -> () {
165176
memset_element_unordered_atomic(s, c, bytes);
166177
}
178+
#[cfg(target_has_atomic_load_store = "16")]
167179
pub extern "C" fn __llvm_memset_element_unordered_atomic_2(s: *mut u16, c: u8, bytes: usize) -> () {
168180
memset_element_unordered_atomic(s, c, bytes);
169181
}
182+
#[cfg(target_has_atomic_load_store = "32")]
170183
pub extern "C" fn __llvm_memset_element_unordered_atomic_4(s: *mut u32, c: u8, bytes: usize) -> () {
171184
memset_element_unordered_atomic(s, c, bytes);
172185
}
186+
#[cfg(target_has_atomic_load_store = "64")]
173187
pub extern "C" fn __llvm_memset_element_unordered_atomic_8(s: *mut u64, c: u8, bytes: usize) -> () {
174188
memset_element_unordered_atomic(s, c, bytes);
175189
}
190+
#[cfg(target_has_atomic_load_store = "128")]
176191
pub extern "C" fn __llvm_memset_element_unordered_atomic_16(s: *mut u128, c: u8, bytes: usize) -> () {
177192
memset_element_unordered_atomic(s, c, bytes);
178193
}

0 commit comments

Comments
 (0)