@@ -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
@@ -2136,8 +2140,8 @@ struct FunctionBindgen<'a, 'b> {
2136
2140
params : Vec < String > ,
2137
2141
wasm_return : Option < String > ,
2138
2142
ret_store_cnt : usize ,
2139
- import_return_pointer_area_size : usize ,
2140
- import_return_pointer_area_align : usize ,
2143
+ import_return_pointer_area_size : ArchitectureSize ,
2144
+ import_return_pointer_area_align : Alignment ,
2141
2145
2142
2146
/// Borrows observed during lifting an export, that will need to be dropped when the guest
2143
2147
/// function exits.
@@ -2165,8 +2169,8 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2165
2169
params : Vec :: new ( ) ,
2166
2170
wasm_return : None ,
2167
2171
ret_store_cnt : 0 ,
2168
- import_return_pointer_area_size : 0 ,
2169
- import_return_pointer_area_align : 0 ,
2172
+ import_return_pointer_area_size : Default :: default ( ) ,
2173
+ import_return_pointer_area_align : Default :: default ( ) ,
2170
2174
borrow_decls : Default :: default ( ) ,
2171
2175
borrows : Vec :: new ( ) ,
2172
2176
}
@@ -2179,23 +2183,40 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
2179
2183
self . src . push_str ( ";\n " ) ;
2180
2184
}
2181
2185
2182
- fn load ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2183
- results. push ( format ! ( "*(({}*) ({} + {}))" , ty, operands[ 0 ] , offset) ) ;
2186
+ fn load (
2187
+ & mut self ,
2188
+ ty : & str ,
2189
+ offset : ArchitectureSize ,
2190
+ operands : & [ String ] ,
2191
+ results : & mut Vec < String > ,
2192
+ ) {
2193
+ results. push ( format ! (
2194
+ "*(({}*) ({} + {}))" ,
2195
+ ty,
2196
+ operands[ 0 ] ,
2197
+ offset. format( POINTER_SIZE_EXPRESSION )
2198
+ ) ) ;
2184
2199
}
2185
2200
2186
- fn load_ext ( & mut self , ty : & str , offset : i32 , operands : & [ String ] , results : & mut Vec < String > ) {
2201
+ fn load_ext (
2202
+ & mut self ,
2203
+ ty : & str ,
2204
+ offset : ArchitectureSize ,
2205
+ operands : & [ String ] ,
2206
+ results : & mut Vec < String > ,
2207
+ ) {
2187
2208
self . load ( ty, offset, operands, results) ;
2188
2209
let result = results. pop ( ) . unwrap ( ) ;
2189
2210
results. push ( format ! ( "(int32_t) {}" , result) ) ;
2190
2211
}
2191
2212
2192
- fn store ( & mut self , ty : & str , offset : i32 , operands : & [ String ] ) {
2213
+ fn store ( & mut self , ty : & str , offset : ArchitectureSize , operands : & [ String ] ) {
2193
2214
uwriteln ! (
2194
2215
self . src,
2195
2216
"*(({}*)({} + {})) = {};" ,
2196
2217
ty,
2197
2218
operands[ 1 ] ,
2198
- offset,
2219
+ offset. format ( POINTER_SIZE_EXPRESSION ) ,
2199
2220
operands[ 0 ]
2200
2221
) ;
2201
2222
}
@@ -2245,7 +2266,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
2245
2266
self . blocks . push ( ( src. into ( ) , mem:: take ( operands) ) ) ;
2246
2267
}
2247
2268
2248
- fn return_pointer ( & mut self , size : usize , align : usize ) -> String {
2269
+ fn return_pointer ( & mut self , size : ArchitectureSize , align : Alignment ) -> String {
2249
2270
let ptr = self . locals . tmp ( "ptr" ) ;
2250
2271
2251
2272
// Use a stack-based return area for imports, because exports need
@@ -3049,8 +3070,12 @@ impl Bindgen for FunctionBindgen<'_, '_> {
3049
3070
uwriteln ! ( self . src, "uint8_t *{ptr} = {};" , operands[ 0 ] ) ;
3050
3071
let i = self . locals . tmp ( "i" ) ;
3051
3072
uwriteln ! ( self . src, "for (size_t {i} = 0; {i} < {len}; {i}++) {{" ) ;
3052
- let size = self . gen . gen . sizes . size ( element) . size_wasm32 ( ) ;
3053
- uwriteln ! ( self . src, "uint8_t *base = {ptr} + {i} * {size};" ) ;
3073
+ let size = self . gen . gen . sizes . size ( element) ;
3074
+ uwriteln ! (
3075
+ self . src,
3076
+ "uint8_t *base = {ptr} + {i} * {};" ,
3077
+ size. format( POINTER_SIZE_EXPRESSION )
3078
+ ) ;
3054
3079
uwriteln ! ( self . src, "(void) base;" ) ;
3055
3080
uwrite ! ( self . src, "{body}" ) ;
3056
3081
uwriteln ! ( self . src, "}}" ) ;
@@ -3288,3 +3313,5 @@ pub fn to_c_ident(name: &str) -> String {
3288
3313
s => s. to_snake_case ( ) ,
3289
3314
}
3290
3315
}
3316
+
3317
+ const POINTER_SIZE_EXPRESSION : & str = "sizeof(void*)" ;
0 commit comments