Skip to content

Commit 9f2f5ad

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
Reland [vm/ffi] Regression test for dartbug.com/36993
Fixes: #37175 Know issue: #37180 Follow up of: https://dart-review.googlesource.com/c/sdk/+/103136 Bug: #36993 Change-Id: I13fc69fd84362f207e9e66c4d1ef6c2ef2aba368 Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try, app-kernel-linux-debug-x64-try, vm-kernel-linux-debug-simdbc64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-reload-mac-debug-simdbc64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/105303 Auto-Submit: Daco Harkes <[email protected]> Reviewed-by: Samir Jindel <[email protected]> Commit-Queue: Samir Jindel <[email protected]>
1 parent 15a3df3 commit 9f2f5ad

File tree

6 files changed

+88
-64
lines changed

6 files changed

+88
-64
lines changed

runtime/vm/compiler/assembler/assembler_arm.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace dart {
2424
DECLARE_FLAG(bool, check_code_pointer);
2525
DECLARE_FLAG(bool, inline_alloc);
2626
DECLARE_FLAG(bool, precompiled_mode);
27+
DECLARE_FLAG(bool, use_slow_path);
2728

2829
namespace compiler {
2930

@@ -560,7 +561,7 @@ void Assembler::TransitionGeneratedToNative(Register destination_address,
560561
LoadImmediate(state, compiler::target::Thread::native_execution_state());
561562
StoreToOffset(kWord, state, THR, Thread::execution_state_offset());
562563

563-
if (TargetCPUFeatures::arm_version() == ARMv5TE) {
564+
if (FLAG_use_slow_path || TargetCPUFeatures::arm_version() == ARMv5TE) {
564565
EnterSafepointSlowly();
565566
} else {
566567
Label slow_path, done, retry;
@@ -592,7 +593,7 @@ void Assembler::EnterSafepointSlowly() {
592593
}
593594

594595
void Assembler::TransitionNativeToGenerated(Register addr, Register state) {
595-
if (TargetCPUFeatures::arm_version() == ARMv5TE) {
596+
if (FLAG_use_slow_path || TargetCPUFeatures::arm_version() == ARMv5TE) {
596597
ExitSafepointSlowly();
597598
} else {
598599
Label slow_path, done, retry;
@@ -1389,7 +1390,9 @@ void Assembler::vdup(OperandSize sz, QRegister qd, DRegister dm, int idx) {
13891390
code = 4 | (idx << 3);
13901391
break;
13911392
}
1392-
default: { break; }
1393+
default: {
1394+
break;
1395+
}
13931396
}
13941397

13951398
EmitSIMDddd(B24 | B23 | B11 | B10 | B6, kWordPair,

runtime/vm/compiler/assembler/assembler_arm64.cc

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace dart {
1818
DECLARE_FLAG(bool, check_code_pointer);
1919
DECLARE_FLAG(bool, inline_alloc);
2020
DECLARE_FLAG(bool, precompiled_mode);
21+
DECLARE_FLAG(bool, use_slow_path);
2122

2223
DEFINE_FLAG(bool, use_far_branches, false, "Always use far branches");
2324

@@ -1312,12 +1313,13 @@ void Assembler::LeaveDartFrame(RestorePP restore_pp) {
13121313
}
13131314

13141315
void Assembler::TransitionGeneratedToNative(Register destination,
1315-
Register new_exit_rame,
1316+
Register new_exit_frame,
13161317
Register state) {
13171318
Register addr = TMP2;
1319+
ASSERT(addr != state);
13181320

13191321
// Save exit frame information to enable stack walking.
1320-
StoreToOffset(new_exit_rame, THR,
1322+
StoreToOffset(new_exit_frame, THR,
13211323
compiler::target::Thread::top_exit_frame_info_offset());
13221324

13231325
// Mark that the thread is executing native code.
@@ -1326,17 +1328,20 @@ void Assembler::TransitionGeneratedToNative(Register destination,
13261328
StoreToOffset(state, THR, compiler::target::Thread::execution_state_offset());
13271329

13281330
Label slow_path, done, retry;
1329-
movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()), 0);
1330-
add(addr, THR, Operand(addr));
1331-
Bind(&retry);
1332-
ldxr(state, addr);
1333-
cmp(state, Operand(Thread::safepoint_state_unacquired()));
1334-
b(&slow_path, NE);
1335-
1336-
movz(state, Immediate(Thread::safepoint_state_acquired()), 0);
1337-
stxr(TMP, state, addr);
1338-
cbz(&done, TMP); // 0 means stxr was successful.
1339-
b(&retry);
1331+
if (!FLAG_use_slow_path) {
1332+
movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()),
1333+
0);
1334+
add(addr, THR, Operand(addr));
1335+
Bind(&retry);
1336+
ldxr(state, addr);
1337+
cmp(state, Operand(Thread::safepoint_state_unacquired()));
1338+
b(&slow_path, NE);
1339+
1340+
movz(state, Immediate(Thread::safepoint_state_acquired()), 0);
1341+
stxr(TMP, state, addr);
1342+
cbz(&done, TMP); // 0 means stxr was successful.
1343+
b(&retry);
1344+
}
13401345

13411346
Bind(&slow_path);
13421347
ldr(addr,
@@ -1349,24 +1354,28 @@ void Assembler::TransitionGeneratedToNative(Register destination,
13491354

13501355
void Assembler::TransitionNativeToGenerated(Register state) {
13511356
Register addr = TMP2;
1357+
ASSERT(addr != state);
13521358

13531359
Label slow_path, done, retry;
1354-
movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()), 0);
1355-
add(addr, THR, Operand(addr));
1356-
Bind(&retry);
1357-
ldxr(state, addr);
1358-
cmp(state, Operand(Thread::safepoint_state_acquired()));
1359-
b(&slow_path, NE);
1360-
1361-
movz(state, Immediate(Thread::safepoint_state_unacquired()), 0);
1362-
stxr(TMP, state, addr);
1363-
cbz(&done, TMP); // 0 means stxr was successful.
1364-
b(&retry);
1360+
if (!FLAG_use_slow_path) {
1361+
movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()),
1362+
0);
1363+
add(addr, THR, Operand(addr));
1364+
Bind(&retry);
1365+
ldxr(state, addr);
1366+
cmp(state, Operand(Thread::safepoint_state_acquired()));
1367+
b(&slow_path, NE);
1368+
1369+
movz(state, Immediate(Thread::safepoint_state_unacquired()), 0);
1370+
stxr(TMP, state, addr);
1371+
cbz(&done, TMP); // 0 means stxr was successful.
1372+
b(&retry);
1373+
}
13651374

13661375
Bind(&slow_path);
13671376
ldr(addr,
13681377
Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
1369-
ldr(addr, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
1378+
ldr(addr, FieldAddress(addr, compiler::target::Code::entry_point_offset()));
13701379
blr(addr);
13711380

13721381
Bind(&done);

runtime/vm/compiler/assembler/assembler_ia32.cc

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ namespace dart {
1616

1717
#if !defined(DART_PRECOMPILED_RUNTIME)
1818
DECLARE_FLAG(bool, inline_alloc);
19+
DECLARE_FLAG(bool, use_slow_path);
1920
#endif
2021

2122
namespace compiler {
@@ -2109,16 +2110,17 @@ void Assembler::TransitionGeneratedToNative(Register destination_address,
21092110

21102111
// Compare and swap the value at Thread::safepoint_state from unacquired to
21112112
// acquired. On success, jump to 'success'; otherwise, fallthrough.
2112-
pushl(EAX);
2113-
movl(EAX, Immediate(Thread::safepoint_state_unacquired()));
2114-
movl(scratch, Immediate(Thread::safepoint_state_acquired()));
2115-
LockCmpxchgl(Address(THR, Thread::safepoint_state_offset()), scratch);
2116-
movl(scratch, EAX);
2117-
popl(EAX);
2118-
cmpl(scratch, Immediate(Thread::safepoint_state_unacquired()));
2119-
21202113
Label done;
2121-
j(EQUAL, &done);
2114+
if (!FLAG_use_slow_path) {
2115+
pushl(EAX);
2116+
movl(EAX, Immediate(Thread::safepoint_state_unacquired()));
2117+
movl(scratch, Immediate(Thread::safepoint_state_acquired()));
2118+
LockCmpxchgl(Address(THR, Thread::safepoint_state_offset()), scratch);
2119+
movl(scratch, EAX);
2120+
popl(EAX);
2121+
cmpl(scratch, Immediate(Thread::safepoint_state_unacquired()));
2122+
j(EQUAL, &done);
2123+
}
21222124

21232125
movl(scratch,
21242126
Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
@@ -2132,18 +2134,20 @@ void Assembler::TransitionGeneratedToNative(Register destination_address,
21322134
void Assembler::TransitionNativeToGenerated(Register scratch) {
21332135
// Compare and swap the value at Thread::safepoint_state from acquired to
21342136
// unacquired. On success, jump to 'success'; otherwise, fallthrough.
2135-
pushl(EAX);
2136-
movl(EAX, Immediate(compiler::target::Thread::safepoint_state_acquired()));
2137-
movl(scratch,
2138-
Immediate(compiler::target::Thread::safepoint_state_unacquired()));
2139-
LockCmpxchgl(Address(THR, compiler::target::Thread::safepoint_state_offset()),
2140-
scratch);
2141-
movl(scratch, EAX);
2142-
popl(EAX);
2143-
cmpl(scratch, Immediate(Thread::safepoint_state_acquired()));
2144-
21452137
Label done;
2146-
j(EQUAL, &done);
2138+
if (!FLAG_use_slow_path) {
2139+
pushl(EAX);
2140+
movl(EAX, Immediate(compiler::target::Thread::safepoint_state_acquired()));
2141+
movl(scratch,
2142+
Immediate(compiler::target::Thread::safepoint_state_unacquired()));
2143+
LockCmpxchgl(
2144+
Address(THR, compiler::target::Thread::safepoint_state_offset()),
2145+
scratch);
2146+
movl(scratch, EAX);
2147+
popl(EAX);
2148+
cmpl(scratch, Immediate(Thread::safepoint_state_acquired()));
2149+
j(EQUAL, &done);
2150+
}
21472151

21482152
movl(scratch,
21492153
Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));

runtime/vm/compiler/assembler/assembler_x64.cc

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace dart {
1818
DECLARE_FLAG(bool, check_code_pointer);
1919
DECLARE_FLAG(bool, inline_alloc);
2020
DECLARE_FLAG(bool, precompiled_mode);
21+
DECLARE_FLAG(bool, use_slow_path);
2122
#endif
2223

2324
namespace compiler {
@@ -176,14 +177,16 @@ void Assembler::TransitionGeneratedToNative(Register destination_address,
176177
// Compare and swap the value at Thread::safepoint_state from unacquired to
177178
// acquired. If the CAS fails, go to a slow-path stub.
178179
Label done;
179-
pushq(RAX);
180-
movq(RAX, Immediate(Thread::safepoint_state_unacquired()));
181-
movq(TMP, Immediate(Thread::safepoint_state_acquired()));
182-
LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
183-
movq(TMP, RAX);
184-
popq(RAX);
185-
cmpq(TMP, Immediate(Thread::safepoint_state_unacquired()));
186-
j(EQUAL, &done);
180+
if (!FLAG_use_slow_path) {
181+
pushq(RAX);
182+
movq(RAX, Immediate(Thread::safepoint_state_unacquired()));
183+
movq(TMP, Immediate(Thread::safepoint_state_acquired()));
184+
LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
185+
movq(TMP, RAX);
186+
popq(RAX);
187+
cmpq(TMP, Immediate(Thread::safepoint_state_unacquired()));
188+
j(EQUAL, &done);
189+
}
187190

188191
movq(TMP,
189192
Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
@@ -199,14 +202,16 @@ void Assembler::TransitionNativeToGenerated() {
199202
// Compare and swap the value at Thread::safepoint_state from acquired to
200203
// unacquired. On success, jump to 'success'; otherwise, fallthrough.
201204
Label done;
202-
pushq(RAX);
203-
movq(RAX, Immediate(Thread::safepoint_state_acquired()));
204-
movq(TMP, Immediate(Thread::safepoint_state_unacquired()));
205-
LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
206-
movq(TMP, RAX);
207-
popq(RAX);
208-
cmpq(TMP, Immediate(Thread::safepoint_state_acquired()));
209-
j(EQUAL, &done);
205+
if (!FLAG_use_slow_path) {
206+
pushq(RAX);
207+
movq(RAX, Immediate(Thread::safepoint_state_acquired()));
208+
movq(TMP, Immediate(Thread::safepoint_state_unacquired()));
209+
LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
210+
movq(TMP, RAX);
211+
popq(RAX);
212+
cmpq(TMP, Immediate(Thread::safepoint_state_acquired()));
213+
j(EQUAL, &done);
214+
}
210215

211216
movq(TMP,
212217
Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));

runtime/vm/runtime_entry.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2759,6 +2759,7 @@ RawObject* RuntimeEntry::InterpretCall(RawFunction* function,
27592759
}
27602760

27612761
extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
2762+
CHECK_STACK_ALIGNMENT;
27622763
Thread* thread = Thread::Current();
27632764
ASSERT(thread->top_exit_frame_info() != 0);
27642765
ASSERT(thread->execution_state() == Thread::kThreadInNative);
@@ -2767,6 +2768,7 @@ extern "C" void DFLRT_EnterSafepoint(NativeArguments __unusable_) {
27672768
DEFINE_RAW_LEAF_RUNTIME_ENTRY(EnterSafepoint, 0, false, &DFLRT_EnterSafepoint);
27682769

27692770
extern "C" void DFLRT_ExitSafepoint(NativeArguments __unusable_) {
2771+
CHECK_STACK_ALIGNMENT;
27702772
Thread* thread = Thread::Current();
27712773
ASSERT(thread->top_exit_frame_info() != 0);
27722774
ASSERT(thread->execution_state() == Thread::kThreadInNative);

tests/ffi/function_test.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77
// VMOptions=
88
// VMOptions=--deterministic --optimization-counter-threshold=10
9+
// VMOptions=--use-slow-path
910
// SharedObjects=ffi_test_functions
1011

1112
library FfiTest;

0 commit comments

Comments
 (0)