@@ -68,7 +68,7 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
68
68
src : RValue < ' gcc > ,
69
69
order : AtomicOrdering ,
70
70
) -> RValue < ' gcc > {
71
- let size = src . get_type ( ) . get_size ( ) ;
71
+ let size = get_maybe_pointer_size ( src ) ;
72
72
73
73
let func = self . current_func ( ) ;
74
74
@@ -138,7 +138,7 @@ impl<'a, 'gcc, 'tcx> Builder<'a, 'gcc, 'tcx> {
138
138
failure_order : AtomicOrdering ,
139
139
weak : bool ,
140
140
) -> RValue < ' gcc > {
141
- let size = src . get_type ( ) . get_size ( ) ;
141
+ let size = get_maybe_pointer_size ( src ) ;
142
142
let compare_exchange =
143
143
self . context . get_builtin_function ( & format ! ( "__atomic_compare_exchange_{}" , size) ) ;
144
144
let order = self . context . new_rvalue_from_int ( self . i32_type , order. to_gcc ( ) ) ;
@@ -1586,7 +1586,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
1586
1586
src : RValue < ' gcc > ,
1587
1587
order : AtomicOrdering ,
1588
1588
) -> RValue < ' gcc > {
1589
- let size = src . get_type ( ) . get_size ( ) ;
1589
+ let size = get_maybe_pointer_size ( src ) ;
1590
1590
let name = match op {
1591
1591
AtomicRmwBinOp :: AtomicXchg => format ! ( "__atomic_exchange_{}" , size) ,
1592
1592
AtomicRmwBinOp :: AtomicAdd => format ! ( "__atomic_fetch_add_{}" , size) ,
@@ -2419,3 +2419,19 @@ impl ToGccOrdering for AtomicOrdering {
2419
2419
ordering as i32
2420
2420
}
2421
2421
}
2422
+
2423
+ // Needed because gcc 12 `get_size()` doesn't work on pointers.
2424
+ #[ cfg( feature = "master" ) ]
2425
+ fn get_maybe_pointer_size ( value : RValue < ' _ > ) -> u32 {
2426
+ value. get_type ( ) . get_size ( )
2427
+ }
2428
+
2429
+ #[ cfg( not( feature = "master" ) ) ]
2430
+ fn get_maybe_pointer_size ( value : RValue < ' _ > ) -> u32 {
2431
+ let type_ = value. get_type ( ) ;
2432
+ if type_. get_pointee ( ) . is_some ( ) {
2433
+ std:: mem:: size_of :: < * const ( ) > ( ) as _
2434
+ } else {
2435
+ type_. get_size ( )
2436
+ }
2437
+ }
0 commit comments