Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 4d37447

Browse files
authoredNov 6, 2024··
[nfc][tsan] Replace some macros with templates (#114931)
1 parent a905203 commit 4d37447

File tree

1 file changed

+116
-110
lines changed

1 file changed

+116
-110
lines changed
 

‎compiler-rt/lib/tsan/rtl/tsan_interface_atomic.cpp

+116-110
Original file line numberDiff line numberDiff line change
@@ -520,356 +520,359 @@ static morder to_morder(int mo) {
520520
return res;
521521
}
522522

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+
}
530531

531532
extern "C" {
532533
SANITIZER_INTERFACE_ATTRIBUTE
533534
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);
535536
}
536537

537538
SANITIZER_INTERFACE_ATTRIBUTE
538539
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);
540541
}
541542

542543
SANITIZER_INTERFACE_ATTRIBUTE
543544
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);
545546
}
546547

547548
SANITIZER_INTERFACE_ATTRIBUTE
548549
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);
550551
}
551552

552553
# if __TSAN_HAS_INT128
553554
SANITIZER_INTERFACE_ATTRIBUTE
554555
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);
556557
}
557558
# endif
558559

559560
SANITIZER_INTERFACE_ATTRIBUTE
560561
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);
562563
}
563564

564565
SANITIZER_INTERFACE_ATTRIBUTE
565566
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);
567568
}
568569

569570
SANITIZER_INTERFACE_ATTRIBUTE
570571
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);
572573
}
573574

574575
SANITIZER_INTERFACE_ATTRIBUTE
575576
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);
577578
}
578579

579580
# if __TSAN_HAS_INT128
580581
SANITIZER_INTERFACE_ATTRIBUTE
581582
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);
583584
}
584585
# endif
585586

586587
SANITIZER_INTERFACE_ATTRIBUTE
587588
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);
589590
}
590591

591592
SANITIZER_INTERFACE_ATTRIBUTE
592593
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);
594595
}
595596

596597
SANITIZER_INTERFACE_ATTRIBUTE
597598
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);
599600
}
600601

601602
SANITIZER_INTERFACE_ATTRIBUTE
602603
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);
604605
}
605606

606607
# if __TSAN_HAS_INT128
607608
SANITIZER_INTERFACE_ATTRIBUTE
608609
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);
610611
}
611612
# endif
612613

613614
SANITIZER_INTERFACE_ATTRIBUTE
614615
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);
616617
}
617618

618619
SANITIZER_INTERFACE_ATTRIBUTE
619620
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);
621622
}
622623

623624
SANITIZER_INTERFACE_ATTRIBUTE
624625
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);
626627
}
627628

628629
SANITIZER_INTERFACE_ATTRIBUTE
629630
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);
631632
}
632633

633634
# if __TSAN_HAS_INT128
634635
SANITIZER_INTERFACE_ATTRIBUTE
635636
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);
637638
}
638639
# endif
639640

640641
SANITIZER_INTERFACE_ATTRIBUTE
641642
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);
643644
}
644645

645646
SANITIZER_INTERFACE_ATTRIBUTE
646647
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);
648649
}
649650

650651
SANITIZER_INTERFACE_ATTRIBUTE
651652
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);
653654
}
654655

655656
SANITIZER_INTERFACE_ATTRIBUTE
656657
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);
658659
}
659660

660661
# if __TSAN_HAS_INT128
661662
SANITIZER_INTERFACE_ATTRIBUTE
662663
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);
664665
}
665666
# endif
666667

667668
SANITIZER_INTERFACE_ATTRIBUTE
668669
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);
670671
}
671672

672673
SANITIZER_INTERFACE_ATTRIBUTE
673674
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);
675676
}
676677

677678
SANITIZER_INTERFACE_ATTRIBUTE
678679
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);
680681
}
681682

682683
SANITIZER_INTERFACE_ATTRIBUTE
683684
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);
685686
}
686687

687688
# if __TSAN_HAS_INT128
688689
SANITIZER_INTERFACE_ATTRIBUTE
689690
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);
691692
}
692693
# endif
693694

694695
SANITIZER_INTERFACE_ATTRIBUTE
695696
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);
697698
}
698699

699700
SANITIZER_INTERFACE_ATTRIBUTE
700701
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);
702703
}
703704

704705
SANITIZER_INTERFACE_ATTRIBUTE
705706
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);
707708
}
708709

709710
SANITIZER_INTERFACE_ATTRIBUTE
710711
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);
712713
}
713714

714715
# if __TSAN_HAS_INT128
715716
SANITIZER_INTERFACE_ATTRIBUTE
716717
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);
718719
}
719720
# endif
720721

721722
SANITIZER_INTERFACE_ATTRIBUTE
722723
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);
724725
}
725726

726727
SANITIZER_INTERFACE_ATTRIBUTE
727728
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);
729730
}
730731

731732
SANITIZER_INTERFACE_ATTRIBUTE
732733
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);
734735
}
735736

736737
SANITIZER_INTERFACE_ATTRIBUTE
737738
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);
739740
}
740741

741742
# if __TSAN_HAS_INT128
742743
SANITIZER_INTERFACE_ATTRIBUTE
743744
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);
745746
}
746747
# endif
747748

748749
SANITIZER_INTERFACE_ATTRIBUTE
749750
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);
751752
}
752753

753754
SANITIZER_INTERFACE_ATTRIBUTE
754755
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);
756757
}
757758

758759
SANITIZER_INTERFACE_ATTRIBUTE
759760
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);
761762
}
762763

763764
SANITIZER_INTERFACE_ATTRIBUTE
764765
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);
766767
}
767768

768769
# if __TSAN_HAS_INT128
769770
SANITIZER_INTERFACE_ATTRIBUTE
770771
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);
772773
}
773774
# endif
774775

