Skip to content

Commit f4208ee

Browse files
jhprattgitbot
authored and
gitbot
committed
Rollup merge of rust-lang#136334 - ricci009:primitivers, r=tgross35
Extract `core::ffi` primitives to a separate (internal) module ### Introduce library/core/src/ffi/primitives.rs The regex preprocessing for PR rust-lang#133944 would be more robust if the relevant types from core/src/ffi/mod.rs were first moved to library/core/src/ffi/primitives.rs, then there isn't a need to deal with traits / c_str / va_list / whatever might wind up in that module in the future r? `@tgross35`
2 parents 1aa43ba + cbcd042 commit f4208ee

File tree

2 files changed

+181
-168
lines changed

2 files changed

+181
-168
lines changed

core/src/ffi/mod.rs

+7-168
Original file line numberDiff line numberDiff line change
@@ -37,175 +37,14 @@ pub use self::va_list::{VaList, VaListImpl};
3737
)]
3838
pub mod va_list;
3939

40-
macro_rules! type_alias {
41-
{
42-
$Docfile:tt, $Alias:ident = $Real:ty;
43-
$( $Cfg:tt )*
44-
} => {
45-
#[doc = include_str!($Docfile)]
46-
$( $Cfg )*
47-
#[stable(feature = "core_ffi_c", since = "1.64.0")]
48-
pub type $Alias = $Real;
49-
}
50-
}
51-
52-
type_alias! { "c_char.md", c_char = c_char_definition::c_char; #[doc(cfg(all()))] }
53-
54-
type_alias! { "c_schar.md", c_schar = i8; }
55-
type_alias! { "c_uchar.md", c_uchar = u8; }
56-
type_alias! { "c_short.md", c_short = i16; }
57-
type_alias! { "c_ushort.md", c_ushort = u16; }
58-
59-
type_alias! { "c_int.md", c_int = c_int_definition::c_int; #[doc(cfg(all()))] }
60-
type_alias! { "c_uint.md", c_uint = c_int_definition::c_uint; #[doc(cfg(all()))] }
61-
62-
type_alias! { "c_long.md", c_long = c_long_definition::c_long; #[doc(cfg(all()))] }
63-
type_alias! { "c_ulong.md", c_ulong = c_long_definition::c_ulong; #[doc(cfg(all()))] }
64-
65-
type_alias! { "c_longlong.md", c_longlong = i64; }
66-
type_alias! { "c_ulonglong.md", c_ulonglong = u64; }
67-
68-
type_alias! { "c_float.md", c_float = f32; }
69-
type_alias! { "c_double.md", c_double = f64; }
70-
71-
/// Equivalent to C's `size_t` type, from `stddef.h` (or `cstddef` for C++).
72-
///
73-
/// This type is currently always [`usize`], however in the future there may be
74-
/// platforms where this is not the case.
75-
#[unstable(feature = "c_size_t", issue = "88345")]
76-
pub type c_size_t = usize;
77-
78-
/// Equivalent to C's `ptrdiff_t` type, from `stddef.h` (or `cstddef` for C++).
79-
///
80-
/// This type is currently always [`isize`], however in the future there may be
81-
/// platforms where this is not the case.
40+
mod primitives;
41+
#[stable(feature = "core_ffi_c", since = "1.64.0")]
42+
pub use self::primitives::{
43+
c_char, c_double, c_float, c_int, c_long, c_longlong, c_schar, c_short, c_uchar, c_uint,
44+
c_ulong, c_ulonglong, c_ushort,
45+
};
8246
#[unstable(feature = "c_size_t", issue = "88345")]
83-
pub type c_ptrdiff_t = isize;
84-
85-
/// Equivalent to C's `ssize_t` (on POSIX) or `SSIZE_T` (on Windows) type.
86-
///
87-
/// This type is currently always [`isize`], however in the future there may be
88-
/// platforms where this is not the case.
89-
#[unstable(feature = "c_size_t", issue = "88345")]
90-
pub type c_ssize_t = isize;
91-
92-
mod c_char_definition {
93-
cfg_if! {
94-
// These are the targets on which c_char is unsigned. Usually the
95-
// signedness is the same for all target_os values on a given architecture
96-
// but there are some exceptions (see isSignedCharDefault() in clang).
97-
//
98-
// aarch64:
99-
// Section 10 "Arm C and C++ language mappings" in Procedure Call Standard for the Arm®
100-
// 64-bit Architecture (AArch64) says C/C++ char is unsigned byte.
101-
// https://github.com/ARM-software/abi-aa/blob/2024Q3/aapcs64/aapcs64.rst#arm-c-and-c-language-mappings
102-
// arm:
103-
// Section 8 "Arm C and C++ Language Mappings" in Procedure Call Standard for the Arm®
104-
// Architecture says C/C++ char is unsigned byte.
105-
// https://github.com/ARM-software/abi-aa/blob/2024Q3/aapcs32/aapcs32.rst#arm-c-and-c-language-mappings
106-
// csky:
107-
// Section 2.1.2 "Primary Data Type" in C-SKY V2 CPU Applications Binary Interface
108-
// Standards Manual says ANSI C char is unsigned byte.
109-
// https://github.com/c-sky/csky-doc/blob/9f7121f7d40970ba5cc0f15716da033db2bb9d07/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf
110-
// Note: this doesn't seem to match Clang's default (https://github.com/rust-lang/rust/issues/129945).
111-
// hexagon:
112-
// Section 3.1 "Basic data type" in Qualcomm Hexagon™ Application
113-
// Binary Interface User Guide says "By default, the `char` data type is unsigned."
114-
// https://docs.qualcomm.com/bundle/publicresource/80-N2040-23_REV_K_Qualcomm_Hexagon_Application_Binary_Interface_User_Guide.pdf
115-
// msp430:
116-
// Section 2.1 "Basic Types" in MSP430 Embedded Application Binary
117-
// Interface says "The char type is unsigned by default".
118-
// https://www.ti.com/lit/an/slaa534a/slaa534a.pdf
119-
// powerpc/powerpc64:
120-
// - PPC32 SysV: "Table 3-1 Scalar Types" in System V Application Binary Interface PowerPC
121-
// Processor Supplement says ANSI C char is unsigned byte
122-
// https://refspecs.linuxfoundation.org/elf/elfspec_ppc.pdf
123-
// - PPC64 ELFv1: Section 3.1.4 "Fundamental Types" in 64-bit PowerPC ELF Application
124-
// Binary Interface Supplement 1.9 says ANSI C is unsigned byte
125-
// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUND-TYPE
126-
// - PPC64 ELFv2: Section 2.1.2.2 "Fundamental Types" in 64-Bit ELF V2 ABI Specification
127-
// says char is unsigned byte
128-
// https://openpowerfoundation.org/specifications/64bitelfabi/
129-
// - AIX: XL C for AIX Language Reference says "By default, char behaves like an unsigned char."
130-
// https://www.ibm.com/docs/en/xl-c-aix/13.1.3?topic=specifiers-character-types
131-
// riscv32/riscv64:
132-
// C/C++ type representations section in RISC-V Calling Conventions
133-
// page in RISC-V ELF psABI Document says "char is unsigned."
134-
// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/draft-20240829-13bfa9f54634cb60d86b9b333e109f077805b4b3/riscv-cc.adoc#cc-type-representations
135-
// s390x:
136-
// - ELF: "Table 1.1.: Scalar types" in ELF Application Binary Interface s390x Supplement
137-
// Version 1.6.1 categorize ISO C char in unsigned integer
138-
// https://github.com/IBM/s390x-abi/releases/tag/v1.6.1
139-
// - z/OS: XL C/C++ Language Reference says: "By default, char behaves like an unsigned char."
140-
// https://www.ibm.com/docs/en/zos/3.1.0?topic=specifiers-character-types
141-
// xtensa:
142-
// Section 2.17.1 "Data Types and Alignment" of Xtensa LX Microprocessor Overview handbook
143-
// says "`char` type is unsigned by default".
144-
// https://loboris.eu/ESP32/Xtensa_lx%20Overview%20handbook.pdf
145-
//
146-
// On the following operating systems, c_char is signed by default, regardless of architecture.
147-
// Darwin (macOS, iOS, etc.):
148-
// Apple targets' c_char is signed by default even on arm
149-
// https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Handle-data-types-and-data-alignment-properly
150-
// Windows:
151-
// Windows MSVC C++ Language Reference says "Microsoft-specific: Variables of type char
152-
// are promoted to int as if from type signed char by default, unless the /J compilation
153-
// option is used."
154-
// https://learn.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=msvc-170#character-types
155-
// L4Re:
156-
// The kernel builds with -funsigned-char on all targets (but useserspace follows the
157-
// architecture defaults). As we only have a target for userspace apps so there are no
158-
// special cases for L4Re below.
159-
// https://github.com/rust-lang/rust/pull/132975#issuecomment-2484645240
160-
if #[cfg(all(
161-
not(windows),
162-
not(target_vendor = "apple"),
163-
any(
164-
target_arch = "aarch64",
165-
target_arch = "arm",
166-
target_arch = "csky",
167-
target_arch = "hexagon",
168-
target_arch = "msp430",
169-
target_arch = "powerpc",
170-
target_arch = "powerpc64",
171-
target_arch = "riscv32",
172-
target_arch = "riscv64",
173-
target_arch = "s390x",
174-
target_arch = "xtensa",
175-
)
176-
))] {
177-
pub(super) type c_char = u8;
178-
} else {
179-
// On every other target, c_char is signed.
180-
pub(super) type c_char = i8;
181-
}
182-
}
183-
}
184-
185-
mod c_int_definition {
186-
cfg_if! {
187-
if #[cfg(any(target_arch = "avr", target_arch = "msp430"))] {
188-
pub(super) type c_int = i16;
189-
pub(super) type c_uint = u16;
190-
} else {
191-
pub(super) type c_int = i32;
192-
pub(super) type c_uint = u32;
193-
}
194-
}
195-
}
196-
197-
mod c_long_definition {
198-
cfg_if! {
199-
if #[cfg(all(target_pointer_width = "64", not(windows)))] {
200-
pub(super) type c_long = i64;
201-
pub(super) type c_ulong = u64;
202-
} else {
203-
// The minimal size of `long` in the C standard is 32 bits
204-
pub(super) type c_long = i32;
205-
pub(super) type c_ulong = u32;
206-
}
207-
}
208-
}
47+
pub use self::primitives::{c_ptrdiff_t, c_size_t, c_ssize_t};
20948

