Skip to content

Commit 7913b85

Browse files
committed
unit tests that inspect LLVM output directly. This relies on a human being to confirm that the
entries actually correspond to what is specified in each of the respective ABIs... updated to incorporate feedback: fix x86_64/i686 tests to use correct name for the corresponding llvm component.
1 parent 5b8cf49 commit 7913b85

File tree

1 file changed

+204
-0
lines changed

1 file changed

+204
-0
lines changed
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
// compile-flags: -Cno-prepopulate-passes
2+
3+
// revisions:x86_64 i686 aarch64-apple aarch64-windows aarch64-linux arm riscv
4+
5+
//[x86_64] compile-flags: --target x86_64-unknown-uefi
6+
//[x86_64] needs-llvm-components: x86
7+
//[i686] compile-flags: --target i686-unknown-linux-musl
8+
//[i686] needs-llvm-components: x86
9+
//[aarch64-windows] compile-flags: --target aarch64-pc-windows-msvc
10+
//[aarch64-windows] needs-llvm-components: aarch64
11+
//[aarch64-linux] compile-flags: --target aarch64-unknown-linux-gnu
12+
//[aarch64-linux] needs-llvm-components: aarch64
13+
//[aarch64-apple] compile-flags: --target aarch64-apple-darwin
14+
//[aarch64-apple] needs-llvm-components: aarch64
15+
//[arm] compile-flags: --target armv7r-none-eabi
16+
//[arm] needs-llvm-components: arm
17+
//[riscv] compile-flags: --target riscv64gc-unknown-none-elf
18+
//[riscv] needs-llvm-components: riscv
19+
20+
// See bottom of file for a corresponding C source file that is meant to yield
21+
// equivalent declarations.
22+
#![feature(no_core, lang_items)]
23+
#![crate_type = "lib"]
24+
#![no_std]
25+
#![no_core]
26+
27+
#[lang="sized"] trait Sized { }
28+
#[lang="freeze"] trait Freeze { }
29+
#[lang="copy"] trait Copy { }
30+
31+
// The patterns in this file are written in the style of a table to make the
32+
// uniformities and distinctions more apparent.
33+
//
34+
// ZERO/SIGN-EXTENDING TO 32 BITS NON-EXTENDING
35+
// ============================== =======================
36+
// x86_64: void @c_arg_u8(i8 zeroext %_a)
37+
// i686: void @c_arg_u8(i8 zeroext %_a)
38+
// aarch64-apple: void @c_arg_u8(i8 zeroext %_a)
39+
// aarch64-windows: void @c_arg_u8(i8 %_a)
40+
// aarch64-linux: void @c_arg_u8(i8 %_a)
41+
// arm: void @c_arg_u8(i8 zeroext %_a)
42+
// riscv: void @c_arg_u8(i8 zeroext %_a)
43+
#[no_mangle] pub extern "C" fn c_arg_u8(_a: u8) { }
44+
45+
// x86_64: void @c_arg_u16(i16 zeroext %_a)
46+
// i686: void @c_arg_u16(i16 zeroext %_a)
47+
// aarch64-apple: void @c_arg_u16(i16 zeroext %_a)
48+
// aarch64-windows: void @c_arg_u16(i16 %_a)
49+
// aarch64-linux: void @c_arg_u16(i16 %_a)
50+
// arm: void @c_arg_u16(i16 zeroext %_a)
51+
// riscv: void @c_arg_u16(i16 zeroext %_a)
52+
#[no_mangle] pub extern "C" fn c_arg_u16(_a: u16) { }
53+
54+
// x86_64: void @c_arg_u32(i32 %_a)
55+
// i686: void @c_arg_u32(i32 %_a)
56+
// aarch64-apple: void @c_arg_u32(i32 %_a)
57+
// aarch64-windows: void @c_arg_u32(i32 %_a)
58+
// aarch64-linux: void @c_arg_u32(i32 %_a)
59+
// arm: void @c_arg_u32(i32 %_a)
60+
// riscv: void @c_arg_u32(i32 signext %_a)
61+
#[no_mangle] pub extern "C" fn c_arg_u32(_a: u32) { }
62+
63+
// x86_64: void @c_arg_u64(i64 %_a)
64+
// i686: void @c_arg_u64(i64 %_a)
65+
// aarch64-apple: void @c_arg_u64(i64 %_a)
66+
// aarch64-windows: void @c_arg_u64(i64 %_a)
67+
// aarch64-linux: void @c_arg_u64(i64 %_a)
68+
// arm: void @c_arg_u64(i64 %_a)
69+
// riscv: void @c_arg_u64(i64 %_a)
70+
#[no_mangle] pub extern "C" fn c_arg_u64(_a: u64) { }
71+
72+
// x86_64: void @c_arg_i8(i8 signext %_a)
73+
// i686: void @c_arg_i8(i8 signext %_a)
74+
// aarch64-apple: void @c_arg_i8(i8 signext %_a)
75+
// aarch64-windows: void @c_arg_i8(i8 %_a)
76+
// aarch64-linux: void @c_arg_i8(i8 %_a)
77+
// arm: void @c_arg_i8(i8 signext %_a)
78+
// riscv: void @c_arg_i8(i8 signext %_a)
79+
#[no_mangle] pub extern "C" fn c_arg_i8(_a: i8) { }
80+
81+
// x86_64: void @c_arg_i16(i16 signext %_a)
82+
// i686: void @c_arg_i16(i16 signext %_a)
83+
// aarch64-apple: void @c_arg_i16(i16 signext %_a)
84+
// aarch64-windows: void @c_arg_i16(i16 %_a)
85+
// aarch64-linux: void @c_arg_i16(i16 %_a)
86+
// arm: void @c_arg_i16(i16 signext %_a)
87+
// riscv: void @c_arg_i16(i16 signext %_a)
88+
#[no_mangle] pub extern "C" fn c_arg_i16(_a: i16) { }
89+
90+
// x86_64: void @c_arg_i32(i32 %_a)
91+
// i686: void @c_arg_i32(i32 %_a)
92+
// aarch64-apple: void @c_arg_i32(i32 %_a)
93+
// aarch64-windows: void @c_arg_i32(i32 %_a)
94+
// aarch64-linux: void @c_arg_i32(i32 %_a)
95+
// arm: void @c_arg_i32(i32 %_a)
96+
// riscv: void @c_arg_i32(i32 signext %_a)
97+
#[no_mangle] pub extern "C" fn c_arg_i32(_a: i32) { }
98+
99+
// x86_64: void @c_arg_i64(i64 %_a)
100+
// i686: void @c_arg_i64(i64 %_a)
101+
// aarch64-apple: void @c_arg_i64(i64 %_a)
102+
// aarch64-windows: void @c_arg_i64(i64 %_a)
103+
// aarch64-linux: void @c_arg_i64(i64 %_a)
104+
// arm: void @c_arg_i64(i64 %_a)
105+
// riscv: void @c_arg_i64(i64 %_a)
106+
#[no_mangle] pub extern "C" fn c_arg_i64(_a: i64) { }
107+
108+
// x86_64: zeroext i8 @c_ret_u8()
109+
// i686: zeroext i8 @c_ret_u8()
110+
// aarch64-apple: zeroext i8 @c_ret_u8()
111+
// aarch64-windows: i8 @c_ret_u8()
112+
// aarch64-linux: i8 @c_ret_u8()
113+
// arm: zeroext i8 @c_ret_u8()
114+
// riscv: zeroext i8 @c_ret_u8()
115+
#[no_mangle] pub extern "C" fn c_ret_u8() -> u8 { 0 }
116+
117+
// x86_64: zeroext i16 @c_ret_u16()
118+
// i686: zeroext i16 @c_ret_u16()
119+
// aarch64-apple: zeroext i16 @c_ret_u16()
120+
// aarch64-windows: i16 @c_ret_u16()
121+
// aarch64-linux: i16 @c_ret_u16()
122+
// arm: zeroext i16 @c_ret_u16()
123+
// riscv: zeroext i16 @c_ret_u16()
124+
#[no_mangle] pub extern "C" fn c_ret_u16() -> u16 { 0 }
125+
126+
// x86_64: i32 @c_ret_u32()
127+
// i686: i32 @c_ret_u32()
128+
// aarch64-apple: i32 @c_ret_u32()
129+
// aarch64-windows: i32 @c_ret_u32()
130+
// aarch64-linux: i32 @c_ret_u32()
131+
// arm: i32 @c_ret_u32()
132+
// riscv: signext i32 @c_ret_u32()
133+
#[no_mangle] pub extern "C" fn c_ret_u32() -> u32 { 0 }
134+
135+
// x86_64: i64 @c_ret_u64()
136+
// i686: i64 @c_ret_u64()
137+
// aarch64-apple: i64 @c_ret_u64()
138+
// aarch64-windows: i64 @c_ret_u64()
139+
// aarch64-linux: i64 @c_ret_u64()
140+
// arm: i64 @c_ret_u64()
141+
// riscv: i64 @c_ret_u64()
142+
#[no_mangle] pub extern "C" fn c_ret_u64() -> u64 { 0 }
143+
144+
// x86_64: signext i8 @c_ret_i8()
145+
// i686: signext i8 @c_ret_i8()
146+
// aarch64-apple: signext i8 @c_ret_i8()
147+
// aarch64-windows: i8 @c_ret_i8()
148+
// aarch64-linux: i8 @c_ret_i8()
149+
// arm: signext i8 @c_ret_i8()
150+
// riscv: signext i8 @c_ret_i8()
151+
#[no_mangle] pub extern "C" fn c_ret_i8() -> i8 { 0 }
152+
153+
// x86_64: signext i16 @c_ret_i16()
154+
// i686: signext i16 @c_ret_i16()
155+
// aarch64-apple: signext i16 @c_ret_i16()
156+
// aarch64-windows: i16 @c_ret_i16()
157+
// aarch64-linux: i16 @c_ret_i16()
158+
// arm: signext i16 @c_ret_i16()
159+
// riscv: signext i16 @c_ret_i16()
160+
#[no_mangle] pub extern "C" fn c_ret_i16() -> i16 { 0 }
161+
162+
// x86_64: i32 @c_ret_i32()
163+
// i686: i32 @c_ret_i32()
164+
// aarch64-apple: i32 @c_ret_i32()
165+
// aarch64-windows: i32 @c_ret_i32()
166+
// aarch64-linux: i32 @c_ret_i32()
167+
// arm: i32 @c_ret_i32()
168+
// riscv: signext i32 @c_ret_i32()
169+
#[no_mangle] pub extern "C" fn c_ret_i32() -> i32 { 0 }
170+
171+
// x86_64: i64 @c_ret_i64()
172+
// i686: i64 @c_ret_i64()
173+
// aarch64-apple: i64 @c_ret_i64()
174+
// aarch64-windows: i64 @c_ret_i64()
175+
// aarch64-linux: i64 @c_ret_i64()
176+
// arm: i64 @c_ret_i64()
177+
// riscv: i64 @c_ret_i64()
178+
#[no_mangle] pub extern "C" fn c_ret_i64() -> i64 { 0 }
179+
180+
const C_SOURCE_FILE: &'static str = r##"
181+
#include <stdlib.h>
182+
#include <stdint.h>
183+
#include <stdio.h>
184+
185+
void c_arg_u8(uint8_t _a) { }
186+
void c_arg_u16(uint16_t _a) { }
187+
void c_arg_u32(uint32_t _a) { }
188+
void c_arg_u64(uint64_t _a) { }
189+
190+
void c_arg_i8(int8_t _a) { }
191+
void c_arg_i16(int16_t _a) { }
192+
void c_arg_i32(int32_t _a) { }
193+
void c_arg_i64(int64_t _a) { }
194+
195+
uint8_t c_ret_u8() { return 0; }
196+
uint16_t c_ret_u16() { return 0; }
197+
uint32_t c_ret_u32() { return 0; }
198+
uint64_t c_ret_u64() { return 0; }
199+
200+
int8_t c_ret_i8() { return 0; }
201+
int16_t c_ret_i16() { return 0; }
202+
int32_t c_ret_i32() { return 0; }
203+
int64_t c_ret_i64() { return 0; }
204+
"##;

0 commit comments

Comments
 (0)