forked from diesel-rs/diesel
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfixed_width_ints.rs.html
More file actions
207 lines (198 loc) · 17.9 KB
/
Copy pathfixed_width_ints.rs.html
File metadata and controls
207 lines (198 loc) · 17.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `/home/runner/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.126/src/fixed_width_ints.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>fixed_width_ints.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script><script defer src="../../main.js"></script><noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="mobile-topbar"><button class="sidebar-menu-toggle">☰</button><a class="sidebar-logo" href="../../libc/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a><h2 class="location"></h2>
</nav>
<nav class="sidebar"><a class="sidebar-logo" href="../../libc/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></div>
</a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../libc/index.html"><img class="rust-logo" src="../../rust-logo.svg" alt="logo"></a><nav class="sub"><form class="search-form"><div class="search-container"><span></span><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press ‘S’ to search, ‘?’ for more options…" type="search"><div id="help-button" title="help" tabindex="-1"><button type="button">?</button></div><div id="settings-menu" tabindex="-1">
<a href="../../settings.html" title="settings"><img width="22" height="22" alt="Change settings" src="../../wheel.svg"></a></div>
</div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1">1</span>
<span id="2">2</span>
<span id="3">3</span>
<span id="4">4</span>
<span id="5">5</span>
<span id="6">6</span>
<span id="7">7</span>
<span id="8">8</span>
<span id="9">9</span>
<span id="10">10</span>
<span id="11">11</span>
<span id="12">12</span>
<span id="13">13</span>
<span id="14">14</span>
<span id="15">15</span>
<span id="16">16</span>
<span id="17">17</span>
<span id="18">18</span>
<span id="19">19</span>
<span id="20">20</span>
<span id="21">21</span>
<span id="22">22</span>
<span id="23">23</span>
<span id="24">24</span>
<span id="25">25</span>
<span id="26">26</span>
<span id="27">27</span>
<span id="28">28</span>
<span id="29">29</span>
<span id="30">30</span>
<span id="31">31</span>
<span id="32">32</span>
<span id="33">33</span>
<span id="34">34</span>
<span id="35">35</span>
<span id="36">36</span>
<span id="37">37</span>
<span id="38">38</span>
<span id="39">39</span>
<span id="40">40</span>
<span id="41">41</span>
<span id="42">42</span>
<span id="43">43</span>
<span id="44">44</span>
<span id="45">45</span>
<span id="46">46</span>
<span id="47">47</span>
<span id="48">48</span>
<span id="49">49</span>
<span id="50">50</span>
<span id="51">51</span>
<span id="52">52</span>
<span id="53">53</span>
<span id="54">54</span>
<span id="55">55</span>
<span id="56">56</span>
<span id="57">57</span>
<span id="58">58</span>
<span id="59">59</span>
<span id="60">60</span>
<span id="61">61</span>
<span id="62">62</span>
<span id="63">63</span>
<span id="64">64</span>
<span id="65">65</span>
<span id="66">66</span>
<span id="67">67</span>
<span id="68">68</span>
<span id="69">69</span>
<span id="70">70</span>
<span id="71">71</span>
<span id="72">72</span>
<span id="73">73</span>
<span id="74">74</span>
<span id="75">75</span>
<span id="76">76</span>
<span id="77">77</span>
<span id="78">78</span>
<span id="79">79</span>
<span id="80">80</span>
<span id="81">81</span>
<span id="82">82</span>
<span id="83">83</span>
<span id="84">84</span>
<span id="85">85</span>
<span id="86">86</span>
<span id="87">87</span>
<span id="88">88</span>
<span id="89">89</span>
<span id="90">90</span>
<span id="91">91</span>
<span id="92">92</span>
<span id="93">93</span>
<span id="94">94</span>
<span id="95">95</span>
<span id="96">96</span>
<span id="97">97</span>
<span id="98">98</span>
<span id="99">99</span>
</pre><pre class="rust"><code><span class="doccomment">//! This module contains type aliases for C's fixed-width integer types .</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! These aliases are deprecated: use the Rust types instead.</span>
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use i8 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">int8_t</span> <span class="op">=</span> <span class="ident">i8</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use i16 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">int16_t</span> <span class="op">=</span> <span class="ident">i16</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use i32 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">int32_t</span> <span class="op">=</span> <span class="ident">i32</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use i64 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">int64_t</span> <span class="op">=</span> <span class="ident">i64</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use u8 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">uint8_t</span> <span class="op">=</span> <span class="ident">u8</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use u16 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">uint16_t</span> <span class="op">=</span> <span class="ident">u16</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use u32 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">uint32_t</span> <span class="op">=</span> <span class="ident">u32</span>;
<span class="attribute">#[<span class="ident">deprecated</span>(<span class="ident">since</span> <span class="op">=</span> <span class="string">"0.2.55"</span>, <span class="ident">note</span> <span class="op">=</span> <span class="string">"Use u64 instead."</span>)]</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">uint64_t</span> <span class="op">=</span> <span class="ident">u64</span>;
<span class="macro">cfg_if!</span> {
<span class="kw">if</span> <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">all</span>(<span class="ident">libc_int128</span>, <span class="ident">target_arch</span> <span class="op">=</span> <span class="string">"aarch64"</span>, <span class="ident">not</span>(<span class="ident">target_os</span> <span class="op">=</span> <span class="string">"windows"</span>)))]</span> {
<span class="comment">// This introduces partial support for FFI with __int128 and</span>
<span class="comment">// equivalent types on platforms where Rust's definition is validated</span>
<span class="comment">// to match the standard C ABI of that platform.</span>
<span class="comment">//</span>
<span class="comment">// Rust does not guarantee u128/i128 are sound for FFI, and its</span>
<span class="comment">// definitions are in fact known to be incompatible. [0]</span>
<span class="comment">//</span>
<span class="comment">// However these problems aren't fundamental, and are just platform</span>
<span class="comment">// inconsistencies. Specifically at the time of this writing:</span>
<span class="comment">//</span>
<span class="comment">// * For x64 SysV ABIs (everything but Windows), the types are underaligned.</span>
<span class="comment">// * For all Windows ABIs, Microsoft doesn't actually officially define __int128,</span>
<span class="comment">// and as a result different implementations don't actually agree on its ABI.</span>
<span class="comment">//</span>
<span class="comment">// But on the other major aarch64 platforms (android, linux, ios, macos) we have</span>
<span class="comment">// validated that rustc has the right ABI for these types. This is important because</span>
<span class="comment">// aarch64 uses these types in some fundamental OS types like user_fpsimd_struct,</span>
<span class="comment">// which represents saved simd registers.</span>
<span class="comment">//</span>
<span class="comment">// Any API which uses these types will need to `#[ignore(improper_ctypes)]`</span>
<span class="comment">// until the upstream rust issue is resolved, but this at least lets us make</span>
<span class="comment">// progress on platforms where this type is important.</span>
<span class="comment">//</span>
<span class="comment">// The list of supported architectures and OSes is intentionally very restricted,</span>
<span class="comment">// as careful work needs to be done to verify that a particular platform</span>
<span class="comment">// has a conformant ABI.</span>
<span class="comment">//</span>
<span class="comment">// [0]: https://github.com/rust-lang/rust/issues/54341</span>
<span class="doccomment">/// C `__int128` (a GCC extension that's part of many ABIs)</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">__int128</span> <span class="op">=</span> <span class="ident">i128</span>;
<span class="doccomment">/// C `unsigned __int128` (a GCC extension that's part of many ABIs)</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">__uint128</span> <span class="op">=</span> <span class="ident">u128</span>;
<span class="doccomment">/// C __int128_t (alternate name for [__int128][])</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">__int128_t</span> <span class="op">=</span> <span class="ident">i128</span>;
<span class="doccomment">/// C __uint128_t (alternate name for [__uint128][])</span>
<span class="kw">pub</span> <span class="kw">type</span> <span class="ident">__uint128_t</span> <span class="op">=</span> <span class="ident">u128</span>;
<span class="macro">cfg_if!</span> {
<span class="kw">if</span> <span class="attribute">#[<span class="ident">cfg</span>(<span class="ident">libc_underscore_const_names</span>)]</span> {
<span class="macro">macro_rules!</span> <span class="ident">static_assert_eq</span> {
(<span class="macro-nonterminal">$</span><span class="macro-nonterminal">a</span>:<span class="ident">expr</span>, <span class="macro-nonterminal">$</span><span class="macro-nonterminal">b</span>:<span class="ident">expr</span>) => {
<span class="kw">const</span> <span class="kw">_</span>: [(); <span class="macro-nonterminal">$</span><span class="macro-nonterminal">a</span>] <span class="op">=</span> [(); <span class="macro-nonterminal">$</span><span class="macro-nonterminal">b</span>];
};
}
<span class="comment">// NOTE: if you add more platforms to here, you may need to cfg</span>
<span class="comment">// these consts. They should always match the platform's values</span>
<span class="comment">// for `sizeof(__int128)` and `_Alignof(__int128)`.</span>
<span class="kw">const</span> <span class="ident">_SIZE_128</span>: <span class="ident">usize</span> <span class="op">=</span> <span class="number">16</span>;
<span class="kw">const</span> <span class="ident">_ALIGN_128</span>: <span class="ident">usize</span> <span class="op">=</span> <span class="number">16</span>;
<span class="comment">// Since Rust doesn't officially guarantee that these types</span>
<span class="comment">// have compatible ABIs, we const assert that these values have the</span>
<span class="comment">// known size/align of the target platform's libc. If rustc ever</span>
<span class="comment">// tries to regress things, it will cause a compilation error.</span>
<span class="comment">//</span>
<span class="comment">// This isn't a bullet-proof solution because e.g. it doesn't</span>
<span class="comment">// catch the fact that llvm and gcc disagree on how x64 __int128</span>
<span class="comment">// is actually *passed* on the stack (clang underaligns it for</span>
<span class="comment">// the same reason that rustc *never* properly aligns it).</span>
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::size_of</span>::<span class="op"><</span><span class="ident">__int128</span><span class="op">></span>(), <span class="ident">_SIZE_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::align_of</span>::<span class="op"><</span><span class="ident">__int128</span><span class="op">></span>(), <span class="ident">_ALIGN_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::size_of</span>::<span class="op"><</span><span class="ident">__uint128</span><span class="op">></span>(), <span class="ident">_SIZE_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::align_of</span>::<span class="op"><</span><span class="ident">__uint128</span><span class="op">></span>(), <span class="ident">_ALIGN_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::size_of</span>::<span class="op"><</span><span class="ident">__int128_t</span><span class="op">></span>(), <span class="ident">_SIZE_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::align_of</span>::<span class="op"><</span><span class="ident">__int128_t</span><span class="op">></span>(), <span class="ident">_ALIGN_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::size_of</span>::<span class="op"><</span><span class="ident">__uint128_t</span><span class="op">></span>(), <span class="ident">_SIZE_128</span>);
<span class="macro">static_assert_eq!</span>(<span class="ident">core::mem::align_of</span>::<span class="op"><</span><span class="ident">__uint128_t</span><span class="op">></span>(), <span class="ident">_ALIGN_128</span>);
}
}
}
}
</code></pre></div>
</section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="libc" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.64.0-nightly (495b21669 2022-07-03)" ></div>
</body></html>