21049
// N.B., for LLVM to recognize the void pointer type and by extension
21150
// functions like malloc(), we need to have it represented as i8* in

core/src/ffi/primitives.rs

+174
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
//! Defines primitive types that match C's type definitions for FFI compatibility.
2+
//!
3+
//! This module is intentionally standalone to facilitate parsing when retrieving
4+
//! core C types.
5+
6+
macro_rules! type_alias {
7+
{
8+
$Docfile:tt, $Alias:ident = $Real:ty;
9+
$( $Cfg:tt )*
10+
} => {
11+
#[doc = include_str!($Docfile)]
12+
$( $Cfg )*
13+
#[stable(feature = "core_ffi_c", since = "1.64.0")]
14+
pub type $Alias = $Real;
15+
}
16+
}
17+
18+
type_alias! { "c_char.md", c_char = c_char_definition::c_char; #[doc(cfg(all()))] }
19+
20+
type_alias! { "c_schar.md", c_schar = i8; }
21+
type_alias! { "c_uchar.md", c_uchar = u8; }
22+
type_alias! { "c_short.md", c_short = i16; }
23+
type_alias! { "c_ushort.md", c_ushort = u16; }
24+
25+
type_alias! { "c_int.md", c_int = c_int_definition::c_int; #[doc(cfg(all()))] }
26+
type_alias! { "c_uint.md", c_uint = c_int_definition::c_uint; #[doc(cfg(all()))] }
27+
28+
type_alias! { "c_long.md", c_long = c_long_definition::c_long; #[doc(cfg(all()))] }
29+
type_alias! { "c_ulong.md", c_ulong = c_long_definition::c_ulong; #[doc(cfg(all()))] }
30+
31+
type_alias! { "c_longlong.md", c_longlong = i64; }
32+
type_alias! { "c_ulonglong.md", c_ulonglong = u64; }
33+
34+
type_alias! { "c_float.md", c_float = f32; }
35+
type_alias! { "c_double.md", c_double = f64; }
36+
37+
mod c_char_definition {
38+
cfg_if! {
39+
// These are the targets on which c_char is unsigned. Usually the
40+
// signedness is the same for all target_os values on a given architecture
41+
// but there are some exceptions (see isSignedCharDefault() in clang).
42+
//
43+
// aarch64:
44+
// Section 10 "Arm C and C++ language mappings" in Procedure Call Standard for the Arm®
45+
// 64-bit Architecture (AArch64) says C/C++ char is unsigned byte.
46+
// https://github.com/ARM-software/abi-aa/blob/2024Q3/aapcs64/aapcs64.rst#arm-c-and-c-language-mappings
47+
// arm:
48+
// Section 8 "Arm C and C++ Language Mappings" in Procedure Call Standard for the Arm®
49+
// Architecture says C/C++ char is unsigned byte.
50+
// https://github.com/ARM-software/abi-aa/blob/2024Q3/aapcs32/aapcs32.rst#arm-c-and-c-language-mappings
51+
// csky:
52+
// Section 2.1.2 "Primary Data Type" in C-SKY V2 CPU Applications Binary Interface
53+
// Standards Manual says ANSI C char is unsigned byte.
54+
// https://github.com/c-sky/csky-doc/blob/9f7121f7d40970ba5cc0f15716da033db2bb9d07/C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf
55+
// Note: this doesn't seem to match Clang's default (https://github.com/rust-lang/rust/issues/129945).
56+
// hexagon:
57+
// Section 3.1 "Basic data type" in Qualcomm Hexagon™ Application
58+
// Binary Interface User Guide says "By default, the `char` data type is unsigned."
59+
// https://docs.qualcomm.com/bundle/publicresource/80-N2040-23_REV_K_Qualcomm_Hexagon_Application_Binary_Interface_User_Guide.pdf
60+
// msp430:
61+
// Section 2.1 "Basic Types" in MSP430 Embedded Application Binary
62+
// Interface says "The char type is unsigned by default".
63+
// https://www.ti.com/lit/an/slaa534a/slaa534a.pdf
64+
// powerpc/powerpc64:
65+
// - PPC32 SysV: "Table 3-1 Scalar Types" in System V Application Binary Interface PowerPC
66+
// Processor Supplement says ANSI C char is unsigned byte
67+
// https://refspecs.linuxfoundation.org/elf/elfspec_ppc.pdf
68+
// - PPC64 ELFv1: Section 3.1.4 "Fundamental Types" in 64-bit PowerPC ELF Application
69+
// Binary Interface Supplement 1.9 says ANSI C is unsigned byte
70+
// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#FUND-TYPE
71+
// - PPC64 ELFv2: Section 2.1.2.2 "Fundamental Types" in 64-Bit ELF V2 ABI Specification
72+
// says char is unsigned byte
73+
// https://openpowerfoundation.org/specifications/64bitelfabi/
74+
// - AIX: XL C for AIX Language Reference says "By default, char behaves like an unsigned char."
75+
// https://www.ibm.com/docs/en/xl-c-aix/13.1.3?topic=specifiers-character-types
76+
// riscv32/riscv64:
77+
// C/C++ type representations section in RISC-V Calling Conventions
78+
// page in RISC-V ELF psABI Document says "char is unsigned."
79+
// https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/draft-20240829-13bfa9f54634cb60d86b9b333e109f077805b4b3/riscv-cc.adoc#cc-type-representations
80+
// s390x:
81+
// - ELF: "Table 1.1.: Scalar types" in ELF Application Binary Interface s390x Supplement
82+
// Version 1.6.1 categorize ISO C char in unsigned integer
83+
// https://github.com/IBM/s390x-abi/releases/tag/v1.6.1
84+
// - z/OS: XL C/C++ Language Reference says: "By default, char behaves like an unsigned char."
85+
// https://www.ibm.com/docs/en/zos/3.1.0?topic=specifiers-character-types
86+
// xtensa:
87+
// Section 2.17.1 "Data Types and Alignment" of Xtensa LX Microprocessor Overview handbook
88+
// says "`char` type is unsigned by default".
89+
// https://loboris.eu/ESP32/Xtensa_lx%20Overview%20handbook.pdf
90+
//
91+
// On the following operating systems, c_char is signed by default, regardless of architecture.
92+
// Darwin (macOS, iOS, etc.):
93+
// Apple targets' c_char is signed by default even on arm
94+
// https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Handle-data-types-and-data-alignment-properly
95+
// Windows:
96+
// Windows MSVC C++ Language Reference says "Microsoft-specific: Variables of type char
97+
// are promoted to int as if from type signed char by default, unless the /J compilation
98+
// option is used."
99+
// https://learn.microsoft.com/en-us/cpp/cpp/fundamental-types-cpp?view=msvc-170#character-types
100+
// L4Re:
101+
// The kernel builds with -funsigned-char on all targets (but useserspace follows the
102+
// architecture defaults). As we only have a target for userspace apps so there are no
103+
// special cases for L4Re below.
104+
// https://github.com/rust-lang/rust/pull/132975#issuecomment-2484645240
105+
if #[cfg(all(
106+
not(windows),
107+
not(target_vendor = "apple"),
108+
any(
109+
target_arch = "aarch64",
110+
target_arch = "arm",
111+
target_arch = "csky",
112+
target_arch = "hexagon",
113+
target_arch = "msp430",
114+
target_arch = "powerpc",
115+
target_arch = "powerpc64",
116+
target_arch = "riscv32",
117+
target_arch = "riscv64",
118+
target_arch = "s390x",
119+
target_arch = "xtensa",
120+
)
121+
))] {
122+
pub(super) type c_char = u8;
123+
} else {
124+
// On every other target, c_char is signed.
125+
pub(super) type c_char = i8;
126+
}
127+
}
128+
}
129+
130+
mod c_long_definition {
131+
cfg_if! {
132+
if #[cfg(all(target_pointer_width = "64", not(windows)))] {
133+
pub(super) type c_long = i64;
134+
pub(super) type c_ulong = u64;
135+
} else {
136+
// The minimal size of `long` in the C standard is 32 bits
137+
pub(super) type c_long = i32;
138+
pub(super) type c_ulong = u32;
139+
}
140+
}
141+
}
142+
143+
/// Equivalent to C's `size_t` type, from `stddef.h` (or `cstddef` for C++).
144+
///
145+
/// This type is currently always [`usize`], however in the future there may be
146+
/// platforms where this is not the case.
147+
#[unstable(feature = "c_size_t", issue = "88345")]
148+
pub type c_size_t = usize;
149+
150+
/// Equivalent to C's `ptrdiff_t` type, from `stddef.h` (or `cstddef` for C++).
151+
///
152+
/// This type is currently always [`isize`], however in the future there may be
153+
/// platforms where this is not the case.
154+
#[unstable(feature = "c_size_t", issue = "88345")]
155+
pub type c_ptrdiff_t = isize;
156+
157+
/// Equivalent to C's `ssize_t` (on POSIX) or `SSIZE_T` (on Windows) type.
158+
///
159+
/// This type is currently always [`isize`], however in the future there may be
160+
/// platforms where this is not the case.
161+
#[unstable(feature = "c_size_t", issue = "88345")]
162+
pub type c_ssize_t = isize;
163+
164+
mod c_int_definition {
165+
cfg_if! {
166+
if #[cfg(any(target_arch = "avr", target_arch = "msp430"))] {
167+
pub(super) type c_int = i16;
168+
pub(super) type c_uint = u16;
169+
} else {
170+
pub(super) type c_int = i32;
171+
pub(super) type c_uint = u32;
172+
}
173+
}
174+
}

0 commit comments

Comments
 (0)