@@ -87,101 +87,3 @@ pub type uint16_t = u16;
87
87
pub type uint32_t = u32 ;
88
88
#[ deprecated( since = "0.2.55" , note = "Use u64 instead." ) ]
89
89
pub type uint64_t = u64 ;
90
-
91
- cfg_if ! {
92
- if #[ cfg( all(
93
- target_arch = "aarch64" ,
94
- not( any(
95
- target_os = "windows" ,
96
- target_os = "macos" ,
97
- target_os = "ios" ,
98
- target_os = "tvos" ,
99
- target_os = "watchos"
100
- ) )
101
- ) ) ] {
102
- // This introduces partial support for FFI with __int128 and
103
- // equivalent types on platforms where Rust's definition is validated
104
- // to match the standard C ABI of that platform.
105
- //
106
- // Rust does not guarantee u128/i128 are sound for FFI, and its
107
- // definitions are in fact known to be incompatible. [0]
108
- //
109
- // However these problems aren't fundamental, and are just platform
110
- // inconsistencies. Specifically at the time of this writing:
111
- //
112
- // * For x64 SysV ABIs (everything but Windows), the types are underaligned.
113
- // * For all Windows ABIs, Microsoft doesn't actually officially define __int128,
114
- // and as a result different implementations don't actually agree on its ABI.
115
- //
116
- // But on the other major aarch64 platforms (android, linux, ios, macos) we have
117
- // validated that rustc has the right ABI for these types. This is important because
118
- // aarch64 uses these types in some fundamental OS types like user_fpsimd_struct,
119
- // which represents saved simd registers.
120
- //
121
- // Any API which uses these types will need to `#[ignore(improper_ctypes)]`
122
- // until the upstream rust issue is resolved, but this at least lets us make
123
- // progress on platforms where this type is important.
124
- //
125
- // The list of supported architectures and OSes is intentionally very restricted,
126
- // as careful work needs to be done to verify that a particular platform
127
- // has a conformant ABI.
128
- //
129
- // [0]: https://github.com/rust-lang/rust/issues/54341
130
-
131
- /// C `__int128` (a GCC extension that's part of many ABIs)
132
- pub type __int128 = i128 ;
133
- /// C `unsigned __int128` (a GCC extension that's part of many ABIs)
134
- pub type __uint128 = u128 ;
135
- /// C __int128_t (alternate name for [__int128][])
136
- pub type __int128_t = i128 ;
137
- /// C __uint128_t (alternate name for [__uint128][])
138
-
139
- // NOTE: if you add more platforms to here, you may need to cfg
140
- // these consts. They should always match the platform's values
141
- // for `sizeof(__int128)` and `_Alignof(__int128)`.
142
- const _SIZE_128: usize = 16 ;
143
- const _ALIGN_128: usize = 16 ;
144
-
145
- // FIXME(ctest): ctest doesn't handle `_` as an identifier so these tests are temporarily
146
- // disabled.
147
- // macro_rules! static_assert_eq {
148
- // ($a:expr, $b:expr) => {
149
- // const _: [(); $a] = [(); $b];
150
- // };
151
- // }
152
- //
153
- // // Since Rust doesn't officially guarantee that these types
154
- // // have compatible ABIs, we const assert that these values have the
155
- // // known size/align of the target platform's libc. If rustc ever
156
- // // tries to regress things, it will cause a compilation error.
157
- // //
158
- // // This isn't a bullet-proof solution because e.g. it doesn't
159
- // // catch the fact that llvm and gcc disagree on how x64 __int128
160
- // // is actually *passed* on the stack (clang underaligns it for
161
- // // the same reason that rustc *never* properly aligns it).
162
- // static_assert_eq!(core::mem::size_of::<__int128>(), _SIZE_128);
163
- // static_assert_eq!(core::mem::align_of::<__int128>(), _ALIGN_128);
164
-
165
- // static_assert_eq!(core::mem::size_of::<__uint128>(), _SIZE_128);
166
- // static_assert_eq!(core::mem::align_of::<__uint128>(), _ALIGN_128);
167
-
168
- // static_assert_eq!(core::mem::size_of::<__int128_t>(), _SIZE_128);
169
- // static_assert_eq!(core::mem::align_of::<__int128_t>(), _ALIGN_128);
170
-
171
- // static_assert_eq!(core::mem::size_of::<__uint128_t>(), _SIZE_128);
172
- // static_assert_eq!(core::mem::align_of::<__uint128_t>(), _ALIGN_128);
173
- } else if #[ cfg( all(
174
- target_arch = "aarch64" ,
175
- any(
176
- target_os = "macos" ,
177
- target_os = "ios" ,
178
- target_os = "tvos" ,
179
- target_os = "watchos"
180
- )
181
- ) ) ] {
182
- /// C `__int128_t`
183
- pub type __int128_t = i128 ;
184
- /// C `__uint128_t`
185
- pub type __uint128_t = u128 ;
186
- }
187
- }
0 commit comments