Skip to content

Commit bb1b5cd

Browse files
committed
Remove validate_atomic_type
By expanding it in place. Also extract a common report_atomic_type_validation_error function to reduce code duplication.
1 parent 5efd778 commit bb1b5cd

File tree

1 file changed

+114
-30
lines changed

1 file changed

+114
-30
lines changed

src/intrinsics/mod.rs

Lines changed: 114 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8382
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>(
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

Comments
 (0)