@@ -18,8 +18,8 @@ struct C {
18
18
opts : Opts ,
19
19
h_includes : Vec < String > ,
20
20
c_includes : Vec < String > ,
21
- return_pointer_area_size : usize ,
22
- return_pointer_area_align : usize ,
21
+ return_pointer_area_size : ArchitectureSize ,
22
+ return_pointer_area_align : Alignment ,
23
23
names : Ns ,
24
24
needs_string : bool ,
25
25
needs_union_int32_float : bool ,
@@ -463,16 +463,18 @@ impl WorldGenerator for C {
463
463
// Declare a statically-allocated return area, if needed. We only do
464
464
// this for export bindings, because import bindings allocate their
465
465
// return-area on the stack.
466
- if self . return_pointer_area_size > 0 {
466
+ if ! self . return_pointer_area_size . is_empty ( ) {
467
467
// Automatic indentation avoided due to `extern "C" {` declaration
468
468
uwrite ! (
469
469
c_str,
470
470
"
471
471
__attribute__((__aligned__({})))
472
472
static uint8_t RET_AREA[{}];
473
473
" ,
474
- self . return_pointer_area_align,
475
- self . return_pointer_area_size,
474
+ self . return_pointer_area_align
475
+ . format( POINTER_SIZE_EXPRESSION ) ,
476
+ self . return_pointer_area_size
477
+ . format( POINTER_SIZE_EXPRESSION ) ,
476
478
) ;
477
479
}
478
480
c_str. push_str ( & self . src . c_adapters ) ;
@@ -1779,12 +1781,14 @@ impl InterfaceGenerator<'_> {
1779
1781
..
1780
1782
} = f;
1781
1783
1782
- if import_return_pointer_area_size > 0 {
1784
+ if ! import_return_pointer_area_size. is_empty ( ) {
1783
1785
self . src . c_adapters ( & format ! (
1784
1786
"\
1785
- __attribute__((__aligned__({import_return_pointer_area_align })))
1786
- uint8_t ret_area[{import_return_pointer_area_size }];
1787
+ __attribute__((__aligned__({})))
1788
+ uint8_t ret_area[{}];
1787
1789
" ,
1790
+ import_return_pointer_area_align. format( POINTER_SIZE_EXPRESSION ) ,
1791
+ import_return_pointer_area_size. format( POINTER_SIZE_EXPRESSION ) ,
1788
1792
) ) ;
1789
1793
}
1790
1794
@@ -2121,8 +2125,8 @@ struct FunctionBindgen<'a, 'b> {
2121
2125
params : Vec < String > ,
2122
2126
wasm_return : Option < String > ,
2123
2127
ret_store_cnt : usize ,
2124
- import_return_pointer_area_size : usize ,
2125
- import_return_pointer_area_align : usize ,
2128
+ import_return_pointer_area_size : ArchitectureSize ,
2129
+ import_return_pointer_area_align : Alignment ,
2126
2130
2127
2131
/// Borrows observed during lifting an export, that will need to be dropped when the guest
2128
2132
/// function exits.
@@ -2150,8 +2154,8 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2150
2154
params : Vec :: new ( ) ,
2151
2155
wasm_return : None ,
2152
2156
ret_store_cnt : 0 ,
2153
- import_return_pointer_area_size : 0 ,
2154
- import_return_pointer_area_align : 0 ,
2157
+ import_return_pointer_area_size : Default :: default ( ) ,
2158
+ import_return_pointer_area_align : Default :: default ( ) ,
2155
2159
borrow_decls : Default :: default ( ) ,
2156
2160
borrows : Vec :: new ( ) ,
2157
2161
}
@@ -2164,23 +2168,40 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2164
2168
self . src . push_str ( ";\n " ) ;
2165
2169
}
2166
2170
2167
- fn load ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2168
- results. push ( format ! ( "*(({}*) ({} + {}))" , ty, operands[ 0 ] , offset) ) ;
2171
+ fn load (
2172
+ & mut self ,
2173
+ ty : & str ,
2174
+ offset : ArchitectureSize ,
2175
+ operands : & [ String ] ,
2176
+ results : & mut Vec < String > ,
2177
+ ) {
2178
+ results. push ( format ! (
2179
+ "*(({}*) ({} + {}))" ,
2180
+ ty,
2181
+ operands[ 0 ] ,
2182
+ offset. format( POINTER_SIZE_EXPRESSION )
2183
+ ) ) ;
2169
2184
}
2170
2185
2171
- fn load_ext ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2186
+ fn load_ext (
2187
+ & mut self ,
2188
+ ty : & str ,
2189
+ offset : ArchitectureSize ,
2190
+ operands : & [ String ] ,
2191
+ results : & mut Vec < String > ,
2192
+ ) {
2172
2193
self . load ( ty, offset, operands, results) ;
2173
2194
let result = results. pop ( ) . unwrap ( ) ;
2174
2195
results. push ( format ! ( "(int32_t) {}" , result) ) ;
2175
2196
}
2176
2197
2177
- fn store ( & mut self , ty : & str , offset : i32 , operands : & [ String ] ) {
2198
+ fn store ( & mut self , ty : & str , offset : ArchitectureSize , operands : & [ String ] ) {
2178
2199
uwriteln ! (
2179
2200
self . src,
2180
2201
"*(({}*)({} + {})) = {};" ,
2181
2202
ty,
2182
2203
operands[ 1 ] ,
2183
- offset,
2204
+ offset. format ( POINTER_SIZE_EXPRESSION ) ,
2184
2205
operands[ 0 ]
2185
2206
) ;
2186
2207
}
@@ -2230,7 +2251,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2230
2251
self . blocks . push ( ( src. into ( ) , mem:: take ( operands) ) ) ;
2231
2252
}
2232
2253
2233
- fn return_pointer ( & mut self , size : usize , align : usize ) -> String {
2254
+ fn return_pointer ( & mut self , size : ArchitectureSize , align : Alignment ) -> String {
2234
2255
let ptr = self . locals . tmp ( "ptr" ) ;
2235
2256
2236
2257
// Use a stack-based return area for imports, because exports need
@@ -3034,8 +3055,12 @@ impl Bindgen for FunctionBindgen<'_, '_> {
3034
3055
uwriteln ! ( self . src, "uint8_t *{ptr} = {};" , operands[ 0 ] ) ;
3035
3056
let i = self . locals . tmp ( "i" ) ;
3036
3057
uwriteln ! ( self . src, "for (size_t {i} = 0; {i} < {len}; {i}++) {{" ) ;
3037
- let size = self . gen . gen . sizes . size ( element) . size_wasm32 ( ) ;
3038
- uwriteln ! ( self . src, "uint8_t *base = {ptr} + {i} * {size};" ) ;
3058
+ let size = self . gen . gen . sizes . size ( element) ;
3059
+ uwriteln ! (
3060
+ self . src,
3061
+ "uint8_t *base = {ptr} + {i} * {};" ,
3062
+ size. format( POINTER_SIZE_EXPRESSION )
3063
+ ) ;
3039
3064
uwriteln ! ( self . src, "(void) base;" ) ;
3040
3065
uwrite ! ( self . src, "{body}" ) ;
3041
3066
uwriteln ! ( self . src, "}}" ) ;
@@ -3272,3 +3297,5 @@ pub fn to_c_ident(name: &str) -> String {
3272
3297
s => s. to_snake_case ( ) ,
3273
3298
}
3274
3299
}
3300
+
3301
+ const POINTER_SIZE_EXPRESSION : & str = "sizeof(void*)" ;
0 commit comments