@@ -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 ) ;
@@ -1788,12 +1790,14 @@ impl InterfaceGenerator<'_> {
1788
1790
..
1789
1791
} = f;
1790
1792
1791
- if import_return_pointer_area_size > 0 {
1793
+ if ! import_return_pointer_area_size. is_empty ( ) {
1792
1794
self . src . c_adapters ( & format ! (
1793
1795
"\
1794
- __attribute__((__aligned__({import_return_pointer_area_align })))
1795
- uint8_t ret_area[{import_return_pointer_area_size }];
1796
+ __attribute__((__aligned__({})))
1797
+ uint8_t ret_area[{}];
1796
1798
" ,
1799
+ import_return_pointer_area_align. format( POINTER_SIZE_EXPRESSION ) ,
1800
+ import_return_pointer_area_size. format( POINTER_SIZE_EXPRESSION ) ,
1797
1801
) ) ;
1798
1802
}
1799
1803
@@ -2132,8 +2136,8 @@ struct FunctionBindgen<'a, 'b> {
2132
2136
params : Vec < String > ,
2133
2137
wasm_return : Option < String > ,
2134
2138
ret_store_cnt : usize ,
2135
- import_return_pointer_area_size : usize ,
2136
- import_return_pointer_area_align : usize ,
2139
+ import_return_pointer_area_size : ArchitectureSize ,
2140
+ import_return_pointer_area_align : Alignment ,
2137
2141
2138
2142
/// Borrows observed during lifting an export, that will need to be dropped when the guest
2139
2143
/// function exits.
@@ -2161,8 +2165,8 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2161
2165
params : Vec :: new ( ) ,
2162
2166
wasm_return : None ,
2163
2167
ret_store_cnt : 0 ,
2164
- import_return_pointer_area_size : 0 ,
2165
- import_return_pointer_area_align : 0 ,
2168
+ import_return_pointer_area_size : Default :: default ( ) ,
2169
+ import_return_pointer_area_align : Default :: default ( ) ,
2166
2170
borrow_decls : Default :: default ( ) ,
2167
2171
borrows : Vec :: new ( ) ,
2168
2172
}
@@ -2175,23 +2179,40 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2175
2179
self . src . push_str ( ";\n " ) ;
2176
2180
}
2177
2181
2178
- fn load ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2179
- results. push ( format ! ( "*(({}*) ({} + {}))" , ty, operands[ 0 ] , offset) ) ;
2182
+ fn load (
2183
+ & mut self ,
2184
+ ty : & str ,
2185
+ offset : ArchitectureSize ,
2186
+ operands : & [ String ] ,
2187
+ results : & mut Vec < String > ,
2188
+ ) {
2189
+ results. push ( format ! (
2190
+ "*(({}*) ({} + {}))" ,
2191
+ ty,
2192
+ operands[ 0 ] ,
2193
+ offset. format( POINTER_SIZE_EXPRESSION )
2194
+ ) ) ;
2180
2195
}
2181
2196
2182
- fn load_ext ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2197
+ fn load_ext (
2198
+ & mut self ,
2199
+ ty : & str ,
2200
+ offset : ArchitectureSize ,
2201
+ operands : & [ String ] ,
2202
+ results : & mut Vec < String > ,
2203
+ ) {
2183
2204
self . load ( ty, offset, operands, results) ;
2184
2205
let result = results. pop ( ) . unwrap ( ) ;
2185
2206
results. push ( format ! ( "(int32_t) {}" , result) ) ;
2186
2207
}
2187
2208
2188
- fn store ( & mut self , ty : & str , offset : i32 , operands : & [ String ] ) {
2209
+ fn store ( & mut self , ty : & str , offset : ArchitectureSize , operands : & [ String ] ) {
2189
2210
uwriteln ! (
2190
2211
self . src,
2191
2212
"*(({}*)({} + {})) = {};" ,
2192
2213
ty,
2193
2214
operands[ 1 ] ,
2194
- offset,
2215
+ offset. format ( POINTER_SIZE_EXPRESSION ) ,
2195
2216
operands[ 0 ]
2196
2217
) ;
2197
2218
}
@@ -2241,7 +2262,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2241
2262
self . blocks . push ( ( src. into ( ) , mem:: take ( operands) ) ) ;
2242
2263
}
2243
2264
2244
- fn return_pointer ( & mut self , size : usize , align : usize ) -> String {
2265
+ fn return_pointer ( & mut self , size : ArchitectureSize , align : Alignment ) -> String {
2245
2266
let ptr = self . locals . tmp ( "ptr" ) ;
2246
2267
2247
2268
// Use a stack-based return area for imports, because exports need
@@ -3045,8 +3066,12 @@ impl Bindgen for FunctionBindgen<'_, '_> {
3045
3066
uwriteln ! ( self . src, "uint8_t *{ptr} = {};" , operands[ 0 ] ) ;
3046
3067
let i = self . locals . tmp ( "i" ) ;
3047
3068
uwriteln ! ( self . src, "for (size_t {i} = 0; {i} < {len}; {i}++) {{" ) ;
3048
- let size = self . gen . gen . sizes . size ( element) . size_wasm32 ( ) ;
3049
- uwriteln ! ( self . src, "uint8_t *base = {ptr} + {i} * {size};" ) ;
3069
+ let size = self . gen . gen . sizes . size ( element) ;
3070
+ uwriteln ! (
3071
+ self . src,
3072
+ "uint8_t *base = {ptr} + {i} * {};" ,
3073
+ size. format( POINTER_SIZE_EXPRESSION )
3074
+ ) ;
3050
3075
uwriteln ! ( self . src, "(void) base;" ) ;
3051
3076
uwrite ! ( self . src, "{body}" ) ;
3052
3077
uwriteln ! ( self . src, "}}" ) ;
@@ -3284,3 +3309,5 @@ pub fn to_c_ident(name: &str) -> String {
3284
3309
s => s. to_snake_case ( ) ,
3285
3310
}
3286
3311
}
3312
+
3313
+ const POINTER_SIZE_EXPRESSION : & str = "sizeof(void*)" ;
0 commit comments