@@ -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 ( ) ) ;
@@ -1600,7 +1600,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
1600
1600
src : RValue < ' gcc > ,
1601
1601
order : AtomicOrdering ,
1602
1602
) -> RValue < ' gcc > {
1603
- let size = src . get_type ( ) . get_size ( ) ;
1603
+ let size = get_maybe_pointer_size ( src ) ;
1604
1604
let name = match op {
1605
1605
AtomicRmwBinOp :: AtomicXchg => format ! ( "__atomic_exchange_{}" , size) ,
1606
1606
AtomicRmwBinOp :: AtomicAdd => format ! ( "__atomic_fetch_add_{}" , size) ,
@@ -2425,3 +2425,19 @@ impl ToGccOrdering for AtomicOrdering {
2425
2425
ordering as i32
2426
2426
}
2427
2427
}
2428
+
2429
+ // Needed because gcc 12 `get_size()` doesn't work on pointers.
2430
+ #[ cfg( feature = "master" ) ]
2431
+ fn get_maybe_pointer_size ( value : RValue < ' _ > ) -> u32 {
2432
+ value. get_type ( ) . get_size ( )
2433
+ }
2434
+
2435
+ #[ cfg( not( feature = "master" ) ) ]
2436
+ fn get_maybe_pointer_size ( value : RValue < ' _ > ) -> u32 {
2437
+ let type_ = value. get_type ( ) ;
2438
+ if type_. get_pointee ( ) . is_some ( ) {
2439
+ std:: mem:: size_of :: < * const ( ) > ( ) as _
2440
+ } else {
2441
+ type_. get_size ( )
2442
+ }
2443
+ }
0 commit comments