@@ -16,7 +16,8 @@ use wit_component::StringEncoding;
16
16
struct C {
17
17
src : Source ,
18
18
opts : Opts ,
19
- includes : Vec < String > ,
19
+ h_includes : Vec < String > ,
20
+ c_includes : Vec < String > ,
20
21
return_pointer_area_size : usize ,
21
22
return_pointer_area_align : usize ,
22
23
names : Ns ,
@@ -181,6 +182,7 @@ impl WorldGenerator for C {
181
182
if i == 0 {
182
183
let name = resolve. name_world_key ( name) ;
183
184
uwriteln ! ( gen . src. h_fns, "\n // Imported Functions from `{name}`" ) ;
185
+ uwriteln ! ( gen . src. c_fns, "\n // Imported Functions from `{name}`" ) ;
184
186
}
185
187
gen. import ( Some ( name) , func) ;
186
188
}
@@ -202,6 +204,7 @@ impl WorldGenerator for C {
202
204
for ( i, ( _name, func) ) in funcs. iter ( ) . enumerate ( ) {
203
205
if i == 0 {
204
206
uwriteln ! ( gen . src. h_fns, "\n // Imported Functions from `{name}`" ) ;
207
+ uwriteln ! ( gen . src. c_fns, "\n // Imported Functions from `{name}`" ) ;
205
208
}
206
209
gen. import ( None , func) ;
207
210
}
@@ -224,6 +227,7 @@ impl WorldGenerator for C {
224
227
if i == 0 {
225
228
let name = resolve. name_world_key ( name) ;
226
229
uwriteln ! ( gen . src. h_fns, "\n // Exported Functions from `{name}`" ) ;
230
+ uwriteln ! ( gen . src. c_fns, "\n // Exported Functions from `{name}`" ) ;
227
231
}
228
232
gen. export ( func, Some ( name) ) ;
229
233
}
@@ -246,6 +250,7 @@ impl WorldGenerator for C {
246
250
for ( i, ( _name, func) ) in funcs. iter ( ) . enumerate ( ) {
247
251
if i == 0 {
248
252
uwriteln ! ( gen . src. h_fns, "\n // Exported Functions from `{name}`" ) ;
253
+ uwriteln ! ( gen . src. c_fns, "\n // Exported Functions from `{name}`" ) ;
249
254
}
250
255
gen. export ( func, None ) ;
251
256
}
@@ -272,8 +277,12 @@ impl WorldGenerator for C {
272
277
273
278
fn finish ( & mut self , resolve : & Resolve , id : WorldId , files : & mut Files ) -> Result < ( ) > {
274
279
let linking_symbol = component_type_object:: linking_symbol ( & self . world ) ;
275
- self . include ( "<stdlib.h>" ) ;
280
+ self . c_include ( "<stdlib.h>" ) ;
276
281
let snake = self . world . to_snake_case ( ) ;
282
+ uwriteln ! (
283
+ self . src. c_adapters,
284
+ "\n // Ensure that the *_component_type.o object is linked in"
285
+ ) ;
277
286
uwrite ! (
278
287
self . src. c_adapters,
279
288
"
@@ -287,11 +296,11 @@ impl WorldGenerator for C {
287
296
self . print_intrinsics ( ) ;
288
297
289
298
if self . needs_string {
290
- self . include ( "<string.h>" ) ;
299
+ self . c_include ( "<string.h>" ) ;
291
300
let ( strlen, size) = match self . opts . string_encoding {
292
301
StringEncoding :: UTF8 => ( format ! ( "strlen(s)" ) , 1 ) ,
293
302
StringEncoding :: UTF16 => {
294
- self . include ( "<uchar.h>" ) ;
303
+ self . h_include ( "<uchar.h>" ) ;
295
304
uwrite ! (
296
305
self . src. h_helpers,
297
306
"
@@ -375,18 +384,17 @@ impl WorldGenerator for C {
375
384
h_str. deindent ( 1 ) ;
376
385
uwriteln ! ( h_str, "\n #endif\n " ) ;
377
386
378
- self . include ( "<stdint.h>" ) ;
379
- self . include ( "<stdbool.h>" ) ;
380
-
381
- for include in self . includes . iter ( ) {
387
+ uwriteln ! ( h_str, "#include <stdint.h>" ) ;
388
+ uwriteln ! ( h_str, "#include <stdbool.h>" ) ;
389
+ for include in self . h_includes . iter ( ) {
382
390
uwriteln ! ( h_str, "#include {include}" ) ;
383
391
}
384
392
385
393
let mut c_str = wit_bindgen_core:: Source :: default ( ) ;
386
394
wit_bindgen_core:: generated_preamble ( & mut c_str, version) ;
387
395
uwriteln ! ( c_str, "#include \" {snake}.h\" " ) ;
388
- if c_str . len ( ) > 0 {
389
- c_str . push_str ( " \n ") ;
396
+ for include in self . c_includes . iter ( ) {
397
+ uwriteln ! ( c_str , "#include {include} ") ;
390
398
}
391
399
c_str. push_str ( & self . src . c_defs ) ;
392
400
c_str. push_str ( & self . src . c_fns ) ;
@@ -395,7 +403,7 @@ impl WorldGenerator for C {
395
403
uwriteln ! (
396
404
h_str,
397
405
"
398
- typedef struct {{\n \
406
+ typedef struct {snake}_string_t { {\n \
399
407
{ty} *ptr;\n \
400
408
size_t len;\n \
401
409
}} {snake}_string_t;",
@@ -490,8 +498,12 @@ impl C {
490
498
}
491
499
}
492
500
493
- fn include ( & mut self , s : & str ) {
494
- self . includes . push ( s. to_string ( ) ) ;
501
+ fn h_include ( & mut self , s : & str ) {
502
+ self . h_includes . push ( s. to_string ( ) ) ;
503
+ }
504
+
505
+ fn c_include ( & mut self , s : & str ) {
506
+ self . c_includes . push ( s. to_string ( ) ) ;
495
507
}
496
508
497
509
fn char_type ( & self ) -> & ' static str {
@@ -825,6 +837,8 @@ impl C {
825
837
fn print_intrinsics ( & mut self ) {
826
838
// Note that these intrinsics are declared as `weak` so they can be
827
839
// overridden from some other symbol.
840
+ self . src . c_fns ( "\n // Canonical ABI intrinsics" ) ;
841
+ self . src . c_fns ( "\n " ) ;
828
842
self . src . c_fns (
829
843
r#"
830
844
__attribute__((__weak__, __export_name__("cabi_realloc")))
@@ -918,16 +932,15 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for InterfaceGenerator<'a> {
918
932
fn type_record ( & mut self , id : TypeId , _name : & str , record : & Record , docs : & Docs ) {
919
933
self . src . h_defs ( "\n " ) ;
920
934
self . docs ( docs, SourceType :: HDefs ) ;
921
- self . src . h_defs ( "typedef struct { \n " ) ;
935
+ self . start_typedef_struct ( id ) ;
922
936
for field in record. fields . iter ( ) {
923
937
self . docs ( & field. docs , SourceType :: HDefs ) ;
924
938
self . print_ty ( SourceType :: HDefs , & field. ty ) ;
925
939
self . src . h_defs ( " " ) ;
926
940
self . src . h_defs ( & to_c_ident ( & field. name ) ) ;
927
941
self . src . h_defs ( ";\n " ) ;
928
942
}
929
- self . src . h_defs ( "} " ) ;
930
- self . print_typedef_target ( id) ;
943
+ self . finish_typedef_struct ( id) ;
931
944
}
932
945
933
946
fn type_resource ( & mut self , id : TypeId , name : & str , _docs : & Docs ) {
@@ -1097,13 +1110,12 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1097
1110
fn type_tuple ( & mut self , id : TypeId , _name : & str , tuple : & Tuple , docs : & Docs ) {
1098
1111
self . src . h_defs ( "\n " ) ;
1099
1112
self . docs ( docs, SourceType :: HDefs ) ;
1100
- self . src . h_defs ( "typedef struct { \n " ) ;
1113
+ self . start_typedef_struct ( id ) ;
1101
1114
for ( i, ty) in tuple. types . iter ( ) . enumerate ( ) {
1102
1115
self . print_ty ( SourceType :: HDefs , ty) ;
1103
1116
uwriteln ! ( self . src. h_defs, " f{i};" ) ;
1104
1117
}
1105
- self . src . h_defs ( "} " ) ;
1106
- self . print_typedef_target ( id) ;
1118
+ self . finish_typedef_struct ( id) ;
1107
1119
}
1108
1120
1109
1121
fn type_flags ( & mut self , id : TypeId , name : & str , flags : & Flags , docs : & Docs ) {
@@ -1133,7 +1145,7 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1133
1145
fn type_variant ( & mut self , id : TypeId , name : & str , variant : & Variant , docs : & Docs ) {
1134
1146
self . src . h_defs ( "\n " ) ;
1135
1147
self . docs ( docs, SourceType :: HDefs ) ;
1136
- self . src . h_defs ( "typedef struct { \n " ) ;
1148
+ self . start_typedef_struct ( id ) ;
1137
1149
self . src . h_defs ( int_repr ( variant. tag ( ) ) ) ;
1138
1150
self . src . h_defs ( " tag;\n " ) ;
1139
1151
@@ -1154,8 +1166,7 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1154
1166
}
1155
1167
self . src . h_defs ( "} val;\n " ) ;
1156
1168
}
1157
- self . src . h_defs ( "} " ) ;
1158
- self . print_typedef_target ( id) ;
1169
+ self . finish_typedef_struct ( id) ;
1159
1170
1160
1171
if variant. cases . len ( ) > 0 {
1161
1172
self . src . h_defs ( "\n " ) ;
@@ -1175,18 +1186,17 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1175
1186
fn type_option ( & mut self , id : TypeId , _name : & str , payload : & Type , docs : & Docs ) {
1176
1187
self . src . h_defs ( "\n " ) ;
1177
1188
self . docs ( docs, SourceType :: HDefs ) ;
1178
- self . src . h_defs ( "typedef struct { \n " ) ;
1189
+ self . start_typedef_struct ( id ) ;
1179
1190
self . src . h_defs ( "bool is_some;\n " ) ;
1180
1191
self . print_ty ( SourceType :: HDefs , payload) ;
1181
1192
self . src . h_defs ( " val;\n " ) ;
1182
- self . src . h_defs ( "} " ) ;
1183
- self . print_typedef_target ( id) ;
1193
+ self . finish_typedef_struct ( id) ;
1184
1194
}
1185
1195
1186
1196
fn type_result ( & mut self , id : TypeId , _name : & str , result : & Result_ , docs : & Docs ) {
1187
1197
self . src . h_defs ( "\n " ) ;
1188
1198
self . docs ( docs, SourceType :: HDefs ) ;
1189
- self . src . h_defs ( "typedef struct { \n " ) ;
1199
+ self . start_typedef_struct ( id ) ;
1190
1200
self . src . h_defs ( "bool is_err;\n " ) ;
1191
1201
if result. ok . is_some ( ) || result. err . is_some ( ) {
1192
1202
self . src . h_defs ( "union {\n " ) ;
@@ -1200,8 +1210,7 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1200
1210
}
1201
1211
self . src . h_defs ( "} val;\n " ) ;
1202
1212
}
1203
- self . src . h_defs ( "} " ) ;
1204
- self . print_typedef_target ( id) ;
1213
+ self . finish_typedef_struct ( id) ;
1205
1214
}
1206
1215
1207
1216
fn type_enum ( & mut self , id : TypeId , name : & str , enum_ : & Enum , docs : & Docs ) {
@@ -1246,12 +1255,11 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
1246
1255
fn type_list ( & mut self , id : TypeId , _name : & str , ty : & Type , docs : & Docs ) {
1247
1256
self . src . h_defs ( "\n " ) ;
1248
1257
self . docs ( docs, SourceType :: HDefs ) ;
1249
- self . src . h_defs ( "typedef struct { \n " ) ;
1258
+ self . start_typedef_struct ( id ) ;
1250
1259
self . print_ty ( SourceType :: HDefs , ty) ;
1251
1260
self . src . h_defs ( " *ptr;\n " ) ;
1252
1261
self . src . h_defs ( "size_t len;\n " ) ;
1253
- self . src . h_defs ( "} " ) ;
1254
- self . print_typedef_target ( id) ;
1262
+ self . finish_typedef_struct ( id) ;
1255
1263
}
1256
1264
1257
1265
fn type_builtin ( & mut self , id : TypeId , name : & str , ty : & Type , docs : & Docs ) {
@@ -1353,6 +1361,7 @@ impl InterfaceGenerator<'_> {
1353
1361
}
1354
1362
1355
1363
self . src . h_defs ( "\n typedef " ) ;
1364
+ let name = & self . gen . type_names [ & ty] ;
1356
1365
match kind {
1357
1366
TypeDefKind :: Type ( _)
1358
1367
| TypeDefKind :: Flags ( _)
@@ -1373,26 +1382,23 @@ impl InterfaceGenerator<'_> {
1373
1382
}
1374
1383
}
1375
1384
TypeDefKind :: Tuple ( t) => {
1376
- self . src . h_defs ( "struct {\n " ) ;
1385
+ self . src . h_defs ( & format ! ( "struct {name} {{ \n " ) ) ;
1377
1386
for ( i, t) in t. types . iter ( ) . enumerate ( ) {
1378
1387
let ty = self . gen . type_name ( t) ;
1379
1388
uwriteln ! ( self . src. h_defs, "{ty} f{i};" ) ;
1380
1389
}
1381
1390
self . src . h_defs ( "}" ) ;
1382
1391
}
1383
1392
TypeDefKind :: Option ( t) => {
1384
- self . src . h_defs ( "struct {\n " ) ;
1393
+ self . src . h_defs ( & format ! ( "struct {name} {{ \n " ) ) ;
1385
1394
self . src . h_defs ( "bool is_some;\n " ) ;
1386
1395
let ty = self . gen . type_name ( t) ;
1387
1396
uwriteln ! ( self . src. h_defs, "{ty} val;" ) ;
1388
1397
self . src . h_defs ( "}" ) ;
1389
1398
}
1390
1399
TypeDefKind :: Result ( r) => {
1391
- self . src . h_defs (
1392
- "struct {
1393
- bool is_err;
1394
- " ,
1395
- ) ;
1400
+ self . src . h_defs ( & format ! ( "struct {name} {{\n " ) ) ;
1401
+ self . src . h_defs ( "bool is_err;\n " ) ;
1396
1402
let ok_ty = r. ok . as_ref ( ) ;
1397
1403
let err_ty = r. err . as_ref ( ) ;
1398
1404
if ok_ty. is_some ( ) || err_ty. is_some ( ) {
@@ -1410,7 +1416,7 @@ impl InterfaceGenerator<'_> {
1410
1416
self . src . h_defs ( "}" ) ;
1411
1417
}
1412
1418
TypeDefKind :: List ( t) => {
1413
- self . src . h_defs ( "struct {\n " ) ;
1419
+ self . src . h_defs ( & format ! ( "struct {name} {{ \n " ) ) ;
1414
1420
let ty = self . gen . type_name ( t) ;
1415
1421
uwriteln ! ( self . src. h_defs, "{ty} *ptr;" ) ;
1416
1422
self . src . h_defs ( "size_t len;\n " ) ;
@@ -1672,6 +1678,8 @@ impl InterfaceGenerator<'_> {
1672
1678
fn export ( & mut self , func : & Function , interface_name : Option < & WorldKey > ) {
1673
1679
let sig = self . resolve . wasm_signature ( AbiVariant :: GuestExport , func) ;
1674
1680
1681
+ self . src . c_fns ( "\n " ) ;
1682
+
1675
1683
let core_module_name = interface_name. map ( |s| self . resolve . name_world_key ( s) ) ;
1676
1684
let export_name = func. core_export_name ( core_module_name. as_deref ( ) ) ;
1677
1685
@@ -1879,6 +1887,18 @@ impl InterfaceGenerator<'_> {
1879
1887
self . src . h_defs ( ";\n " ) ;
1880
1888
}
1881
1889
1890
+ fn start_typedef_struct ( & mut self , id : TypeId ) {
1891
+ let name = & self . gen . type_names [ & id] ;
1892
+ self . src . h_defs ( "typedef struct " ) ;
1893
+ self . src . h_defs ( & name) ;
1894
+ self . src . h_defs ( " {\n " ) ;
1895
+ }
1896
+
1897
+ fn finish_typedef_struct ( & mut self , id : TypeId ) {
1898
+ self . src . h_defs ( "} " ) ;
1899
+ self . print_typedef_target ( id) ;
1900
+ }
1901
+
1882
1902
fn owner_namespace ( & self , id : TypeId ) -> String {
1883
1903
owner_namespace (
1884
1904
self . interface ,
0 commit comments