Skip to content

Commit c20f9ea

Browse files
alexmarkovCommit Queue
authored and
Commit Queue
committed
[vm/ffi] Cleanup FFI call trampolines
After [1], FFI call sequence is generated inside a Dart closure function and separate FFI call trampolines are no longer used. This change removes all code related to FFI call trampolines. [1] https://dart-review.googlesource.com/c/sdk/+/339662 TEST=existing Change-Id: I0af0be6441009fb4db885ee172b0487f4796fd18 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340302 Commit-Queue: Alexander Markov <[email protected]> Reviewed-by: Daco Harkes <[email protected]>
1 parent b17d4cb commit c20f9ea

22 files changed

+98
-279
lines changed

runtime/lib/ffi.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
#if !defined(DART_PRECOMPILED_RUNTIME)
2222
#include "vm/compiler/assembler/assembler.h"
23-
#include "vm/compiler/ffi/call.h"
2423
#include "vm/compiler/ffi/callback.h"
2524
#include "vm/compiler/ffi/marshaller.h"
2625
#include "vm/compiler/jit/compiler.h"

runtime/vm/canonical_tables.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ struct CanonicalFfiCallbackFunctionTraits {
425425
f1.FfiCSignature() == f2.FfiCSignature() &&
426426
f1.FfiCallbackExceptionalReturn() ==
427427
f2.FfiCallbackExceptionalReturn() &&
428-
f1.GetFfiFunctionKind() == f2.GetFfiFunctionKind());
428+
f1.GetFfiCallbackKind() == f2.GetFfiCallbackKind());
429429
}
430430
static bool ReportStats() { return false; }
431431
};