775776
SANITIZER_INTERFACE_ATTRIBUTE
776777
int __tsan_atomic8_compare_exchange_strong(volatile a8 *a, a8 *c, a8 v, int mo,
777778
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);
779780
}
780781

781782
SANITIZER_INTERFACE_ATTRIBUTE
782783
int __tsan_atomic16_compare_exchange_strong(volatile a16 *a, a16 *c, a16 v,
783784
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);
785786
}
786787

787788
SANITIZER_INTERFACE_ATTRIBUTE
788789
int __tsan_atomic32_compare_exchange_strong(volatile a32 *a, a32 *c, a32 v,
789790
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);
791792
}
792793

793794
SANITIZER_INTERFACE_ATTRIBUTE
794795
int __tsan_atomic64_compare_exchange_strong(volatile a64 *a, a64 *c, a64 v,
795796
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);
797798
}
798799

799800
# if __TSAN_HAS_INT128
800801
SANITIZER_INTERFACE_ATTRIBUTE
801802
int __tsan_atomic128_compare_exchange_strong(volatile a128 *a, a128 *c, a128 v,
802803
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);
804805
}
805806
# endif
806807

807808
SANITIZER_INTERFACE_ATTRIBUTE
808809
int __tsan_atomic8_compare_exchange_weak(volatile a8 *a, a8 *c, a8 v, int mo,
809810
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);
811812
}
812813

813814
SANITIZER_INTERFACE_ATTRIBUTE
814815
int __tsan_atomic16_compare_exchange_weak(volatile a16 *a, a16 *c, a16 v,
815816
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);
817818
}
818819

819820
SANITIZER_INTERFACE_ATTRIBUTE
820821
int __tsan_atomic32_compare_exchange_weak(volatile a32 *a, a32 *c, a32 v,
821822
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);
823824
}
824825

825826
SANITIZER_INTERFACE_ATTRIBUTE
826827
int __tsan_atomic64_compare_exchange_weak(volatile a64 *a, a64 *c, a64 v,
827828
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);
829830
}
830831

831832
# if __TSAN_HAS_INT128
832833
SANITIZER_INTERFACE_ATTRIBUTE
833834
int __tsan_atomic128_compare_exchange_weak(volatile a128 *a, a128 *c, a128 v,
834835
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);
836837
}
837838
# endif
838839

839840
SANITIZER_INTERFACE_ATTRIBUTE
840841
a8 __tsan_atomic8_compare_exchange_val(volatile a8 *a, a8 c, a8 v, int mo,
841842
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);
843844
}
844845

845846
SANITIZER_INTERFACE_ATTRIBUTE
846847
a16 __tsan_atomic16_compare_exchange_val(volatile a16 *a, a16 c, a16 v, int mo,
847848
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);
849850
}
850851

851852
SANITIZER_INTERFACE_ATTRIBUTE
852853
a32 __tsan_atomic32_compare_exchange_val(volatile a32 *a, a32 c, a32 v, int mo,
853854
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);
855856
}
856857

857858
SANITIZER_INTERFACE_ATTRIBUTE
858859
a64 __tsan_atomic64_compare_exchange_val(volatile a64 *a, a64 c, a64 v, int mo,
859860
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);
861862
}
862863

863864
# if __TSAN_HAS_INT128
864865
SANITIZER_INTERFACE_ATTRIBUTE
865866
a128 __tsan_atomic128_compare_exchange_val(volatile a128 *a, a128 c, a128 v,
866867
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);
868869
}
869870
# endif
870871

871872
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+
}
873876

874877
SANITIZER_INTERFACE_ATTRIBUTE
875878
void __tsan_atomic_signal_fence(int mo) {}
@@ -879,110 +882,113 @@ void __tsan_atomic_signal_fence(int mo) {}
879882

880883
// Go
881884

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+
}
890895

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+
}
899907

900908
extern "C" {
901909
SANITIZER_INTERFACE_ATTRIBUTE
902910
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);
904912
}
905913

906914
SANITIZER_INTERFACE_ATTRIBUTE
907915
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);
909917
}
910918

911919
SANITIZER_INTERFACE_ATTRIBUTE
912920
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));
914922
}
915923

916924
SANITIZER_INTERFACE_ATTRIBUTE
917925
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));
919927
}
920928

921929
SANITIZER_INTERFACE_ATTRIBUTE
922930
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));
925933
}
926934

927935
SANITIZER_INTERFACE_ATTRIBUTE
928936
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));
931939
}
932940

933941
SANITIZER_INTERFACE_ATTRIBUTE
934942
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));
937945
}
938946

939947
SANITIZER_INTERFACE_ATTRIBUTE
940948
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));
943951
}
944952

945953
SANITIZER_INTERFACE_ATTRIBUTE
946954
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));
949957
}
950958

951959
SANITIZER_INTERFACE_ATTRIBUTE
952960
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));
955963
}
956964

957965
SANITIZER_INTERFACE_ATTRIBUTE
958966
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));
961969
}
962970

963971
SANITIZER_INTERFACE_ATTRIBUTE
964972
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));
967975
}
968976

969977
SANITIZER_INTERFACE_ATTRIBUTE
970978
void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
971979
u8 *a) {
972-
a32 cur = 0;
973980
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));
976983
*(bool *)(a + 16) = (cur == cmp);
977984
}
978985

979986
SANITIZER_INTERFACE_ATTRIBUTE
980987
void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
981988
u8 *a) {
982-
a64 cur = 0;
983989
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));
986992
*(bool *)(a + 24) = (cur == cmp);
987993
}
988994
} // extern "C"

0 commit comments

Comments
 (0)
Please sign in to comment.