mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Create a new RuntimeUnittest library alongside the other stdlib unit tests so we can write C++ runtime unit tests callable from lit. Move runtime exclusivity tests into the stdlib unittest library and create lit tests so we can verify that the runtime crashes with an error message.
78 lines
2.3 KiB
C++
78 lines
2.3 KiB
C++
#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();
|
|
}
|