runtime/vm/compiler/aot/precompiler.cc

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,7 +1044,7 @@ void Precompiler::AddCalleesOfHelper(const Object& entry,
10441044
// Local closure function.
10451045
const auto& target = Function::Cast(entry);
10461046
AddFunction(target, RetainReasons::kLocalClosure);
1047-
if (target.IsFfiTrampoline()) {
1047+
if (target.IsFfiCallbackTrampoline()) {
10481048
const auto& callback_target =
10491049
Function::Handle(Z, target.FfiCallbackTarget());
10501050
if (!callback_target.IsNull()) {
@@ -1117,7 +1117,7 @@ void Precompiler::AddTypesOf(const Function& function) {
11171117
const Class& owner = Class::Handle(Z, function.Owner());
11181118
AddTypesOf(owner);
11191119

1120-
if (function.IsFfiTrampoline()) {
1120+
if (function.IsFfiCallbackTrampoline()) {
11211121
AddType(FunctionType::Handle(Z, function.FfiCSignature()));
11221122
}
11231123

@@ -2030,7 +2030,7 @@ void Precompiler::TraceForRetainedFunctions() {
20302030
// Ffi trampoline functions are not reachable from program structure,
20312031
// they are referenced only from code (object pool).
20322032
if (!functions_to_retain_.ContainsKey(function) &&
2033-
!function.IsFfiTrampoline()) {
2033+
!function.IsFfiCallbackTrampoline()) {
20342034
FATAL("Function %s was not traced in TraceForRetainedFunctions\n",
20352035
function.ToFullyQualifiedCString());
20362036
}
@@ -2189,7 +2189,7 @@ void Precompiler::DropFunctions() {
21892189
// which need the signature.
21902190
return AddRetainReason(sig, RetainReasons::kClosureSignature);
21912191
}
2192-
if (function.IsFfiTrampoline()) {
2192+
if (function.IsFfiCallbackTrampoline()) {
21932193
// FFI trampolines may be dynamically called.
21942194
return AddRetainReason(sig, RetainReasons::kFfiTrampolineSignature);
21952195
}
@@ -3015,7 +3015,7 @@ void Precompiler::DiscardCodeObjects() {
30153015
}
30163016

30173017
// Retain Code objects corresponding to FFI trampolines.
3018-
if (function_.IsFfiTrampoline()) {
3018+
if (function_.IsFfiCallbackTrampoline()) {
30193019
++codes_with_ffi_trampoline_function_;
30203020
return;
30213021
}
@@ -3455,8 +3455,7 @@ void PrecompileParsedFunctionHelper::FinalizeCompilation(
34553455
function.AttachCode(code);
34563456
}
34573457

3458-
if (function.IsFfiTrampoline() &&
3459-
function.GetFfiFunctionKind() != FfiFunctionKind::kCall) {
3458+
if (function.IsFfiCallbackTrampoline()) {
34603459
compiler::ffi::SetFfiCallbackCode(thread(), function, code);
34613460
}
34623461
}

runtime/vm/compiler/backend/flow_graph.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ void FlowGraph::ReplaceCurrentInstruction(ForwardInstructionIterator* iterator,
167167
bool FlowGraph::ShouldReorderBlocks(const Function& function,
168168
bool is_optimized) {
169169
return is_optimized && FLAG_reorder_basic_blocks &&
170-
!function.is_intrinsic() && !function.IsFfiTrampoline();
170+
!function.is_intrinsic() && !function.IsFfiCallbackTrampoline();
171171
}
172172

173173
GrowableArray<BlockEntryInstr*>* FlowGraph::CodegenBlockOrder(

runtime/vm/compiler/backend/il_serializer.cc

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
#include "vm/compiler/backend/flow_graph.h"
1212
#include "vm/compiler/backend/il.h"
1313
#include "vm/compiler/backend/range_analysis.h"
14-
#include "vm/compiler/ffi/call.h"
1514
#include "vm/compiler/frontend/flow_graph_builder.h"
1615
#include "vm/object_store.h"
1716
#include "vm/parser.h"
@@ -837,20 +836,12 @@ void FlowGraphSerializer::WriteTrait<const Function&>::Write(
837836
return;
838837
}
839838
case UntaggedFunction::kFfiTrampoline: {
840-
s->Write<uint8_t>(static_cast<uint8_t>(x.GetFfiFunctionKind()));
839+
s->Write<uint8_t>(static_cast<uint8_t>(x.GetFfiCallbackKind()));
841840
s->Write<const FunctionType&>(
842841
FunctionType::Handle(zone, x.FfiCSignature()));
843-
if (x.GetFfiFunctionKind() != FfiFunctionKind::kCall) {
844-
s->Write<const Function&>(
845-
Function::Handle(zone, x.FfiCallbackTarget()));
846-
s->Write<const Instance&>(
847-
Instance::Handle(zone, x.FfiCallbackExceptionalReturn()));
848-
} else {
849-
s->Write<const String&>(String::Handle(zone, x.name()));
850-
s->Write<const FunctionType&>(
851-
FunctionType::Handle(zone, x.signature()));
852-
s->Write<bool>(x.FfiIsLeaf());
853-
}
842+
s->Write<const Function&>(Function::Handle(zone, x.FfiCallbackTarget()));
843+
s->Write<const Instance&>(
844+
Instance::Handle(zone, x.FfiCallbackExceptionalReturn()));
854845
return;
855846
}
856847
default:
@@ -927,23 +918,14 @@ const Function& FlowGraphDeserializer::ReadTrait<const Function&>::Read(
927918
target.GetDynamicInvocationForwarder(name));
928919
}
929920
case UntaggedFunction::kFfiTrampoline: {
930-
const FfiFunctionKind kind =
931-
static_cast<FfiFunctionKind>(d->Read<uint8_t>());
921+
const FfiCallbackKind kind =
922+
static_cast<FfiCallbackKind>(d->Read<uint8_t>());
932923
const FunctionType& c_signature = d->Read<const FunctionType&>();
933-
if (kind != FfiFunctionKind::kCall) {
934-
const Function& callback_target = d->Read<const Function&>();
935-
const Instance& exceptional_return = d->Read<const Instance&>();
936-
return Function::ZoneHandle(
937-
zone, compiler::ffi::NativeCallbackFunction(
938-
c_signature, callback_target, exceptional_return, kind));
939-
} else {
940-
const String& name = d->Read<const String&>();
941-
const FunctionType& signature = d->Read<const FunctionType&>();
942-
const bool is_leaf = d->Read<bool>();
943-
return Function::ZoneHandle(
944-
zone, compiler::ffi::TrampolineFunction(name, signature,
945-
c_signature, is_leaf));
946-
}
924+
const Function& callback_target = d->Read<const Function&>();
925+
const Instance& exceptional_return = d->Read<const Instance&>();
926+
return Function::ZoneHandle(
927+
zone, compiler::ffi::NativeCallbackFunction(
928+
c_signature, callback_target, exceptional_return, kind));
947929
}
948930
default:
949931
UNIMPLEMENTED();

runtime/vm/compiler/compiler_sources.gni

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,6 @@ compiler_sources = [
100100
"compiler_timings.h",
101101
"ffi/abi.cc",
102102
"ffi/abi.h",
103-
"ffi/call.cc",
104-
"ffi/call.h",
105103
"ffi/callback.cc",
106104
"ffi/callback.h",
107105
"ffi/frame_rebase.cc",

runtime/vm/compiler/ffi/call.cc

Lines changed: 0 additions & 83 deletions
This file was deleted.

runtime/vm/compiler/ffi/call.h

Lines changed: 0 additions & 38 deletions
This file was deleted.

runtime/vm/compiler/ffi/callback.cc

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ namespace ffi {
1818
const String& NativeCallbackFunctionName(Thread* thread,
1919
Zone* zone,
2020
const Function& dart_target,
21-
FfiFunctionKind kind) {
21+
FfiCallbackKind kind) {
2222
switch (kind) {
23-
case FfiFunctionKind::kAsyncCallback:
23+
case FfiCallbackKind::kAsyncCallback:
2424
return Symbols::FfiAsyncCallback();
25-
case FfiFunctionKind::kIsolateLocalClosureCallback:
25+
case FfiCallbackKind::kIsolateLocalClosureCallback:
2626
return Symbols::FfiIsolateLocalCallback();
27-
case FfiFunctionKind::kIsolateLocalStaticCallback:
27+
case FfiCallbackKind::kIsolateLocalStaticCallback:
2828
return String::Handle(
2929
zone, Symbols::FromConcat(thread, Symbols::FfiCallback(),
3030
String::Handle(zone, dart_target.name())));
@@ -36,7 +36,7 @@ const String& NativeCallbackFunctionName(Thread* thread,
3636
FunctionPtr NativeCallbackFunction(const FunctionType& c_signature,
3737
const Function& dart_target,
3838
const Instance& exceptional_return,
39-
FfiFunctionKind kind) {
39+
FfiCallbackKind kind) {
4040
Thread* const thread = Thread::Current();
4141
Zone* const zone = thread->zone();
4242
Function& function = Function::Handle(zone);
@@ -64,7 +64,7 @@ FunctionPtr NativeCallbackFunction(const FunctionType& c_signature,
6464
// the body.
6565
function.SetFfiCSignature(c_signature);
6666
function.SetFfiCallbackTarget(dart_target);
67-
function.SetFfiFunctionKind(kind);
67+
function.SetFfiCallbackKind(kind);
6868

6969
// We need to load the exceptional return value as a constant in the generated
7070
// function. Even though the FE ensures that it is a constant, it could still

runtime/vm/compiler/ffi/callback.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace ffi {
2323
FunctionPtr NativeCallbackFunction(const FunctionType& c_signature,
2424
const Function& dart_target,
2525
const Instance& exceptional_return,
26-
FfiFunctionKind kind);
26+
FfiCallbackKind kind);
2727

2828
// Builds a mapping from `callback-id` to code object / ...
2929
//

runtime/vm/compiler/frontend/base_flow_graph_builder.cc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#include <utility>
88

99
#include "vm/compiler/backend/range_analysis.h" // For Range.
10-
#include "vm/compiler/ffi/call.h"
1110
#include "vm/compiler/frontend/flow_graph_builder.h" // For InlineExitCollector.
1211
#include "vm/compiler/jit/compiler.h" // For Compiler::IsBackgroundCompilation().
1312
#include "vm/compiler/runtime_api.h"

runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3352,14 +3352,14 @@ Fragment StreamingFlowGraphBuilder::BuildStaticInvocation(TokenPosition* p) {
33523352
return BuildFfiCall();
33533353
case MethodRecognizer::kFfiNativeCallbackFunction:
33543354
return BuildFfiNativeCallbackFunction(
3355-
FfiFunctionKind::kIsolateLocalStaticCallback);
3355+
FfiCallbackKind::kIsolateLocalStaticCallback);
33563356
case MethodRecognizer::kFfiNativeAddressOf:
33573357
return BuildFfiNativeAddressOf();
33583358
case MethodRecognizer::kFfiNativeIsolateLocalCallbackFunction:
33593359
return BuildFfiNativeCallbackFunction(
3360-
FfiFunctionKind::kIsolateLocalClosureCallback);
3360+
FfiCallbackKind::kIsolateLocalClosureCallback);
33613361
case MethodRecognizer::kFfiNativeAsyncCallbackFunction:
3362-
return BuildFfiNativeCallbackFunction(FfiFunctionKind::kAsyncCallback);
3362+
return BuildFfiNativeCallbackFunction(FfiCallbackKind::kAsyncCallback);
33633363
case MethodRecognizer::kFfiLoadAbiSpecificInt:
33643364
return BuildLoadAbiSpecificInt(/*at_index=*/false);
33653365
case MethodRecognizer::kFfiLoadAbiSpecificIntAtIndex:
@@ -6325,23 +6325,23 @@ Fragment StreamingFlowGraphBuilder::BuildCachableIdempotentCall(
63256325
}
63266326

63276327
Fragment StreamingFlowGraphBuilder::BuildFfiNativeCallbackFunction(
6328-
FfiFunctionKind kind) {
6328+
FfiCallbackKind kind) {
63296329
// The call-site must look like this (guaranteed by the FE which inserts it):
63306330
//
6331-
// FfiFunctionKind::kIsolateLocalStaticCallback:
6331+
// FfiCallbackKind::kIsolateLocalStaticCallback:
63326332
// _nativeCallbackFunction<NativeSignatureType>(target, exceptionalReturn)
63336333
//
6334-
// FfiFunctionKind::kAsyncCallback:
6334+
// FfiCallbackKind::kAsyncCallback:
63356335
// _nativeAsyncCallbackFunction<NativeSignatureType>()
63366336
//
6337-
// FfiFunctionKind::kIsolateLocalClosureCallback:
6337+
// FfiCallbackKind::kIsolateLocalClosureCallback:
63386338
// _nativeIsolateLocalCallbackFunction<NativeSignatureType>(
63396339
// exceptionalReturn)
63406340
//
63416341
// The FE also guarantees that the arguments are constants.
63426342

6343-
const bool has_target = kind == FfiFunctionKind::kIsolateLocalStaticCallback;
6344-
const bool has_exceptional_return = kind != FfiFunctionKind::kAsyncCallback;
6343+
const bool has_target = kind == FfiCallbackKind::kIsolateLocalStaticCallback;
6344+
const bool has_exceptional_return = kind != FfiCallbackKind::kAsyncCallback;
63456345
const intptr_t expected_argc =
63466346
static_cast<int>(has_target) + static_cast<int>(has_exceptional_return);
63476347

runtime/vm/compiler/frontend/kernel_binary_flowgraph.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ class StreamingFlowGraphBuilder : public KernelReaderHelper {
392392

393393
// Build FG for '_nativeCallbackFunction'. Reads an Arguments from the
394394
// Kernel buffer and pushes the resulting Function object.
395-
Fragment BuildFfiNativeCallbackFunction(FfiFunctionKind kind);
395+
Fragment BuildFfiNativeCallbackFunction(FfiCallbackKind kind);
396396

397397
Fragment BuildFfiNativeAddressOf();
398398

0 commit comments

Comments
 (0)