@@ -520,356 +520,359 @@ static morder to_morder(int mo) {
520
520
return res;
521
521
}
522
522
523
- # define ATOMIC_IMPL (func, mo, ...) \
524
- ThreadState *const thr = cur_thread(); \
525
- ProcessPendingSignals (thr); \
526
- if (UNLIKELY(thr->ignore_sync || thr->ignore_interceptors)) \
527
- return Op##func::NoTsanAtomic(mo, ##__VA_ARGS__); \
528
- return Op##func::Atomic(thr, GET_CALLER_PC(), convert_morder(mo), \
529
- ##__VA_ARGS__);
523
+ template <class Op , class ... Types>
524
+ ALWAYS_INLINE auto AtomicImpl (morder mo, Types... args) {
525
+ ThreadState *const thr = cur_thread ();
526
+ ProcessPendingSignals (thr);
527
+ if (UNLIKELY (thr->ignore_sync || thr->ignore_interceptors ))
528
+ return Op::NoTsanAtomic (mo, args...);
529
+ return Op::Atomic (thr, GET_CALLER_PC (), convert_morder (mo), args...);
530
+ }
530
531
531
532
extern " C" {
532
533
SANITIZER_INTERFACE_ATTRIBUTE
533
534
a8 __tsan_atomic8_load (const volatile a8 *a, int mo) {
534
- ATOMIC_IMPL (Load, to_morder (mo), a);
535
+ return AtomicImpl<OpLoad>( to_morder (mo), a);
535
536
}
536
537
537
538
SANITIZER_INTERFACE_ATTRIBUTE
538
539
a16 __tsan_atomic16_load (const volatile a16 *a, int mo) {
539
- ATOMIC_IMPL (Load, to_morder (mo), a);
540
+ return AtomicImpl<OpLoad>( to_morder (mo), a);
540
541
}
541
542
542
543
SANITIZER_INTERFACE_ATTRIBUTE
543
544
a32 __tsan_atomic32_load (const volatile a32 *a, int mo) {
544
- ATOMIC_IMPL (Load, to_morder (mo), a);
545
+ return AtomicImpl<OpLoad>( to_morder (mo), a);
545
546
}
546
547
547
548
SANITIZER_INTERFACE_ATTRIBUTE
548
549
a64 __tsan_atomic64_load (const volatile a64 *a, int mo) {
549
- ATOMIC_IMPL (Load, to_morder (mo), a);
550
+ return AtomicImpl<OpLoad>( to_morder (mo), a);
550
551
}
551
552
552
553
# if __TSAN_HAS_INT128
553
554
SANITIZER_INTERFACE_ATTRIBUTE
554
555
a128 __tsan_atomic128_load (const volatile a128 *a, int mo) {
555
- ATOMIC_IMPL (Load, to_morder (mo), a);
556
+ return AtomicImpl<OpLoad>( to_morder (mo), a);
556
557
}
557
558
# endif
558
559
559
560
SANITIZER_INTERFACE_ATTRIBUTE
560
561
void __tsan_atomic8_store (volatile a8 *a, a8 v, int mo) {
561
- ATOMIC_IMPL (Store, to_morder (mo), a, v);
562
+ return AtomicImpl<OpStore>( to_morder (mo), a, v);
562
563
}
563
564
564
565
SANITIZER_INTERFACE_ATTRIBUTE
565
566
void __tsan_atomic16_store (volatile a16 *a, a16 v, int mo) {
566
- ATOMIC_IMPL (Store, to_morder (mo), a, v);
567
+ return AtomicImpl<OpStore>( to_morder (mo), a, v);
567
568
}
568
569
569
570
SANITIZER_INTERFACE_ATTRIBUTE
570
571
void __tsan_atomic32_store (volatile a32 *a, a32 v, int mo) {
571
- ATOMIC_IMPL (Store, to_morder (mo), a, v);
572
+ return AtomicImpl<OpStore>( to_morder (mo), a, v);
572
573
}
573
574
574
575
SANITIZER_INTERFACE_ATTRIBUTE
575
576
void __tsan_atomic64_store (volatile a64 *a, a64 v, int mo) {
576
- ATOMIC_IMPL (Store, to_morder (mo), a, v);
577
+ return AtomicImpl<OpStore>( to_morder (mo), a, v);
577
578
}
578
579
579
580
# if __TSAN_HAS_INT128
580
581
SANITIZER_INTERFACE_ATTRIBUTE
581
582
void __tsan_atomic128_store (volatile a128 *a, a128 v, int mo) {
582
- ATOMIC_IMPL (Store, to_morder (mo), a, v);
583
+ return AtomicImpl<OpStore>( to_morder (mo), a, v);
583
584
}
584
585
# endif
585
586
586
587
SANITIZER_INTERFACE_ATTRIBUTE
587
588
a8 __tsan_atomic8_exchange (volatile a8 *a, a8 v, int mo) {
588
- ATOMIC_IMPL (Exchange, to_morder (mo), a, v);
589
+ return AtomicImpl<OpExchange>( to_morder (mo), a, v);
589
590
}
590
591
591
592
SANITIZER_INTERFACE_ATTRIBUTE
592
593
a16 __tsan_atomic16_exchange (volatile a16 *a, a16 v, int mo) {
593
- ATOMIC_IMPL (Exchange, to_morder (mo), a, v);
594
+ return AtomicImpl<OpExchange>( to_morder (mo), a, v);
594
595
}
595
596
596
597
SANITIZER_INTERFACE_ATTRIBUTE
597
598
a32 __tsan_atomic32_exchange (volatile a32 *a, a32 v, int mo) {
598
- ATOMIC_IMPL (Exchange, to_morder (mo), a, v);
599
+ return AtomicImpl<OpExchange>( to_morder (mo), a, v);
599
600
}
600
601
601
602
SANITIZER_INTERFACE_ATTRIBUTE
602
603
a64 __tsan_atomic64_exchange (volatile a64 *a, a64 v, int mo) {
603
- ATOMIC_IMPL (Exchange, to_morder (mo), a, v);
604
+ return AtomicImpl<OpExchange>( to_morder (mo), a, v);
604
605
}
605
606
606
607
# if __TSAN_HAS_INT128
607
608
SANITIZER_INTERFACE_ATTRIBUTE
608
609
a128 __tsan_atomic128_exchange (volatile a128 *a, a128 v, int mo) {
609
- ATOMIC_IMPL (Exchange, to_morder (mo), a, v);
610
+ return AtomicImpl<OpExchange>( to_morder (mo), a, v);
610
611
}
611
612
# endif
612
613
613
614
SANITIZER_INTERFACE_ATTRIBUTE
614
615
a8 __tsan_atomic8_fetch_add (volatile a8 *a, a8 v, int mo) {
615
- ATOMIC_IMPL (FetchAdd, to_morder (mo), a, v);
616
+ return AtomicImpl<OpFetchAdd>( to_morder (mo), a, v);
616
617
}
617
618
618
619
SANITIZER_INTERFACE_ATTRIBUTE
619
620
a16 __tsan_atomic16_fetch_add (volatile a16 *a, a16 v, int mo) {
620
- ATOMIC_IMPL (FetchAdd, to_morder (mo), a, v);
621
+ return AtomicImpl<OpFetchAdd>( to_morder (mo), a, v);
621
622
}
622
623
623
624
SANITIZER_INTERFACE_ATTRIBUTE
624
625
a32 __tsan_atomic32_fetch_add (volatile a32 *a, a32 v, int mo) {
625
- ATOMIC_IMPL (FetchAdd, to_morder (mo), a, v);
626
+ return AtomicImpl<OpFetchAdd>( to_morder (mo), a, v);
626
627
}
627
628
628
629
SANITIZER_INTERFACE_ATTRIBUTE
629
630
a64 __tsan_atomic64_fetch_add (volatile a64 *a, a64 v, int mo) {
630
- ATOMIC_IMPL (FetchAdd, to_morder (mo), a, v);
631
+ return AtomicImpl<OpFetchAdd>( to_morder (mo), a, v);
631
632
}
632
633
633
634
# if __TSAN_HAS_INT128
634
635
SANITIZER_INTERFACE_ATTRIBUTE
635
636
a128 __tsan_atomic128_fetch_add (volatile a128 *a, a128 v, int mo) {
636
- ATOMIC_IMPL (FetchAdd, to_morder (mo), a, v);
637
+ return AtomicImpl<OpFetchAdd>( to_morder (mo), a, v);
637
638
}
638
639
# endif
639
640
640
641
SANITIZER_INTERFACE_ATTRIBUTE
641
642
a8 __tsan_atomic8_fetch_sub (volatile a8 *a, a8 v, int mo) {
642
- ATOMIC_IMPL (FetchSub, to_morder (mo), a, v);
643
+ return AtomicImpl<OpFetchSub>( to_morder (mo), a, v);
643
644
}
644
645
645
646
SANITIZER_INTERFACE_ATTRIBUTE
646
647
a16 __tsan_atomic16_fetch_sub (volatile a16 *a, a16 v, int mo) {
647
- ATOMIC_IMPL (FetchSub, to_morder (mo), a, v);
648
+ return AtomicImpl<OpFetchSub>( to_morder (mo), a, v);
648
649
}
649
650
650
651
SANITIZER_INTERFACE_ATTRIBUTE
651
652
a32 __tsan_atomic32_fetch_sub (volatile a32 *a, a32 v, int mo) {
652
- ATOMIC_IMPL (FetchSub, to_morder (mo), a, v);
653
+ return AtomicImpl<OpFetchSub>( to_morder (mo), a, v);
653
654
}
654
655
655
656
SANITIZER_INTERFACE_ATTRIBUTE
656
657
a64 __tsan_atomic64_fetch_sub (volatile a64 *a, a64 v, int mo) {
657
- ATOMIC_IMPL (FetchSub, to_morder (mo), a, v);
658
+ return AtomicImpl<OpFetchSub>( to_morder (mo), a, v);
658
659
}
659
660
660
661
# if __TSAN_HAS_INT128
661
662
SANITIZER_INTERFACE_ATTRIBUTE
662
663
a128 __tsan_atomic128_fetch_sub (volatile a128 *a, a128 v, int mo) {
663
- ATOMIC_IMPL (FetchSub, to_morder (mo), a, v);
664
+ return AtomicImpl<OpFetchSub>( to_morder (mo), a, v);
664
665
}
665
666
# endif
666
667
667
668
SANITIZER_INTERFACE_ATTRIBUTE
668
669
a8 __tsan_atomic8_fetch_and (volatile a8 *a, a8 v, int mo) {
669
- ATOMIC_IMPL (FetchAnd, to_morder (mo), a, v);
670
+ return AtomicImpl<OpFetchAnd>( to_morder (mo), a, v);
670
671
}
671
672
672
673
SANITIZER_INTERFACE_ATTRIBUTE
673
674
a16 __tsan_atomic16_fetch_and (volatile a16 *a, a16 v, int mo) {
674
- ATOMIC_IMPL (FetchAnd, to_morder (mo), a, v);
675
+ return AtomicImpl<OpFetchAnd>( to_morder (mo), a, v);
675
676
}
676
677
677
678
SANITIZER_INTERFACE_ATTRIBUTE
678
679
a32 __tsan_atomic32_fetch_and (volatile a32 *a, a32 v, int mo) {
679
- ATOMIC_IMPL (FetchAnd, to_morder (mo), a, v);
680
+ return AtomicImpl<OpFetchAnd>( to_morder (mo), a, v);
680
681
}
681
682
682
683
SANITIZER_INTERFACE_ATTRIBUTE
683
684
a64 __tsan_atomic64_fetch_and (volatile a64 *a, a64 v, int mo) {
684
- ATOMIC_IMPL (FetchAnd, to_morder (mo), a, v);
685
+ return AtomicImpl<OpFetchAnd>( to_morder (mo), a, v);
685
686
}
686
687
687
688
# if __TSAN_HAS_INT128
688
689
SANITIZER_INTERFACE_ATTRIBUTE
689
690
a128 __tsan_atomic128_fetch_and (volatile a128 *a, a128 v, int mo) {
690
- ATOMIC_IMPL (FetchAnd, to_morder (mo), a, v);
691
+ return AtomicImpl<OpFetchAnd>( to_morder (mo), a, v);
691
692
}
692
693
# endif
693
694
694
695
SANITIZER_INTERFACE_ATTRIBUTE
695
696
a8 __tsan_atomic8_fetch_or (volatile a8 *a, a8 v, int mo) {
696
- ATOMIC_IMPL (FetchOr, to_morder (mo), a, v);
697
+ return AtomicImpl<OpFetchOr>( to_morder (mo), a, v);
697
698
}
698
699
699
700
SANITIZER_INTERFACE_ATTRIBUTE
700
701
a16 __tsan_atomic16_fetch_or (volatile a16 *a, a16 v, int mo) {
701
- ATOMIC_IMPL (FetchOr, to_morder (mo), a, v);
702
+ return AtomicImpl<OpFetchOr>( to_morder (mo), a, v);
702
703
}
703
704
704
705
SANITIZER_INTERFACE_ATTRIBUTE
705
706
a32 __tsan_atomic32_fetch_or (volatile a32 *a, a32 v, int mo) {
706
- ATOMIC_IMPL (FetchOr, to_morder (mo), a, v);
707
+ return AtomicImpl<OpFetchOr>( to_morder (mo), a, v);
707
708
}
708
709
709
710
SANITIZER_INTERFACE_ATTRIBUTE
710
711
a64 __tsan_atomic64_fetch_or (volatile a64 *a, a64 v, int mo) {
711
- ATOMIC_IMPL (FetchOr, to_morder (mo), a, v);
712
+ return AtomicImpl<OpFetchOr>( to_morder (mo), a, v);
712
713
}
713
714
714
715
# if __TSAN_HAS_INT128
715
716
SANITIZER_INTERFACE_ATTRIBUTE
716
717
a128 __tsan_atomic128_fetch_or (volatile a128 *a, a128 v, int mo) {
717
- ATOMIC_IMPL (FetchOr, to_morder (mo), a, v);
718
+ return AtomicImpl<OpFetchOr>( to_morder (mo), a, v);
718
719
}
719
720
# endif
720
721
721
722
SANITIZER_INTERFACE_ATTRIBUTE
722
723
a8 __tsan_atomic8_fetch_xor (volatile a8 *a, a8 v, int mo) {
723
- ATOMIC_IMPL (FetchXor, to_morder (mo), a, v);
724
+ return AtomicImpl<OpFetchXor>( to_morder (mo), a, v);
724
725
}
725
726
726
727
SANITIZER_INTERFACE_ATTRIBUTE
727
728
a16 __tsan_atomic16_fetch_xor (volatile a16 *a, a16 v, int mo) {
728
- ATOMIC_IMPL (FetchXor, to_morder (mo), a, v);
729
+ return AtomicImpl<OpFetchXor>( to_morder (mo), a, v);
729
730
}
730
731
731
732
SANITIZER_INTERFACE_ATTRIBUTE
732
733
a32 __tsan_atomic32_fetch_xor (volatile a32 *a, a32 v, int mo) {
733
- ATOMIC_IMPL (FetchXor, to_morder (mo), a, v);
734
+ return AtomicImpl<OpFetchXor>( to_morder (mo), a, v);
734
735
}
735
736
736
737
SANITIZER_INTERFACE_ATTRIBUTE
737
738
a64 __tsan_atomic64_fetch_xor (volatile a64 *a, a64 v, int mo) {
738
- ATOMIC_IMPL (FetchXor, to_morder (mo), a, v);
739
+ return AtomicImpl<OpFetchXor>( to_morder (mo), a, v);
739
740
}
740
741
741
742
# if __TSAN_HAS_INT128
742
743
SANITIZER_INTERFACE_ATTRIBUTE
743
744
a128 __tsan_atomic128_fetch_xor (volatile a128 *a, a128 v, int mo) {
744
- ATOMIC_IMPL (FetchXor, to_morder (mo), a, v);
745
+ return AtomicImpl<OpFetchXor>( to_morder (mo), a, v);
745
746
}
746
747
# endif
747
748
748
749
SANITIZER_INTERFACE_ATTRIBUTE
749
750
a8 __tsan_atomic8_fetch_nand (volatile a8 *a, a8 v, int mo) {
750
- ATOMIC_IMPL (FetchNand, to_morder (mo), a, v);
751
+ return AtomicImpl<OpFetchNand>( to_morder (mo), a, v);
751
752
}
752
753
753
754
SANITIZER_INTERFACE_ATTRIBUTE
754
755
a16 __tsan_atomic16_fetch_nand (volatile a16 *a, a16 v, int mo) {
755
- ATOMIC_IMPL (FetchNand, to_morder (mo), a, v);
756
+ return AtomicImpl<OpFetchNand>( to_morder (mo), a, v);
756
757
}
757
758
758
759
SANITIZER_INTERFACE_ATTRIBUTE
759
760
a32 __tsan_atomic32_fetch_nand (volatile a32 *a, a32 v, int mo) {
760
- ATOMIC_IMPL (FetchNand, to_morder (mo), a, v);
761
+ return AtomicImpl<OpFetchNand>( to_morder (mo), a, v);
761
762
}
762
763
763
764
SANITIZER_INTERFACE_ATTRIBUTE
764
765
a64 __tsan_atomic64_fetch_nand (volatile a64 *a, a64 v, int mo) {
765
- ATOMIC_IMPL (FetchNand, to_morder (mo), a, v);
766
+ return AtomicImpl<OpFetchNand>( to_morder (mo), a, v);
766
767
}
767
768
768
769
# if __TSAN_HAS_INT128
769
770
SANITIZER_INTERFACE_ATTRIBUTE
770
771
a128 __tsan_atomic128_fetch_nand (volatile a128 *a, a128 v, int mo) {
771
- ATOMIC_IMPL (FetchNand, to_morder (mo), a, v);
772
+ return AtomicImpl<OpFetchNand>( to_morder (mo), a, v);
772
773
}
773
774
# endif
774
775
775
776
SANITIZER_INTERFACE_ATTRIBUTE
776
777
int __tsan_atomic8_compare_exchange_strong (volatile a8 *a, a8 *c, a8 v, int mo,
777
778
int fmo) {
778
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
779
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
779
780
}
780
781
781
782
SANITIZER_INTERFACE_ATTRIBUTE
782
783
int __tsan_atomic16_compare_exchange_strong (volatile a16 *a, a16 *c, a16 v,
783
784
int mo, int fmo) {
784
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
785
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
785
786
}
786
787
787
788
SANITIZER_INTERFACE_ATTRIBUTE
788
789
int __tsan_atomic32_compare_exchange_strong (volatile a32 *a, a32 *c, a32 v,
789
790
int mo, int fmo) {
790
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
791
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
791
792
}
792
793
793
794
SANITIZER_INTERFACE_ATTRIBUTE
794
795
int __tsan_atomic64_compare_exchange_strong (volatile a64 *a, a64 *c, a64 v,
795
796
int mo, int fmo) {
796
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
797
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
797
798
}
798
799
799
800
# if __TSAN_HAS_INT128
800
801
SANITIZER_INTERFACE_ATTRIBUTE
801
802
int __tsan_atomic128_compare_exchange_strong (volatile a128 *a, a128 *c, a128 v,
802
803
int mo, int fmo) {
803
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
804
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
804
805
}
805
806
# endif
806
807
807
808
SANITIZER_INTERFACE_ATTRIBUTE
808
809
int __tsan_atomic8_compare_exchange_weak (volatile a8 *a, a8 *c, a8 v, int mo,
809
810
int fmo) {
810
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
811
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
811
812
}
812
813
813
814
SANITIZER_INTERFACE_ATTRIBUTE
814
815
int __tsan_atomic16_compare_exchange_weak (volatile a16 *a, a16 *c, a16 v,
815
816
int mo, int fmo) {
816
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
817
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
817
818
}
818
819
819
820
SANITIZER_INTERFACE_ATTRIBUTE
820
821
int __tsan_atomic32_compare_exchange_weak (volatile a32 *a, a32 *c, a32 v,
821
822
int mo, int fmo) {
822
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
823
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
823
824
}
824
825
825
826
SANITIZER_INTERFACE_ATTRIBUTE
826
827
int __tsan_atomic64_compare_exchange_weak (volatile a64 *a, a64 *c, a64 v,
827
828
int mo, int fmo) {
828
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
829
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
829
830
}
830
831
831
832
# if __TSAN_HAS_INT128
832
833
SANITIZER_INTERFACE_ATTRIBUTE
833
834
int __tsan_atomic128_compare_exchange_weak (volatile a128 *a, a128 *c, a128 v,
834
835
int mo, int fmo) {
835
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
836
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
836
837
}
837
838
# endif
838
839
839
840
SANITIZER_INTERFACE_ATTRIBUTE
840
841
a8 __tsan_atomic8_compare_exchange_val (volatile a8 *a, a8 c, a8 v, int mo,
841
842
int fmo) {
842
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
843
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
843
844
}
844
845
845
846
SANITIZER_INTERFACE_ATTRIBUTE
846
847
a16 __tsan_atomic16_compare_exchange_val (volatile a16 *a, a16 c, a16 v, int mo,
847
848
int fmo) {
848
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
849
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
849
850
}
850
851
851
852
SANITIZER_INTERFACE_ATTRIBUTE
852
853
a32 __tsan_atomic32_compare_exchange_val (volatile a32 *a, a32 c, a32 v, int mo,
853
854
int fmo) {
854
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
855
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
855
856
}
856
857
857
858
SANITIZER_INTERFACE_ATTRIBUTE
858
859
a64 __tsan_atomic64_compare_exchange_val (volatile a64 *a, a64 c, a64 v, int mo,
859
860
int fmo) {
860
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
861
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
861
862
}
862
863
863
864
# if __TSAN_HAS_INT128
864
865
SANITIZER_INTERFACE_ATTRIBUTE
865
866
a128 __tsan_atomic128_compare_exchange_val (volatile a128 *a, a128 c, a128 v,
866
867
int mo, int fmo) {
867
- ATOMIC_IMPL (CAS, to_morder (mo), to_morder (fmo), a, c, v);
868
+ return AtomicImpl<OpCAS>( to_morder (mo), to_morder (fmo), a, c, v);
868
869
}
869
870
# endif
870
871
871
872
SANITIZER_INTERFACE_ATTRIBUTE
872
- void __tsan_atomic_thread_fence (int mo) { ATOMIC_IMPL (Fence, to_morder (mo)); }
873
+ void __tsan_atomic_thread_fence (int mo) {
874
+ return AtomicImpl<OpFence>(to_morder (mo));
875
+ }
873
876
874
877
SANITIZER_INTERFACE_ATTRIBUTE
875
878
void __tsan_atomic_signal_fence (int mo) {}
@@ -879,110 +882,113 @@ void __tsan_atomic_signal_fence(int mo) {}
879
882
880
883
// Go
881
884
882
- # define ATOMIC (func, ...) \
883
- if (thr->ignore_sync) { \
884
- Op##func::NoTsanAtomic (__VA_ARGS__); \
885
- } else { \
886
- FuncEntry (thr, cpc); \
887
- Op##func::Atomic (thr, pc, __VA_ARGS__); \
888
- FuncExit (thr); \
889
- }
885
+ template <class Op , class ... Types>
886
+ void AtomicGo (ThreadState *thr, uptr cpc, uptr pc, Types... args) {
887
+ if (thr->ignore_sync ) {
888
+ (void )Op::NoTsanAtomic (args...);
889
+ } else {
890
+ FuncEntry (thr, cpc);
891
+ (void )Op::Atomic (thr, pc, args...);
892
+ FuncExit (thr);
893
+ }
894
+ }
890
895
891
- # define ATOMIC_RET (func, ret, ...) \
892
- if (thr->ignore_sync) { \
893
- (ret) = Op##func::NoTsanAtomic (__VA_ARGS__); \
894
- } else { \
895
- FuncEntry (thr, cpc); \
896
- (ret) = Op##func::Atomic (thr, pc, __VA_ARGS__); \
897
- FuncExit (thr); \
898
- }
896
+ template <class Op , class ... Types>
897
+ auto AtomicGoRet (ThreadState *thr, uptr cpc, uptr pc, Types... args) {
898
+ if (thr->ignore_sync ) {
899
+ return Op::NoTsanAtomic (args...);
900
+ } else {
901
+ FuncEntry (thr, cpc);
902
+ auto ret = Op::Atomic (thr, pc, args...);
903
+ FuncExit (thr);
904
+ return ret;
905
+ }
906
+ }
899
907
900
908
extern " C" {
901
909
SANITIZER_INTERFACE_ATTRIBUTE
902
910
void __tsan_go_atomic32_load (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
903
- ATOMIC_RET (Load, *(a32 *)(a + 8 ), mo_acquire, *(a32 **)a);
911
+ *(a32 *)(a + 8 ) = AtomicGoRet<OpLoad>(thr, cpc, pc , mo_acquire, *(a32 **)a);
904
912
}
905
913
906
914
SANITIZER_INTERFACE_ATTRIBUTE
907
915
void __tsan_go_atomic64_load (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
908
- ATOMIC_RET (Load, *(a64 *)(a + 8 ), mo_acquire, *(a64 **)a);
916
+ *(a64 *)(a + 8 ) = AtomicGoRet<OpLoad>(thr, cpc, pc , mo_acquire, *(a64 **)a);
909
917
}
910
918
911
919
SANITIZER_INTERFACE_ATTRIBUTE
912
920
void __tsan_go_atomic32_store (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
913
- ATOMIC (Store , mo_release, *(a32 **)a, *(a32 *)(a + 8 ));
921
+ AtomicGo<OpStore>(thr, cpc, pc , mo_release, *(a32 **)a, *(a32 *)(a + 8 ));
914
922
}
915
923
916
924
SANITIZER_INTERFACE_ATTRIBUTE
917
925
void __tsan_go_atomic64_store (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
918
- ATOMIC (Store , mo_release, *(a64 **)a, *(a64 *)(a + 8 ));
926
+ AtomicGo<OpStore>(thr, cpc, pc , mo_release, *(a64 **)a, *(a64 *)(a + 8 ));
919
927
}
920
928
921
929
SANITIZER_INTERFACE_ATTRIBUTE
922
930
void __tsan_go_atomic32_fetch_add (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
923
- ATOMIC_RET (FetchAdd, *(a32 *)(a + 16 ), mo_acq_rel, *(a32 **)a ,
924
- *(a32 *)(a + 8 ));
931
+ *(a32 *)(a + 16 ) = AtomicGoRet<OpFetchAdd>(thr, cpc, pc, mo_acq_rel ,
932
+ *(a32 **)a, *(a32 *)(a + 8 ));
925
933
}
926
934
927
935
SANITIZER_INTERFACE_ATTRIBUTE
928
936
void __tsan_go_atomic64_fetch_add (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
929
- ATOMIC_RET (FetchAdd, *(a64 *)(a + 16 ), mo_acq_rel, *(a64 **)a ,
930
- *(a64 *)(a + 8 ));
937
+ *(a64 *)(a + 16 ) = AtomicGoRet<OpFetchAdd>(thr, cpc, pc, mo_acq_rel ,
938
+ *(a64 **)a, *(a64 *)(a + 8 ));
931
939
}
932
940
933
941
SANITIZER_INTERFACE_ATTRIBUTE
934
942
void __tsan_go_atomic32_fetch_and (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
935
- ATOMIC_RET (FetchAnd, *(a32 *)(a + 16 ), mo_acq_rel, *(a32 **)a ,
936
- *(a32 *)(a + 8 ));
943
+ *(a32 *)(a + 16 ) = AtomicGoRet<OpFetchAnd>(thr, cpc, pc, mo_acq_rel ,
944
+ *(a32 **)a, *(a32 *)(a + 8 ));
937
945
}
938
946
939
947
SANITIZER_INTERFACE_ATTRIBUTE
940
948
void __tsan_go_atomic64_fetch_and (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
941
- ATOMIC_RET (FetchAnd, *(a64 *)(a + 16 ), mo_acq_rel, *(a64 **)a ,
942
- *(a64 *)(a + 8 ));
949
+ *(a64 *)(a + 16 ) = AtomicGoRet<OpFetchAnd>(thr, cpc, pc, mo_acq_rel ,
950
+ *(a64 **)a, *(a64 *)(a + 8 ));
943
951
}
944
952
945
953
SANITIZER_INTERFACE_ATTRIBUTE
946
954
void __tsan_go_atomic32_fetch_or (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
947
- ATOMIC_RET (FetchOr, *(a32 *)(a + 16 ), mo_acq_rel, *(a32 **)a ,
948
- *(a32 *)(a + 8 ));
955
+ *(a32 *)(a + 16 ) = AtomicGoRet<OpFetchOr>(thr, cpc, pc, mo_acq_rel ,
956
+ *(a32 **)a, *(a32 *)(a + 8 ));
949
957
}
950
958
951
959
SANITIZER_INTERFACE_ATTRIBUTE
952
960
void __tsan_go_atomic64_fetch_or (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
953
- ATOMIC_RET (FetchOr, *(a64 *)(a + 16 ), mo_acq_rel, *(a64 **)a ,
954
- *(a64 *)(a + 8 ));
961
+ *(a64 *)(a + 16 ) = AtomicGoRet<OpFetchOr>(thr, cpc, pc, mo_acq_rel ,
962
+ *(a64 **)a, *(a64 *)(a + 8 ));
955
963
}
956
964
957
965
SANITIZER_INTERFACE_ATTRIBUTE
958
966
void __tsan_go_atomic32_exchange (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
959
- ATOMIC_RET (Exchange, *(a32 *)(a + 16 ), mo_acq_rel, *(a32 **)a ,
960
- *(a32 *)(a + 8 ));
967
+ *(a32 *)(a + 16 ) = AtomicGoRet<OpExchange>(thr, cpc, pc, mo_acq_rel ,
968
+ *(a32 **)a, *(a32 *)(a + 8 ));
961
969
}
962
970
963
971
SANITIZER_INTERFACE_ATTRIBUTE
964
972
void __tsan_go_atomic64_exchange (ThreadState *thr, uptr cpc, uptr pc, u8 *a) {
965
- ATOMIC_RET (Exchange, *(a64 *)(a + 16 ), mo_acq_rel, *(a64 **)a ,
966
- *(a64 *)(a + 8 ));
973
+ *(a64 *)(a + 16 ) = AtomicGoRet<OpExchange>(thr, cpc, pc, mo_acq_rel ,
974
+ *(a64 **)a, *(a64 *)(a + 8 ));
967
975
}
968
976
969
977
SANITIZER_INTERFACE_ATTRIBUTE
970
978
void __tsan_go_atomic32_compare_exchange (ThreadState *thr, uptr cpc, uptr pc,
971
979
u8 *a) {
972
- a32 cur = 0 ;
973
980
a32 cmp = *(a32 *)(a + 8 );
974
- ATOMIC_RET (CAS, cur, mo_acq_rel, mo_acquire, *(a32 **)a, cmp ,
975
- *(a32 *)(a + 12 ));
981
+ a32 cur = AtomicGoRet<OpCAS>(thr, cpc, pc, mo_acq_rel, mo_acquire, *(a32 **)a,
982
+ cmp, *(a32 *)(a + 12 ));
976
983
*(bool *)(a + 16 ) = (cur == cmp);
977
984
}
978
985
979
986
SANITIZER_INTERFACE_ATTRIBUTE
980
987
void __tsan_go_atomic64_compare_exchange (ThreadState *thr, uptr cpc, uptr pc,
981
988
u8 *a) {
982
- a64 cur = 0 ;
983
989
a64 cmp = *(a64 *)(a + 8 );
984
- ATOMIC_RET (CAS, cur, mo_acq_rel, mo_acquire, *(a64 **)a, cmp ,
985
- *(a64 *)(a + 16 ));
990
+ a32 cur = AtomicGoRet<OpCAS>(thr, cpc, pc, mo_acq_rel, mo_acquire, *(a64 **)a,
991
+ cmp, *(a64 *)(a + 16 ));
986
992
*(bool *)(a + 24 ) = (cur == cmp);
987
993
}
988
994
} // extern "C"
0 commit comments