@@ -62,22 +62,21 @@ macro intrinsic_match {
6262 }
6363}
6464
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" ) ;
8180}
8281
8382pub ( crate ) fn clif_vector_type < ' tcx > ( tcx : TyCtxt < ' tcx > , layout : TyAndLayout < ' tcx > ) -> Option < Type > {
@@ -743,7 +742,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
743742 } ;
744743 _ if intrinsic. as_str( ) . starts_with( "atomic_load" ) , ( v ptr) {
745744 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+ }
747752 let clif_ty = fx. clif_type( ty) . unwrap( ) ;
748753
749754 let val = fx. bcx. ins( ) . atomic_load( clif_ty, MemFlags :: trusted( ) , ptr) ;
@@ -752,15 +757,28 @@ fn codegen_regular_intrinsic_call<'tcx>(
752757 ret. write_cvalue( fx, val) ;
753758 } ;
754759 _ 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+ }
756768
757769 let val = val. load_scalar( fx) ;
758770
759771 fx. bcx. ins( ) . atomic_store( MemFlags :: trusted( ) , val, ptr) ;
760772 } ;
761773 _ if intrinsic. as_str( ) . starts_with( "atomic_xchg" ) , ( v ptr, c new) {
762774 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+ }
764782 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
765783
766784 let new = new. load_scalar( fx) ;
@@ -772,7 +790,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
772790 } ;
773791 _ if intrinsic. as_str( ) . starts_with( "atomic_cxchg" ) , ( v ptr, c test_old, c new) { // both atomic_cxchg_* and atomic_cxchgweak_*
774792 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+ }
776800
777801 let test_old = test_old. load_scalar( fx) ;
778802 let new = new. load_scalar( fx) ;
@@ -786,7 +810,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
786810
787811 _ if intrinsic. as_str( ) . starts_with( "atomic_xadd" ) , ( v ptr, c amount) {
788812 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+ }
790820 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
791821
792822 let amount = amount. load_scalar( fx) ;
@@ -798,7 +828,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
798828 } ;
799829 _ if intrinsic. as_str( ) . starts_with( "atomic_xsub" ) , ( v ptr, c amount) {
800830 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+ }
802838 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
803839
804840 let amount = amount. load_scalar( fx) ;
@@ -810,7 +846,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
810846 } ;
811847 _ if intrinsic. as_str( ) . starts_with( "atomic_and" ) , ( v ptr, c src) {
812848 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+ }
814856 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
815857
816858 let src = src. load_scalar( fx) ;
@@ -822,7 +864,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
822864 } ;
823865 _ if intrinsic. as_str( ) . starts_with( "atomic_or" ) , ( v ptr, c src) {
824866 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+ }
826874 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
827875
828876 let src = src. load_scalar( fx) ;
@@ -834,7 +882,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
834882 } ;
835883 _ if intrinsic. as_str( ) . starts_with( "atomic_xor" ) , ( v ptr, c src) {
836884 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+ }
838892 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
839893
840894 let src = src. load_scalar( fx) ;
@@ -846,7 +900,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
846900 } ;
847901 _ if intrinsic. as_str( ) . starts_with( "atomic_nand" ) , ( v ptr, c src) {
848902 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+ }
850910 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
851911
852912 let src = src. load_scalar( fx) ;
@@ -858,7 +918,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
858918 } ;
859919 _ if intrinsic. as_str( ) . starts_with( "atomic_max" ) , ( v ptr, c src) {
860920 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+ }
862928 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
863929
864930 let src = src. load_scalar( fx) ;
@@ -870,7 +936,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
870936 } ;
871937 _ if intrinsic. as_str( ) . starts_with( "atomic_umax" ) , ( v ptr, c src) {
872938 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+ }
874946 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
875947
876948 let src = src. load_scalar( fx) ;
@@ -882,7 +954,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
882954 } ;
883955 _ if intrinsic. as_str( ) . starts_with( "atomic_min" ) , ( v ptr, c src) {
884956 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+ }
886964 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
887965
888966 let src = src. load_scalar( fx) ;
@@ -894,7 +972,13 @@ fn codegen_regular_intrinsic_call<'tcx>(
894972 } ;
895973 _ if intrinsic. as_str( ) . starts_with( "atomic_umin" ) , ( v ptr, c src) {
896974 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+ }
898982 let ty = fx. clif_type( layout. ty) . unwrap( ) ;
899983
900984 let src = src. load_scalar( fx) ;
0 commit comments