@@ -62,22 +62,21 @@ macro intrinsic_match {
62
62
}
63
63
}
64
64
65
- macro validate_atomic_type ( $fx: ident, $intrinsic: ident, $span: ident, $ty: expr) {
66
- match $ty. kind ( ) {
67
- ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
68
- _ => {
69
- $fx. tcx . sess . span_err (
70
- $span,
71
- & format ! (
72
- "`{}` intrinsic: expected basic integer or raw pointer type, found `{:?}`" ,
73
- $intrinsic, $ty
74
- ) ,
75
- ) ;
76
- // Prevent verifier error
77
- crate :: trap:: trap_unreachable ( $fx, "compilation should not have succeeded" ) ;
78
- return ;
79
- }
80
- }
65
+ fn report_atomic_type_validation_error<' tcx>(
66
+ fx: & mut FunctionCx <' _, ' _, ' tcx>,
67
+ intrinsic: Symbol ,
68
+ span: Span ,
69
+ ty: Ty <' tcx>,
70
+ ) {
71
+ fx. tcx . sess . span_err (
72
+ span,
73
+ & format ! (
74
+ "`{}` intrinsic: expected basic integer or raw pointer type, found `{:?}`" ,
75
+ intrinsic, ty
76
+ ) ,
77
+ ) ;
78
+ // Prevent verifier error
79
+ crate :: trap:: trap_unreachable ( fx, "compilation should not have succeeded" ) ;
81
80
}
82
81
83
82
pub ( crate ) fn clif_vector_type < ' tcx > ( tcx : TyCtxt < ' tcx > , layout : TyAndLayout < ' tcx > ) -> Option < Type > {
@@ -743,7 +742,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
743
742
} ;
744
743
_ if intrinsic. as_str( ) . starts_with( "atomic_load" ) , ( v ptr) {
745
744
let ty = substs. type_at( 0 ) ;
746
- validate_atomic_type!( fx, intrinsic, span, ty) ;
745
+ match ty. kind( ) {
746
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
747
+ _ => {
748
+ report_atomic_type_validation_error( fx, intrinsic, span, ty) ;
749
+ return ;
750
+ }
751
+ }
747
752
let clif_ty = fx. clif_type( ty) . unwrap( ) ;
748
753
749
754
let val = fx. bcx. ins( ) . atomic_load( clif_ty, MemFlags :: trusted( ) , ptr) ;
@@ -752,15 +757,28 @@ fn codegen_regular_intrinsic_call<'tcx>(
752
757
ret. write_cvalue( fx, val) ;
753
758
} ;
754
759
_ if intrinsic. as_str( ) . starts_with( "atomic_store" ) , ( v ptr, c val) {
755
- validate_atomic_type!( fx, intrinsic, span, val. layout( ) . ty) ;
760
+ let ty = substs. type_at( 0 ) ;
761
+ match ty. kind( ) {
762
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
763
+ _ => {
764
+ report_atomic_type_validation_error( fx, intrinsic, span, ty) ;
765
+ return ;
766
+ }
767
+ }
756
768
757
769
let val = val. load_scalar( fx) ;
758
770
759
771
fx. bcx. ins( ) . atomic_store( MemFlags :: trusted( ) , val, ptr) ;
760
772
} ;
761
773
_ if intrinsic. as_str( ) . starts_with( "atomic_xchg" ) , ( v ptr, c new) {
762
774
let layout = new. layout( ) ;
763
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
775
+ match layout. ty. kind( ) {
776
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
777
+ _ => {
778
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
779
+ return ;
780
+ }
781
+ }
764
782
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
765
783
766
784
let new = new. load_scalar( fx) ;
@@ -772,7 +790,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
772
790
} ;
773
791
_ if intrinsic. as_str( ) . starts_with( "atomic_cxchg" ) , ( v ptr, c test_old, c new) { // both atomic_cxchg_* and atomic_cxchgweak_*
774
792
let layout = new. layout( ) ;
775
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
793
+ match layout. ty. kind( ) {
794
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
795
+ _ => {
796
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
797
+ return ;
798
+ }
799
+ }
776
800
777
801
let test_old = test_old. load_scalar( fx) ;
778
802
let new = new. load_scalar( fx) ;
@@ -786,7 +810,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
786
810
787
811
_ if intrinsic. as_str( ) . starts_with( "atomic_xadd" ) , ( v ptr, c amount) {
788
812
let layout = amount. layout( ) ;
789
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
813
+ match layout. ty. kind( ) {
814
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
815
+ _ => {
816
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
817
+ return ;
818
+ }
819
+ }
790
820
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
791
821
792
822
let amount = amount. load_scalar( fx) ;
@@ -798,7 +828,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
798
828
} ;
799
829
_ if intrinsic. as_str( ) . starts_with( "atomic_xsub" ) , ( v ptr, c amount) {
800
830
let layout = amount. layout( ) ;
801
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
831
+ match layout. ty. kind( ) {
832
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
833
+ _ => {
834
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
835
+ return ;
836
+ }
837
+ }
802
838
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
803
839
804
840
let amount = amount. load_scalar( fx) ;
@@ -810,7 +846,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
810
846
} ;
811
847
_ if intrinsic. as_str( ) . starts_with( "atomic_and" ) , ( v ptr, c src) {
812
848
let layout = src. layout( ) ;
813
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
849
+ match layout. ty. kind( ) {
850
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
851
+ _ => {
852
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
853
+ return ;
854
+ }
855
+ }
814
856
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
815
857
816
858
let src = src. load_scalar( fx) ;
@@ -822,7 +864,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
822
864
} ;
823
865
_ if intrinsic. as_str( ) . starts_with( "atomic_or" ) , ( v ptr, c src) {
824
866
let layout = src. layout( ) ;
825
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
867
+ match layout. ty. kind( ) {
868
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
869
+ _ => {
870
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
871
+ return ;
872
+ }
873
+ }
826
874
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
827
875
828
876
let src = src. load_scalar( fx) ;
@@ -834,7 +882,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
834
882
} ;
835
883
_ if intrinsic. as_str( ) . starts_with( "atomic_xor" ) , ( v ptr, c src) {
836
884
let layout = src. layout( ) ;
837
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
885
+ match layout. ty. kind( ) {
886
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
887
+ _ => {
888
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
889
+ return ;
890
+ }
891
+ }
838
892
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
839
893
840
894
let src = src. load_scalar( fx) ;
@@ -846,7 +900,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
846
900
} ;
847
901
_ if intrinsic. as_str( ) . starts_with( "atomic_nand" ) , ( v ptr, c src) {
848
902
let layout = src. layout( ) ;
849
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
903
+ match layout. ty. kind( ) {
904
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
905
+ _ => {
906
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
907
+ return ;
908
+ }
909
+ }
850
910
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
851
911
852
912
let src = src. load_scalar( fx) ;
@@ -858,7 +918,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
858
918
} ;
859
919
_ if intrinsic. as_str( ) . starts_with( "atomic_max" ) , ( v ptr, c src) {
860
920
let layout = src. layout( ) ;
861
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
921
+ match layout. ty. kind( ) {
922
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
923
+ _ => {
924
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
925
+ return ;
926
+ }
927
+ }
862
928
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
863
929
864
930
let src = src. load_scalar( fx) ;
@@ -870,7 +936,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
870
936
} ;
871
937
_ if intrinsic. as_str( ) . starts_with( "atomic_umax" ) , ( v ptr, c src) {
872
938
let layout = src. layout( ) ;
873
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
939
+ match layout. ty. kind( ) {
940
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
941
+ _ => {
942
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
943
+ return ;
944
+ }
945
+ }
874
946
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
875
947
876
948
let src = src. load_scalar( fx) ;
@@ -882,7 +954,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
882
954
} ;
883
955
_ if intrinsic. as_str( ) . starts_with( "atomic_min" ) , ( v ptr, c src) {
884
956
let layout = src. layout( ) ;
885
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
957
+ match layout. ty. kind( ) {
958
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
959
+ _ => {
960
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
961
+ return ;
962
+ }
963
+ }
886
964
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
887
965
888
966
let src = src. load_scalar( fx) ;
@@ -894,7 +972,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
894
972
} ;
895
973
_ if intrinsic. as_str( ) . starts_with( "atomic_umin" ) , ( v ptr, c src) {
896
974
let layout = src. layout( ) ;
897
- validate_atomic_type!( fx, intrinsic, span, layout. ty) ;
975
+ match layout. ty. kind( ) {
976
+ ty:: Uint ( _) | ty:: Int ( _) | ty:: RawPtr ( ..) => { }
977
+ _ => {
978
+ report_atomic_type_validation_error( fx, intrinsic, span, layout. ty) ;
979
+ return ;
980
+ }
981
+ }
898
982
let ty = fx. clif_type( layout. ty) . unwrap( ) ;
899
983
900
984
let src = src. load_scalar( fx) ;
0 commit comments