#include "swift/Runtime/Exclusivity.h" #include "swift/Runtime/Metadata.h" using namespace swift; SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C" void testExclusivityNullPC() { ValueBuffer scratch, scratch2; long var; swift_beginAccess(&var, &scratch, ExclusivityFlags::Read | ExclusivityFlags::Tracking, /*pc=*/0); swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify, /*pc=*/0); swift_endAccess(&scratch2); swift_endAccess(&scratch); } SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C" void testExclusivityPCOne() { ValueBuffer scratch, scratch2; long var; swift_beginAccess(&var, &scratch, ExclusivityFlags::Read | ExclusivityFlags::Tracking, /*pc=*/(void *)1); swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify, /*pc=*/(void *)1); swift_endAccess(&scratch2); swift_endAccess(&scratch); } SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C" void testExclusivityBogusPC() { ValueBuffer scratch, scratch2; long var; swift_beginAccess(&var, &scratch, ExclusivityFlags::Read | ExclusivityFlags::Tracking, /*pc=*/(void *)0xdeadbeefdeadbeefULL); swift_beginAccess(&var, &scratch2, ExclusivityFlags::Modify, /*pc=*/(void *)0xdeadbeefdeadbeefULL); swift_endAccess(&scratch2); swift_endAccess(&scratch); } // rdar://32866493 SWIFT_CC(swift) SWIFT_RUNTIME_LIBRARY_VISIBILITY extern "C" void testExclusivityNonNested() { const int N = 5; ValueBuffer scratches[N]; long vars[N]; auto begin = [&](unsigned i) { assert(i < N); swift_beginAccess(&vars[i], &scratches[i], ExclusivityFlags::Modify | ExclusivityFlags::Tracking, 0); }; auto end = [&](unsigned i) { assert(i < N); swift_endAccess(&scratches[i]); memset(&scratches[i], /*gibberish*/ 0x99, sizeof(ValueBuffer)); }; auto accessAll = [&] { for (unsigned i = 0; i != N; ++i) begin(i); for (unsigned i = 0; i != N; ++i) end(i); }; accessAll(); begin(0); begin(1); end(0); end(1); begin(0); begin(1); end(0); end(1); accessAll(); begin(1); begin(0); begin(2); end(0); end(2); end(1); accessAll(); begin(0); begin(1); begin(2); begin(3); begin(4); end(1); end(4); end(0); end(2); end(3); accessAll(); }