Skip to content

Commit 3f180f5

Browse files
committed
Put static data for NSString into the proper link sections
1 parent fa5a530 commit 3f180f5

File tree

8 files changed

+294
-269
lines changed

8 files changed

+294
-269
lines changed

objc2-foundation/src/__string_macro.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
//! Macro for making a static NSString.
2+
//!
3+
//! This basically does what clang does, see:
4+
//! - Apple: <https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CodeGenModule.cpp#L5057-L5249>
5+
//! - GNUStep 2.0 (not yet supported): <https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CGObjCGNU.cpp#L973-L1118>
6+
//! - Other (not yet supported): <https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CGObjCGNU.cpp#L2471-L2507>
7+
//!
8+
//! Note that this uses the `CFString` static, while `clang` has support for
9+
//! generating a pure `NSString`. We don't support that yet (since I don't
10+
//! know the use-case), but we definitely could!
11+
//! See: <https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CGObjCMac.cpp#L2007-L2068>
12+
113
use objc2::runtime::Class;
214

315
use crate::NSString;
@@ -274,7 +286,11 @@ macro_rules! ns_string {
274286
if $crate::__string_macro::is_ascii_no_nul(INPUT) {
275287
// Convert the input slice to an array with known length so that
276288
// we can add a NUL byte to it.
277-
const ASCII: [u8; INPUT.len() + 1] = {
289+
//
290+
// The section is the same as what clang sets, see:
291+
// https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CodeGenModule.cpp#L5192
292+
#[link_section = "__TEXT,__cstring,cstring_literals"]
293+
static ASCII: [u8; INPUT.len() + 1] = {
278294
// Zero-fill with INPUT.len() + 1
279295
let mut res: [u8; INPUT.len() + 1] = [0; INPUT.len() + 1];
280296
let mut i = 0;
@@ -287,7 +303,7 @@ macro_rules! ns_string {
287303
res
288304
};
289305

290-
#[link_section = "__DATA,__cfstring,regular"]
306+
#[link_section = "__DATA,__cfstring"]
291307
static CFSTRING: $crate::__string_macro::CFStringAscii = unsafe {
292308
$crate::__string_macro::CFStringAscii::new(
293309
&$crate::__string_macro::__CFConstantStringClassReference,
@@ -319,7 +335,11 @@ macro_rules! ns_string {
319335

320336
// Convert the slice to an array with known length so that we can
321337
// add a NUL byte to it.
322-
const UTF16: [u16; UTF16_FULL.1 + 1] = {
338+
//
339+
// The section is the same as what clang sets, see:
340+
// https://github.com/llvm/llvm-project/blob/release/13.x/clang/lib/CodeGen/CodeGenModule.cpp#L5193
341+
#[link_section = "__TEXT,__ustring"]
342+
static UTF16: [u16; UTF16_FULL.1 + 1] = {
323343
// Zero-fill with UTF16_FULL.1 + 1
324344
let mut res: [u16; UTF16_FULL.1 + 1] = [0; UTF16_FULL.1 + 1];
325345
let mut i = 0;
@@ -332,7 +352,7 @@ macro_rules! ns_string {
332352
res
333353
};
334354

335-
#[link_section = "__DATA,__cfstring,regular"]
355+
#[link_section = "__DATA,__cfstring"]
336356
static CFSTRING: $crate::__string_macro::CFStringUtf16 = unsafe {
337357
$crate::__string_macro::CFStringUtf16::new(
338358
&$crate::__string_macro::__CFConstantStringClassReference,

test-assembly/crates/test_ns_string/expected/apple-aarch64.s

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ l___unnamed_2:
101101
l___unnamed_3:
102102
.asciz "a\000b\000c"
103103

104-
l___unnamed_4:
104+
.section __TEXT,__cstring,cstring_literals
105+
SYM(test_ns_string[CRATE_ID]::EMPTY::ASCII, 0):
105106
.space 1
106107

107108
.section __DATA,__cfstring
@@ -110,12 +111,12 @@ l___unnamed_4:
110111
SYM(test_ns_string[CRATE_ID]::EMPTY::CFSTRING, 0):
111112
.quad ___CFConstantStringClassReference
112113
.asciz "\310\007\000\000\000\000\000"
113-
.quad l___unnamed_4
114+
.quad SYM(test_ns_string[CRATE_ID]::EMPTY::ASCII, 0)
114115
.space 8
115116

116-
.section __TEXT,__const
117+
.section __TEXT,__ustring
117118
.p2align 1
118-
l___unnamed_5:
119+
SYM(test_ns_string[CRATE_ID]::EMPTY::UTF16, 0):
119120
.space 2
120121

121122
.section __DATA,__cfstring
@@ -124,11 +125,11 @@ l___unnamed_5:
124125
SYM(test_ns_string[CRATE_ID]::EMPTY::CFSTRING, 1):
125126
.quad ___CFConstantStringClassReference
126127
.asciz "\320\007\000\000\000\000\000"
127-
.quad l___unnamed_5
128+
.quad SYM(test_ns_string[CRATE_ID]::EMPTY::UTF16, 0)
128129
.space 8
129130

130-
.section __TEXT,__literal4,4byte_literals
131-
l___unnamed_6:
131+
.section __TEXT,__cstring,cstring_literals
132+
SYM(test_ns_string[CRATE_ID]::XYZ::ASCII, 0):
132133
.asciz "xyz"
133134

134135
.section __DATA,__cfstring
@@ -137,12 +138,12 @@ l___unnamed_6:
137138
SYM(test_ns_string[CRATE_ID]::XYZ::CFSTRING, 0):
138139
.quad ___CFConstantStringClassReference
139140
.asciz "\310\007\000\000\000\000\000"
140-
.quad l___unnamed_6
141+
.quad SYM(test_ns_string[CRATE_ID]::XYZ::ASCII, 0)
141142
.asciz "\003\000\000\000\000\000\000"
142143

143-
.section __TEXT,__literal8,8byte_literals
144+
.section __TEXT,__ustring
144145
.p2align 1
145-
l___unnamed_7:
146+
SYM(test_ns_string[CRATE_ID]::XYZ::UTF16, 0):
146147
.asciz "x\000y\000z\000\000"
147148

148149
.section __DATA,__cfstring
@@ -151,82 +152,82 @@ l___unnamed_7:
151152
SYM(test_ns_string[CRATE_ID]::XYZ::CFSTRING, 1):
152153
.quad ___CFConstantStringClassReference
153154
.asciz "\320\007\000\000\000\000\000"
154-
.quad l___unnamed_7
155+
.quad SYM(test_ns_string[CRATE_ID]::XYZ::UTF16, 0)
155156
.asciz "\003\000\000\000\000\000\000"
156157

157-
.section __TEXT,__literal4,4byte_literals
158-
l___unnamed_8:
158+
.section __TEXT,__cstring,cstring_literals
159+
SYM(test_ns_string[CRATE_ID]::get_ascii::ASCII, 0):
159160
.asciz "abc"
160161

161162
.section __DATA,__cfstring
162163
.p2align 3
163164
SYM(test_ns_string[CRATE_ID]::get_ascii::CFSTRING, 1):
164165
.quad ___CFConstantStringClassReference
165166
.asciz "\310\007\000\000\000\000\000"
166-
.quad l___unnamed_8
167+
.quad SYM(test_ns_string[CRATE_ID]::get_ascii::ASCII, 0)
167168
.asciz "\003\000\000\000\000\000\000"
168169

169-
.section __TEXT,__literal8,8byte_literals
170+
.section __TEXT,__ustring
170171
.p2align 1
171-
l___unnamed_9:
172+
SYM(test_ns_string[CRATE_ID]::get_ascii::UTF16, 0):
172173
.asciz "a\000b\000c\000\000"
173174

174175
.section __DATA,__cfstring
175176
.p2align 3
176177
SYM(test_ns_string[CRATE_ID]::get_ascii::CFSTRING, 0):
177178
.quad ___CFConstantStringClassReference
178179
.asciz "\320\007\000\000\000\000\000"
179-
.quad l___unnamed_9
180+
.quad SYM(test_ns_string[CRATE_ID]::get_ascii::UTF16, 0)
180181
.asciz "\003\000\000\000\000\000\000"
181182

182-
.section __TEXT,__const
183-
l___unnamed_10:
183+
.section __TEXT,__cstring,cstring_literals
184+
SYM(test_ns_string[CRATE_ID]::get_utf16::ASCII, 0):
184185
.asciz "\303\241b\304\207"
185186

186187
.section __DATA,__cfstring
187188
.p2align 3
188189
SYM(test_ns_string[CRATE_ID]::get_utf16::CFSTRING, 1):
189190
.quad ___CFConstantStringClassReference
190191
.asciz "\310\007\000\000\000\000\000"
191-
.quad l___unnamed_10
192+
.quad SYM(test_ns_string[CRATE_ID]::get_utf16::ASCII, 0)
192193
.asciz "\005\000\000\000\000\000\000"
193194

194-
.section __TEXT,__literal8,8byte_literals
195+
.section __TEXT,__ustring
195196
.p2align 1
196-
l___unnamed_11:
197+
SYM(test_ns_string[CRATE_ID]::get_utf16::UTF16, 0):
197198
.asciz "\341\000b\000\007\001\000"
198199

199200
.section __DATA,__cfstring
200201
.p2align 3
201202
SYM(test_ns_string[CRATE_ID]::get_utf16::CFSTRING, 0):
202203
.quad ___CFConstantStringClassReference
203204
.asciz "\320\007\000\000\000\000\000"
204-
.quad l___unnamed_11
205+
.quad SYM(test_ns_string[CRATE_ID]::get_utf16::UTF16, 0)
205206
.asciz "\003\000\000\000\000\000\000"
206207

207-
.section __TEXT,__const
208-
l___unnamed_12:
208+
.section __TEXT,__cstring,cstring_literals
209+
SYM(test_ns_string[CRATE_ID]::get_with_nul::ASCII, 0):
209210
.asciz "a\000b\000c\000"
210211

211212
.section __DATA,__cfstring
212213
.p2align 3
213214
SYM(test_ns_string[CRATE_ID]::get_with_nul::CFSTRING, 1):
214215
.quad ___CFConstantStringClassReference
215216
.asciz "\310\007\000\000\000\000\000"
216-
.quad l___unnamed_12
217+
.quad SYM(test_ns_string[CRATE_ID]::get_with_nul::ASCII, 0)
217218
.asciz "\006\000\000\000\000\000\000"
218219

219-
.section __TEXT,__const
220+
.section __TEXT,__ustring
220221
.p2align 1
221-
l___unnamed_13:
222+
SYM(test_ns_string[CRATE_ID]::get_with_nul::UTF16, 0):
222223
.asciz "a\000\000\000b\000\000\000c\000\000\000\000"
223224

224225
.section __DATA,__cfstring
225226
.p2align 3
226227
SYM(test_ns_string[CRATE_ID]::get_with_nul::CFSTRING, 0):
227228
.quad ___CFConstantStringClassReference
228229
.asciz "\320\007\000\000\000\000\000"
229-
.quad l___unnamed_13
230+
.quad SYM(test_ns_string[CRATE_ID]::get_with_nul::UTF16, 0)
230231
.asciz "\006\000\000\000\000\000\000"
231232

232233
.subsections_via_symbols

test-assembly/crates/test_ns_string/expected/apple-armv7.s

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ l___unnamed_2:
9696
l___unnamed_3:
9797
.asciz "a\000b\000c"
9898

99-
l___unnamed_4:
99+
.section __TEXT,__cstring,cstring_literals
100+
SYM(test_ns_string[CRATE_ID]::EMPTY::ASCII, 0):
100101
.space 1
101102

102103
.section __DATA,__cfstring
@@ -105,12 +106,12 @@ l___unnamed_4:
105106
SYM(test_ns_string[CRATE_ID]::EMPTY::CFSTRING, 0):
106107
.long ___CFConstantStringClassReference
107108
.asciz "\310\007\000"
108-
.long l___unnamed_4
109+
.long SYM(test_ns_string[CRATE_ID]::EMPTY::ASCII, 0)
109110
.space 4
110111

111-
.section __TEXT,__const
112+
.section __TEXT,__ustring
112113
.p2align 1
113-
l___unnamed_5:
114+
SYM(test_ns_string[CRATE_ID]::EMPTY::UTF16, 0):
114115
.space 2
115116

116117
.section __DATA,__cfstring
@@ -119,11 +120,11 @@ l___unnamed_5:
119120
SYM(test_ns_string[CRATE_ID]::EMPTY::CFSTRING, 1):
120121
.long ___CFConstantStringClassReference
121122
.asciz "\320\007\000"
122-
.long l___unnamed_5
123+
.long SYM(test_ns_string[CRATE_ID]::EMPTY::UTF16, 0)
123124
.space 4
124125

125-
.section __TEXT,__literal4,4byte_literals
126-
L___unnamed_6:
126+
.section __TEXT,__cstring,cstring_literals
127+
SYM(test_ns_string[CRATE_ID]::XYZ::ASCII, 0):
127128
.asciz "xyz"
128129

129130
.section __DATA,__cfstring
@@ -132,12 +133,12 @@ L___unnamed_6:
132133
SYM(test_ns_string[CRATE_ID]::XYZ::CFSTRING, 0):
133134
.long ___CFConstantStringClassReference
134135
.asciz "\310\007\000"
135-
.long L___unnamed_6
136+
.long SYM(test_ns_string[CRATE_ID]::XYZ::ASCII, 0)
136137
.asciz "\003\000\000"
137138

138-
.section __TEXT,__literal8,8byte_literals
139+
.section __TEXT,__ustring
139140
.p2align 1
140-
L___unnamed_7:
141+
SYM(test_ns_string[CRATE_ID]::XYZ::UTF16, 0):
141142
.asciz "x\000y\000z\000\000"
142143

143144
.section __DATA,__cfstring
@@ -146,82 +147,82 @@ L___unnamed_7:
146147
SYM(test_ns_string[CRATE_ID]::XYZ::CFSTRING, 1):
147148
.long ___CFConstantStringClassReference
148149
.asciz "\320\007\000"
149-
.long L___unnamed_7
150+
.long SYM(test_ns_string[CRATE_ID]::XYZ::UTF16, 0)
150151
.asciz "\003\000\000"
151152

152-
.section __TEXT,__literal4,4byte_literals
153-
L___unnamed_8:
153+
.section __TEXT,__cstring,cstring_literals
154+
SYM(test_ns_string[CRATE_ID]::get_ascii::ASCII, 0):
154155
.asciz "abc"
155156

156157
.section __DATA,__cfstring
157158
.p2align 2
158159
SYM(test_ns_string[CRATE_ID]::get_ascii::CFSTRING, 0):
159160
.long ___CFConstantStringClassReference
160161
.asciz "\310\007\000"
161-
.long L___unnamed_8
162+
.long SYM(test_ns_string[CRATE_ID]::get_ascii::ASCII, 0)
162163
.asciz "\003\000\000"
163164

164-
.section __TEXT,__literal8,8byte_literals
165+
.section __TEXT,__ustring
165166
.p2align 1
166-
L___unnamed_9:
167+
SYM(test_ns_string[CRATE_ID]::get_ascii::UTF16, 0):
167168
.asciz "a\000b\000c\000\000"
168169

169170
.section __DATA,__cfstring
170171
.p2align 2
171172
SYM(test_ns_string[CRATE_ID]::get_ascii::CFSTRING, 1):
172173
.long ___CFConstantStringClassReference
173174
.asciz "\320\007\000"
174-
.long L___unnamed_9
175+
.long SYM(test_ns_string[CRATE_ID]::get_ascii::UTF16, 0)
175176
.asciz "\003\000\000"
176177

177-
.section __TEXT,__const
178-
l___unnamed_10:
178+
.section __TEXT,__cstring,cstring_literals
179+
SYM(test_ns_string[CRATE_ID]::get_utf16::ASCII, 0):
179180
.asciz "\303\241b\304\207"
180181

181182
.section __DATA,__cfstring
182183
.p2align 2
183184
SYM(test_ns_string[CRATE_ID]::get_utf16::CFSTRING, 0):
184185
.long ___CFConstantStringClassReference
185186
.asciz "\310\007\000"
186-
.long l___unnamed_10
187+
.long SYM(test_ns_string[CRATE_ID]::get_utf16::ASCII, 0)
187188
.asciz "\005\000\000"
188189

189-
.section __TEXT,__literal8,8byte_literals
190+
.section __TEXT,__ustring
190191
.p2align 1
191-
L___unnamed_11:
192+
SYM(test_ns_string[CRATE_ID]::get_utf16::UTF16, 0):
192193
.asciz "\341\000b\000\007\001\000"
193194

194195
.section __DATA,__cfstring
195196
.p2align 2
196197
SYM(test_ns_string[CRATE_ID]::get_utf16::CFSTRING, 1):
197198
.long ___CFConstantStringClassReference
198199
.asciz "\320\007\000"
199-
.long L___unnamed_11
200+
.long SYM(test_ns_string[CRATE_ID]::get_utf16::UTF16, 0)
200201
.asciz "\003\000\000"
201202

202-
.section __TEXT,__const
203-
l___unnamed_12:
203+
.section __TEXT,__cstring,cstring_literals
204+
SYM(test_ns_string[CRATE_ID]::get_with_nul::ASCII, 0):
204205
.asciz "a\000b\000c\000"
205206

206207
.section __DATA,__cfstring
207208
.p2align 2
208209
SYM(test_ns_string[CRATE_ID]::get_with_nul::CFSTRING, 0):
209210
.long ___CFConstantStringClassReference
210211
.asciz "\310\007\000"
211-
.long l___unnamed_12
212+
.long SYM(test_ns_string[CRATE_ID]::get_with_nul::ASCII, 0)
212213
.asciz "\006\000\000"
213214

214-
.section __TEXT,__const
215+
.section __TEXT,__ustring
215216
.p2align 1
216-
l___unnamed_13:
217+
SYM(test_ns_string[CRATE_ID]::get_with_nul::UTF16, 0):
217218
.asciz "a\000\000\000b\000\000\000c\000\000\000\000"
218219

219220
.section __DATA,__cfstring
220221
.p2align 2
221222
SYM(test_ns_string[CRATE_ID]::get_with_nul::CFSTRING, 1):
222223
.long ___CFConstantStringClassReference
223224
.asciz "\320\007\000"
224-
.long l___unnamed_13
225+
.long SYM(test_ns_string[CRATE_ID]::get_with_nul::UTF16, 0)
225226
.asciz "\006\000\000"
226227

227228
.subsections_via_symbols

0 commit comments

Comments
 (0)