[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 <alexmarkov@google.com>
Reviewed-by: Daco Harkes <dacoharkes@google.com>
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 7464031..0d06325 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -20,7 +20,6 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #include "vm/compiler/assembler/assembler.h"
-#include "vm/compiler/ffi/call.h"
 #include "vm/compiler/ffi/callback.h"
 #include "vm/compiler/ffi/marshaller.h"
 #include "vm/compiler/jit/compiler.h"
diff --git a/runtime/vm/canonical_tables.h b/runtime/vm/canonical_tables.h
index 70e4618..0b0f5ef 100644
--- a/runtime/vm/canonical_tables.h
+++ b/runtime/vm/canonical_tables.h
@@ -425,7 +425,7 @@
             f1.FfiCSignature() == f2.FfiCSignature() &&
             f1.FfiCallbackExceptionalReturn() ==
                 f2.FfiCallbackExceptionalReturn() &&
-            f1.GetFfiFunctionKind() == f2.GetFfiFunctionKind());
+            f1.GetFfiCallbackKind() == f2.GetFfiCallbackKind());
   }
   static bool ReportStats() { return false; }
 };
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index b98a9c4..2a28718 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -1044,7 +1044,7 @@
       // Local closure function.
       const auto& target = Function::Cast(entry);
       AddFunction(target, RetainReasons::kLocalClosure);
-      if (target.IsFfiTrampoline()) {
+      if (target.IsFfiCallbackTrampoline()) {
         const auto& callback_target =
             Function::Handle(Z, target.FfiCallbackTarget());
         if (!callback_target.IsNull()) {
@@ -1117,7 +1117,7 @@
   const Class& owner = Class::Handle(Z, function.Owner());
   AddTypesOf(owner);
 
-  if (function.IsFfiTrampoline()) {
+  if (function.IsFfiCallbackTrampoline()) {
     AddType(FunctionType::Handle(Z, function.FfiCSignature()));
   }
 
@@ -2030,7 +2030,7 @@
     // Ffi trampoline functions are not reachable from program structure,
     // they are referenced only from code (object pool).
     if (!functions_to_retain_.ContainsKey(function) &&
-        !function.IsFfiTrampoline()) {
+        !function.IsFfiCallbackTrampoline()) {
       FATAL("Function %s was not traced in TraceForRetainedFunctions\n",
             function.ToFullyQualifiedCString());
     }
@@ -2189,7 +2189,7 @@
       // which need the signature.
       return AddRetainReason(sig, RetainReasons::kClosureSignature);
     }
-    if (function.IsFfiTrampoline()) {
+    if (function.IsFfiCallbackTrampoline()) {
       // FFI trampolines may be dynamically called.
       return AddRetainReason(sig, RetainReasons::kFfiTrampolineSignature);
     }
@@ -3015,7 +3015,7 @@
       }
 
       // Retain Code objects corresponding to FFI trampolines.
-      if (function_.IsFfiTrampoline()) {
+      if (function_.IsFfiCallbackTrampoline()) {
         ++codes_with_ffi_trampoline_function_;
         return;
       }
@@ -3455,8 +3455,7 @@
     function.AttachCode(code);
   }
 
-  if (function.IsFfiTrampoline() &&
-      function.GetFfiFunctionKind() != FfiFunctionKind::kCall) {
+  if (function.IsFfiCallbackTrampoline()) {
     compiler::ffi::SetFfiCallbackCode(thread(), function, code);
   }
 }
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index 1688efe..b208aac 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -167,7 +167,7 @@
 bool FlowGraph::ShouldReorderBlocks(const Function& function,
                                     bool is_optimized) {
   return is_optimized && FLAG_reorder_basic_blocks &&
-         !function.is_intrinsic() && !function.IsFfiTrampoline();
+         !function.is_intrinsic() && !function.IsFfiCallbackTrampoline();
 }
 
 GrowableArray<BlockEntryInstr*>* FlowGraph::CodegenBlockOrder(
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
index b2d5dfc..d3cbf79 100644
--- a/runtime/vm/compiler/backend/il_serializer.cc
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -11,7 +11,6 @@
 #include "vm/compiler/backend/flow_graph.h"
 #include "vm/compiler/backend/il.h"
 #include "vm/compiler/backend/range_analysis.h"
-#include "vm/compiler/ffi/call.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -837,20 +836,12 @@
       return;
     }
     case UntaggedFunction::kFfiTrampoline: {
-      s->Write<uint8_t>(static_cast<uint8_t>(x.GetFfiFunctionKind()));
+      s->Write<uint8_t>(static_cast<uint8_t>(x.GetFfiCallbackKind()));
       s->Write<const FunctionType&>(
           FunctionType::Handle(zone, x.FfiCSignature()));
-      if (x.GetFfiFunctionKind() != FfiFunctionKind::kCall) {
-        s->Write<const Function&>(
-            Function::Handle(zone, x.FfiCallbackTarget()));
-        s->Write<const Instance&>(
-            Instance::Handle(zone, x.FfiCallbackExceptionalReturn()));
-      } else {
-        s->Write<const String&>(String::Handle(zone, x.name()));
-        s->Write<const FunctionType&>(
-            FunctionType::Handle(zone, x.signature()));
-        s->Write<bool>(x.FfiIsLeaf());
-      }
+      s->Write<const Function&>(Function::Handle(zone, x.FfiCallbackTarget()));
+      s->Write<const Instance&>(
+          Instance::Handle(zone, x.FfiCallbackExceptionalReturn()));
       return;
     }
     default:
@@ -927,23 +918,14 @@
                                   target.GetDynamicInvocationForwarder(name));
     }
     case UntaggedFunction::kFfiTrampoline: {
-      const FfiFunctionKind kind =
-          static_cast<FfiFunctionKind>(d->Read<uint8_t>());
+      const FfiCallbackKind kind =
+          static_cast<FfiCallbackKind>(d->Read<uint8_t>());
       const FunctionType& c_signature = d->Read<const FunctionType&>();
-      if (kind != FfiFunctionKind::kCall) {
-        const Function& callback_target = d->Read<const Function&>();
-        const Instance& exceptional_return = d->Read<const Instance&>();
-        return Function::ZoneHandle(
-            zone, compiler::ffi::NativeCallbackFunction(
-                      c_signature, callback_target, exceptional_return, kind));
-      } else {
-        const String& name = d->Read<const String&>();
-        const FunctionType& signature = d->Read<const FunctionType&>();
-        const bool is_leaf = d->Read<bool>();
-        return Function::ZoneHandle(
-            zone, compiler::ffi::TrampolineFunction(name, signature,
-                                                    c_signature, is_leaf));
-      }
+      const Function& callback_target = d->Read<const Function&>();
+      const Instance& exceptional_return = d->Read<const Instance&>();
+      return Function::ZoneHandle(
+          zone, compiler::ffi::NativeCallbackFunction(
+                    c_signature, callback_target, exceptional_return, kind));
     }
     default:
       UNIMPLEMENTED();
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 9a051b6e..997bb8d 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -100,8 +100,6 @@
   "compiler_timings.h",
   "ffi/abi.cc",
   "ffi/abi.h",
-  "ffi/call.cc",
-  "ffi/call.h",
   "ffi/callback.cc",
   "ffi/callback.h",
   "ffi/frame_rebase.cc",
diff --git a/runtime/vm/compiler/ffi/call.cc b/runtime/vm/compiler/ffi/call.cc
deleted file mode 100644
index faf6936..0000000
--- a/runtime/vm/compiler/ffi/call.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/compiler/ffi/call.h"
-
-#include "vm/class_finalizer.h"
-#include "vm/symbols.h"
-
-namespace dart {
-
-namespace compiler {
-
-namespace ffi {
-
-// TODO(dartbug.com/36607): Cache the trampolines.
-FunctionPtr TrampolineFunction(const String& name,
-                               const FunctionType& signature,
-                               const FunctionType& c_signature,
-                               bool is_leaf) {
-  ASSERT(signature.num_implicit_parameters() == 1);
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  const Library& lib = Library::Handle(zone, Library::FfiLibrary());
-  const Class& owner_class = Class::Handle(zone, lib.toplevel_class());
-  Function& function = Function::Handle(
-      zone, Function::New(signature, name, UntaggedFunction::kFfiTrampoline,
-                          /*is_static=*/true,
-                          /*is_const=*/false,
-                          /*is_abstract=*/false,
-                          /*is_external=*/false,
-                          /*is_native=*/false, owner_class,
-                          TokenPosition::kMinSource));
-  function.set_is_debuggable(false);
-
-  // Create unique names for the parameters, as they are used in scope building
-  // and error messages.
-  if (signature.num_fixed_parameters() > 0) {
-    function.CreateNameArray();
-    function.SetParameterNameAt(0, Symbols::ClosureParameter());
-    auto& param_name = String::Handle(zone);
-    for (intptr_t i = 1, n = signature.num_fixed_parameters(); i < n; ++i) {
-      param_name = Symbols::NewFormatted(thread, ":ffi_param%" Pd, i);
-      function.SetParameterNameAt(i, param_name);
-    }
-  }
-
-  function.SetFfiCSignature(c_signature);
-  function.SetFfiIsLeaf(is_leaf);
-  function.SetFfiFunctionKind(FfiFunctionKind::kCall);
-
-  return function.ptr();
-}
-
-FunctionPtr TrampolineFunction(const FunctionType& dart_signature,
-                               const FunctionType& c_signature,
-                               bool is_leaf,
-                               const String& function_name) {
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  String& name =
-      String::Handle(zone, Symbols::NewFormatted(thread, "FfiTrampoline_%s",
-                                                 function_name.ToCString()));
-
-  // Trampolines have no optional arguments.
-  FunctionType& signature = FunctionType::Handle(zone, FunctionType::New());
-  const intptr_t num_fixed = dart_signature.num_fixed_parameters();
-  signature.set_num_implicit_parameters(1);
-  signature.set_num_fixed_parameters(num_fixed);
-  signature.set_result_type(
-      AbstractType::Handle(zone, dart_signature.result_type()));
-  signature.set_parameter_types(
-      Array::Handle(zone, dart_signature.parameter_types()));
-  signature ^= ClassFinalizer::FinalizeType(signature);
-
-  return TrampolineFunction(name, signature, c_signature, is_leaf);
-}
-
-}  // namespace ffi
-
-}  // namespace compiler
-
-}  // namespace dart
diff --git a/runtime/vm/compiler/ffi/call.h b/runtime/vm/compiler/ffi/call.h
deleted file mode 100644
index 11c328a..0000000
--- a/runtime/vm/compiler/ffi/call.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef RUNTIME_VM_COMPILER_FFI_CALL_H_
-#define RUNTIME_VM_COMPILER_FFI_CALL_H_
-
-#if defined(DART_PRECOMPILED_RUNTIME)
-#error "AOT runtime should not use compiler sources (including header files)"
-#endif  // defined(DART_PRECOMPILED_RUNTIME)
-
-#include <platform/globals.h>
-
-#include "vm/raw_object.h"
-
-namespace dart {
-
-namespace compiler {
-
-namespace ffi {
-
-FunctionPtr TrampolineFunction(const String& name,
-                               const FunctionType& signature,
-                               const FunctionType& c_signature,
-                               bool is_leaf);
-
-FunctionPtr TrampolineFunction(const FunctionType& dart_signature,
-                               const FunctionType& c_signature,
-                               bool is_leaf,
-                               const String& function_name);
-
-}  // namespace ffi
-
-}  // namespace compiler
-
-}  // namespace dart
-
-#endif  // RUNTIME_VM_COMPILER_FFI_CALL_H_
diff --git a/runtime/vm/compiler/ffi/callback.cc b/runtime/vm/compiler/ffi/callback.cc
index 7a9ea1c..984b2a0 100644
--- a/runtime/vm/compiler/ffi/callback.cc
+++ b/runtime/vm/compiler/ffi/callback.cc
@@ -18,13 +18,13 @@
 const String& NativeCallbackFunctionName(Thread* thread,
                                          Zone* zone,
                                          const Function& dart_target,
-                                         FfiFunctionKind kind) {
+                                         FfiCallbackKind kind) {
   switch (kind) {
-    case FfiFunctionKind::kAsyncCallback:
+    case FfiCallbackKind::kAsyncCallback:
       return Symbols::FfiAsyncCallback();
-    case FfiFunctionKind::kIsolateLocalClosureCallback:
+    case FfiCallbackKind::kIsolateLocalClosureCallback:
       return Symbols::FfiIsolateLocalCallback();
-    case FfiFunctionKind::kIsolateLocalStaticCallback:
+    case FfiCallbackKind::kIsolateLocalStaticCallback:
       return String::Handle(
           zone, Symbols::FromConcat(thread, Symbols::FfiCallback(),
                                     String::Handle(zone, dart_target.name())));
@@ -36,7 +36,7 @@
 FunctionPtr NativeCallbackFunction(const FunctionType& c_signature,
                                    const Function& dart_target,
                                    const Instance& exceptional_return,
-                                   FfiFunctionKind kind) {
+                                   FfiCallbackKind kind) {
   Thread* const thread = Thread::Current();
   Zone* const zone = thread->zone();
   Function& function = Function::Handle(zone);
@@ -64,7 +64,7 @@
   // the body.
   function.SetFfiCSignature(c_signature);
   function.SetFfiCallbackTarget(dart_target);
-  function.SetFfiFunctionKind(kind);
+  function.SetFfiCallbackKind(kind);
 
   // We need to load the exceptional return value as a constant in the generated
   // function. Even though the FE ensures that it is a constant, it could still
diff --git a/runtime/vm/compiler/ffi/callback.h b/runtime/vm/compiler/ffi/callback.h
index 88af9a99..02b4294 100644
--- a/runtime/vm/compiler/ffi/callback.h
+++ b/runtime/vm/compiler/ffi/callback.h
@@ -23,7 +23,7 @@
 FunctionPtr NativeCallbackFunction(const FunctionType& c_signature,
                                    const Function& dart_target,
                                    const Instance& exceptional_return,
-                                   FfiFunctionKind kind);
+                                   FfiCallbackKind kind);
 
 // Builds a mapping from `callback-id` to code object / ...
 //
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 5e57d1c..8b78359 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "vm/compiler/backend/range_analysis.h"  // For Range.
-#include "vm/compiler/ffi/call.h"
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For InlineExitCollector.
 #include "vm/compiler/jit/compiler.h"  // For Compiler::IsBackgroundCompilation().
 #include "vm/compiler/runtime_api.h"
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index 5fb0834..ee5c2be 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -3352,14 +3352,14 @@
       return BuildFfiCall();
     case MethodRecognizer::kFfiNativeCallbackFunction:
       return BuildFfiNativeCallbackFunction(
-          FfiFunctionKind::kIsolateLocalStaticCallback);
+          FfiCallbackKind::kIsolateLocalStaticCallback);
     case MethodRecognizer::kFfiNativeAddressOf:
       return BuildFfiNativeAddressOf();
     case MethodRecognizer::kFfiNativeIsolateLocalCallbackFunction:
       return BuildFfiNativeCallbackFunction(
-          FfiFunctionKind::kIsolateLocalClosureCallback);
+          FfiCallbackKind::kIsolateLocalClosureCallback);
     case MethodRecognizer::kFfiNativeAsyncCallbackFunction:
-      return BuildFfiNativeCallbackFunction(FfiFunctionKind::kAsyncCallback);
+      return BuildFfiNativeCallbackFunction(FfiCallbackKind::kAsyncCallback);
     case MethodRecognizer::kFfiLoadAbiSpecificInt:
       return BuildLoadAbiSpecificInt(/*at_index=*/false);
     case MethodRecognizer::kFfiLoadAbiSpecificIntAtIndex:
@@ -6325,23 +6325,23 @@
 }
 
 Fragment StreamingFlowGraphBuilder::BuildFfiNativeCallbackFunction(
-    FfiFunctionKind kind) {
+    FfiCallbackKind kind) {
   // The call-site must look like this (guaranteed by the FE which inserts it):
   //
-  // FfiFunctionKind::kIsolateLocalStaticCallback:
+  // FfiCallbackKind::kIsolateLocalStaticCallback:
   //   _nativeCallbackFunction<NativeSignatureType>(target, exceptionalReturn)
   //
-  // FfiFunctionKind::kAsyncCallback:
+  // FfiCallbackKind::kAsyncCallback:
   //   _nativeAsyncCallbackFunction<NativeSignatureType>()
   //
-  // FfiFunctionKind::kIsolateLocalClosureCallback:
+  // FfiCallbackKind::kIsolateLocalClosureCallback:
   //   _nativeIsolateLocalCallbackFunction<NativeSignatureType>(
   //       exceptionalReturn)
   //
   // The FE also guarantees that the arguments are constants.
 
-  const bool has_target = kind == FfiFunctionKind::kIsolateLocalStaticCallback;
-  const bool has_exceptional_return = kind != FfiFunctionKind::kAsyncCallback;
+  const bool has_target = kind == FfiCallbackKind::kIsolateLocalStaticCallback;
+  const bool has_exceptional_return = kind != FfiCallbackKind::kAsyncCallback;
   const intptr_t expected_argc =
       static_cast<int>(has_target) + static_cast<int>(has_exceptional_return);
 
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index 75811a2..475d660 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -392,7 +392,7 @@
 
   // Build FG for '_nativeCallbackFunction'. Reads an Arguments from the
   // Kernel buffer and pushes the resulting Function object.
-  Fragment BuildFfiNativeCallbackFunction(FfiFunctionKind kind);
+  Fragment BuildFfiNativeCallbackFunction(FfiCallbackKind kind);
 
   Fragment BuildFfiNativeAddressOf();
 
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index add8438..1c18201 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -5031,15 +5031,12 @@
 
 FlowGraph* FlowGraphBuilder::BuildGraphOfFfiTrampoline(
     const Function& function) {
-  switch (function.GetFfiFunctionKind()) {
-    case FfiFunctionKind::kIsolateLocalStaticCallback:
-    case FfiFunctionKind::kIsolateLocalClosureCallback:
+  switch (function.GetFfiCallbackKind()) {
+    case FfiCallbackKind::kIsolateLocalStaticCallback:
+    case FfiCallbackKind::kIsolateLocalClosureCallback:
       return BuildGraphOfSyncFfiCallback(function);
-    case FfiFunctionKind::kAsyncCallback:
+    case FfiCallbackKind::kAsyncCallback:
       return BuildGraphOfAsyncFfiCallback(function);
-    case FfiFunctionKind::kCall:
-      UNREACHABLE();
-      return nullptr;
   }
   UNREACHABLE();
   return nullptr;
@@ -5330,8 +5327,8 @@
   RELEASE_ASSERT(error == nullptr);
   RELEASE_ASSERT(marshaller_ptr != nullptr);
   const auto& marshaller = *marshaller_ptr;
-  const bool is_closure = function.GetFfiFunctionKind() ==
-                          FfiFunctionKind::kIsolateLocalClosureCallback;
+  const bool is_closure = function.GetFfiCallbackKind() ==
+                          FfiCallbackKind::kIsolateLocalClosureCallback;
 
   graph_entry_ =
       new (Z) GraphEntryInstr(*parsed_function_, Compiler::kNoOSRDeoptId);
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index fa148b5..435d92f 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -407,17 +407,14 @@
     }
     case UntaggedFunction::kFfiTrampoline: {
       needs_expr_temp_ = true;
-      // Callbacks and calls with handles need try/catch variables.
-      if ((function.GetFfiFunctionKind() != FfiFunctionKind::kCall ||
-           function.FfiCSignatureContainsHandles())) {
-        ++depth_.try_;
-        AddTryVariables();
-        --depth_.try_;
-        ++depth_.catch_;
-        AddCatchVariables();
-        FinalizeCatchVariables();
-        --depth_.catch_;
-      }
+      // Callbacks need try/catch variables.
+      ++depth_.try_;
+      AddTryVariables();
+      --depth_.try_;
+      ++depth_.catch_;
+      AddCatchVariables();
+      FinalizeCatchVariables();
+      --depth_.catch_;
       FALL_THROUGH;
     }
     case UntaggedFunction::kInvokeFieldDispatcher: {
@@ -438,7 +435,7 @@
         LocalVariable* variable = MakeVariable(
             TokenPosition::kNoSource, TokenPosition::kNoSource,
             String::ZoneHandle(Z, function.ParameterNameAt(i)),
-            AbstractType::ZoneHandle(Z, function.IsFfiTrampoline()
+            AbstractType::ZoneHandle(Z, function.IsFfiCallbackTrampoline()
                                             ? function.ParameterTypeAt(i)
                                             : Object::dynamic_type().ptr()));
         bool added = scope_->InsertParameterAt(i, variable);
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index ff2122f..46b07a2 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -476,8 +476,7 @@
     }
   }
 
-  if (function.IsFfiTrampoline() &&
-      function.GetFfiFunctionKind() != FfiFunctionKind::kCall) {
+  if (function.IsFfiCallbackTrampoline()) {
     compiler::ffi::SetFfiCallbackCode(thread(), function, code);
   }
 
diff --git a/runtime/vm/ffi_callback_metadata.cc b/runtime/vm/ffi_callback_metadata.cc
index c8d5f3c..93febd1 100644
--- a/runtime/vm/ffi_callback_metadata.cc
+++ b/runtime/vm/ffi_callback_metadata.cc
@@ -275,13 +275,13 @@
   if (closure.IsNull()) {
     // If the closure is null, it means the target is a static function, so is
     // baked into the trampoline and is an ordinary sync callback.
-    ASSERT(function.GetFfiFunctionKind() ==
-           FfiFunctionKind::kIsolateLocalStaticCallback);
+    ASSERT(function.GetFfiCallbackKind() ==
+           FfiCallbackKind::kIsolateLocalStaticCallback);
     return CreateSyncFfiCallbackImpl(isolate, zone, function, nullptr,
                                      list_head);
   } else {
-    ASSERT(function.GetFfiFunctionKind() ==
-           FfiFunctionKind::kIsolateLocalClosureCallback);
+    ASSERT(function.GetFfiCallbackKind() ==
+           FfiCallbackKind::kIsolateLocalClosureCallback);
     return CreateSyncFfiCallbackImpl(isolate, zone, function,
                                      CreatePersistentHandle(isolate, closure),
                                      list_head);
@@ -319,7 +319,7 @@
     const Function& send_function,
     Dart_Port send_port,
     Metadata** list_head) {
-  ASSERT(send_function.GetFfiFunctionKind() == FfiFunctionKind::kAsyncCallback);
+  ASSERT(send_function.GetFfiCallbackKind() == FfiCallbackKind::kAsyncCallback);
   return CreateMetadataEntry(isolate, TrampolineType::kAsync,
                              GetEntryPoint(zone, send_function),
                              static_cast<uint64_t>(send_port), list_head);
diff --git a/runtime/vm/ffi_callback_metadata_test.cc b/runtime/vm/ffi_callback_metadata_test.cc
index 2040e1d..b09896b 100644
--- a/runtime/vm/ffi_callback_metadata_test.cc
+++ b/runtime/vm/ffi_callback_metadata_test.cc
@@ -22,7 +22,7 @@
 
 namespace dart {
 
-FunctionPtr CreateTestFunction(FfiFunctionKind kind) {
+FunctionPtr CreateTestFunction(FfiCallbackKind kind) {
   const auto& ffi_lib = Library::Handle(Library::FfiLibrary());
   const auto& ffi_void = Class::Handle(ffi_lib.LookupClass(Symbols::FfiVoid()));
   const auto& ffi_void_type =
@@ -92,7 +92,7 @@
     auto* zone = thread->zone();
 
     const auto& func = Function::Handle(
-        CreateTestFunction(FfiFunctionKind::kIsolateLocalStaticCallback));
+        CreateTestFunction(FfiCallbackKind::kIsolateLocalStaticCallback));
     const auto& code = Code::Handle(func.EnsureHasCode());
     EXPECT(!code.IsNull());
 
@@ -185,7 +185,7 @@
     auto* zone = thread->zone();
 
     const Function& func =
-        Function::Handle(CreateTestFunction(FfiFunctionKind::kAsyncCallback));
+        Function::Handle(CreateTestFunction(FfiCallbackKind::kAsyncCallback));
     const Code& code = Code::Handle(func.EnsureHasCode());
     EXPECT(!code.IsNull());
 
@@ -280,13 +280,13 @@
     auto* zone = thread->zone();
 
     const Function& func = Function::Handle(
-        CreateTestFunction(FfiFunctionKind::kIsolateLocalClosureCallback));
+        CreateTestFunction(FfiCallbackKind::kIsolateLocalClosureCallback));
     const Code& code = Code::Handle(func.EnsureHasCode());
     EXPECT(!code.IsNull());
 
-    // Using a FfiFunctionKind::kSync function as a dummy closure.
+    // Using a FfiCallbackKind::kSync function as a dummy closure.
     const Function& closure_func = Function::Handle(
-        CreateTestFunction(FfiFunctionKind::kIsolateLocalStaticCallback));
+        CreateTestFunction(FfiCallbackKind::kIsolateLocalStaticCallback));
     const Context& context = Context::Handle(Context::null());
     const Closure& closure1 = Closure::Handle(
         Closure::New(Object::null_type_arguments(),
@@ -373,7 +373,7 @@
   auto* fcm = FfiCallbackMetadata::Instance();
 
   const Function& func =
-      Function::Handle(CreateTestFunction(FfiFunctionKind::kAsyncCallback));
+      Function::Handle(CreateTestFunction(FfiCallbackKind::kAsyncCallback));
   const Code& code = Code::Handle(func.EnsureHasCode());
   EXPECT(!code.IsNull());
 
@@ -440,7 +440,7 @@
   FfiCallbackMetadata::Metadata* list_head = nullptr;
 
   const auto& sync_func = Function::Handle(
-      CreateTestFunction(FfiFunctionKind::kIsolateLocalStaticCallback));
+      CreateTestFunction(FfiCallbackKind::kIsolateLocalStaticCallback));
   const auto& sync_code = Code::Handle(sync_func.EnsureHasCode());
   EXPECT(!sync_code.IsNull());
 
@@ -521,11 +521,11 @@
   FfiCallbackMetadata::Metadata* list_head = nullptr;
 
   const Function& async_func =
-      Function::Handle(CreateTestFunction(FfiFunctionKind::kAsyncCallback));
+      Function::Handle(CreateTestFunction(FfiCallbackKind::kAsyncCallback));
   const Code& async_code = Code::Handle(async_func.EnsureHasCode());
   EXPECT(!async_code.IsNull());
   const Function& sync_func = Function::Handle(
-      CreateTestFunction(FfiFunctionKind::kIsolateLocalStaticCallback));
+      CreateTestFunction(FfiCallbackKind::kIsolateLocalStaticCallback));
   const auto& sync_code = Code::Handle(sync_func.EnsureHasCode());
   EXPECT(!sync_code.IsNull());
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index f4ed6f2..dbee5e74 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -8336,7 +8336,8 @@
 
 FunctionPtr Function::implicit_closure_function() const {
   if (IsClosureFunction() || IsDispatcherOrImplicitAccessor() ||
-      IsFieldInitializer() || IsFfiTrampoline() || IsMethodExtractor()) {
+      IsFieldInitializer() || IsFfiCallbackTrampoline() ||
+      IsMethodExtractor()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(data());
@@ -8371,7 +8372,7 @@
 }
 
 void Function::SetFfiCSignature(const FunctionType& sig) const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_c_signature(sig);
@@ -8379,7 +8380,7 @@
 
 FunctionTypePtr Function::FfiCSignature() const {
   auto* const zone = Thread::Current()->zone();
-  if (IsFfiTrampoline()) {
+  if (IsFfiCallbackTrampoline()) {
     const Object& obj = Object::Handle(zone, data());
     ASSERT(!obj.IsNull());
     return FfiTrampolineData::Cast(obj).c_signature();
@@ -8420,7 +8421,7 @@
 
 // Keep consistent with BaseMarshaller::IsCompound.
 bool Function::FfiCSignatureReturnsStruct() const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   Zone* zone = Thread::Current()->zone();
   const auto& c_signature = FunctionType::Handle(zone, FfiCSignature());
   const auto& type = AbstractType::Handle(zone, c_signature.result_type());
@@ -8446,8 +8447,7 @@
 }
 
 int32_t Function::FfiCallbackId() const {
-  ASSERT(IsFfiTrampoline());
-  ASSERT(GetFfiFunctionKind() != FfiFunctionKind::kCall);
+  ASSERT(IsFfiCallbackTrampoline());
 
   const auto& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
@@ -8459,8 +8459,7 @@
 }
 
 void Function::AssignFfiCallbackId(int32_t callback_id) const {
-  ASSERT(IsFfiTrampoline());
-  ASSERT(GetFfiFunctionKind() != FfiFunctionKind::kCall);
+  ASSERT(IsFfiCallbackTrampoline());
 
   const auto& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
@@ -8472,11 +8471,6 @@
 
 bool Function::FfiIsLeaf() const {
   Zone* zone = Thread::Current()->zone();
-  if (IsFfiTrampoline()) {
-    const Object& obj = Object::Handle(untag()->data());
-    ASSERT(!obj.IsNull());
-    return FfiTrampolineData::Cast(obj).is_leaf();
-  }
   auto& pragma_value = Instance::Handle(zone);
   if (is_ffi_native()) {
     pragma_value = GetNativeAnnotation();
@@ -8497,50 +8491,43 @@
       .value();
 }
 
-void Function::SetFfiIsLeaf(bool is_leaf) const {
-  ASSERT(IsFfiTrampoline());
-  const Object& obj = Object::Handle(untag()->data());
-  ASSERT(!obj.IsNull());
-  FfiTrampolineData::Cast(obj).set_is_leaf(is_leaf);
-}
-
 FunctionPtr Function::FfiCallbackTarget() const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).callback_target();
 }
 
 void Function::SetFfiCallbackTarget(const Function& target) const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_callback_target(target);
 }
 
 InstancePtr Function::FfiCallbackExceptionalReturn() const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).callback_exceptional_return();
 }
 
 void Function::SetFfiCallbackExceptionalReturn(const Instance& value) const {
-  ASSERT(IsFfiTrampoline());
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_callback_exceptional_return(value);
 }
 
-FfiFunctionKind Function::GetFfiFunctionKind() const {
-  ASSERT(IsFfiTrampoline());
+FfiCallbackKind Function::GetFfiCallbackKind() const {
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   return FfiTrampolineData::Cast(obj).ffi_function_kind();
 }
 
-void Function::SetFfiFunctionKind(FfiFunctionKind value) const {
-  ASSERT(IsFfiTrampoline());
+void Function::SetFfiCallbackKind(FfiCallbackKind value) const {
+  ASSERT(IsFfiCallbackTrampoline());
   const Object& obj = Object::Handle(data());
   ASSERT(!obj.IsNull());
   FfiTrampolineData::Cast(obj).set_ffi_function_kind(value);
@@ -9146,8 +9133,8 @@
 
 bool Function::ForceOptimize() const {
   if (RecognizedKindForceOptimize() || IsFfiCallClosure() ||
-      IsFfiTrampoline() || is_ffi_native() || IsTypedDataViewFactory() ||
-      IsUnmodifiableTypedDataViewFactory()) {
+      IsFfiCallbackTrampoline() || is_ffi_native() ||
+      IsTypedDataViewFactory() || IsUnmodifiableTypedDataViewFactory()) {
     return true;
   }
 
@@ -9280,7 +9267,7 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
 bool Function::CanBeInlined() const {
   if (ForceOptimize()) {
-    if (IsFfiCallClosure() || IsFfiTrampoline() || is_ffi_native()) {
+    if (IsFfiCallClosure() || IsFfiCallbackTrampoline() || is_ffi_native()) {
       // We currently don't support inlining FFI trampolines. Some of them
       // are naturally non-inlinable because they contain a try/catch block,
       // but this condition is broader than strictly necessary.
@@ -11032,7 +11019,7 @@
 
 intptr_t Function::KernelLibraryIndex() const {
   if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher() ||
-      IsFfiTrampoline()) {
+      IsFfiCallbackTrampoline()) {
     return -1;
   }
   if (is_eval_function()) {
@@ -11795,16 +11782,12 @@
   StoreNonPointer(&untag()->callback_id_, callback_id);
 }
 
-void FfiTrampolineData::set_is_leaf(bool is_leaf) const {
-  StoreNonPointer(&untag()->is_leaf_, is_leaf);
-}
-
 void FfiTrampolineData::set_callback_exceptional_return(
     const Instance& value) const {
   untag()->set_callback_exceptional_return(value.ptr());
 }
 
-void FfiTrampolineData::set_ffi_function_kind(FfiFunctionKind kind) const {
+void FfiTrampolineData::set_ffi_function_kind(FfiCallbackKind kind) const {
   StoreNonPointer(&untag()->ffi_function_kind_, static_cast<uint8_t>(kind));
 }
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a97f89f..255cab4 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -2949,8 +2949,7 @@
   }
 };
 
-enum class FfiFunctionKind : uint8_t {
-  kCall,
+enum class FfiCallbackKind : uint8_t {
   kIsolateLocalStaticCallback,
   kIsolateLocalClosureCallback,
   kAsyncCallback,
@@ -2986,37 +2985,31 @@
   bool FfiCSignatureReturnsStruct() const;
 
   // Can only be called on FFI trampolines.
-  // -1 for Dart -> native calls.
   int32_t FfiCallbackId() const;
 
   // Should be called when ffi trampoline function object is created.
   void AssignFfiCallbackId(int32_t callback_id) const;
 
-  // Can only be called on FFI trampolines.
+  // Can only be called on FFI natives and FFI call closures.
   bool FfiIsLeaf() const;
 
   // Can only be called on FFI trampolines.
-  void SetFfiIsLeaf(bool is_leaf) const;
-
-  // Can only be called on FFI trampolines.
-  // Null for Dart -> native calls.
   FunctionPtr FfiCallbackTarget() const;
 
   // Can only be called on FFI trampolines.
   void SetFfiCallbackTarget(const Function& target) const;
 
   // Can only be called on FFI trampolines.
-  // Null for Dart -> native calls.
   InstancePtr FfiCallbackExceptionalReturn() const;
 
   // Can only be called on FFI trampolines.
   void SetFfiCallbackExceptionalReturn(const Instance& value) const;
 
   // Can only be called on FFI trampolines.
-  FfiFunctionKind GetFfiFunctionKind() const;
+  FfiCallbackKind GetFfiCallbackKind() const;
 
   // Can only be called on FFI trampolines.
-  void SetFfiFunctionKind(FfiFunctionKind value) const;
+  void SetFfiCallbackKind(FfiCallbackKind value) const;
 
   // Return the signature of this function.
   PRECOMPILER_WSR_FIELD_DECLARATION(FunctionType, signature);
@@ -3902,10 +3895,10 @@
   }
 
   // Returns true if this function represents an ffi trampoline.
-  bool IsFfiTrampoline() const {
+  bool IsFfiCallbackTrampoline() const {
     return kind() == UntaggedFunction::kFfiTrampoline;
   }
-  static bool IsFfiTrampoline(FunctionPtr function) {
+  static bool IsFfiCallbackTrampoline(FunctionPtr function) {
     NoSafepointScope no_safepoint;
     return function->untag()->kind_tag_.Read<KindBits>() ==
            UntaggedFunction::kFfiTrampoline;
@@ -4354,17 +4347,14 @@
   }
   void set_callback_exceptional_return(const Instance& value) const;
 
-  FfiFunctionKind ffi_function_kind() const {
-    return static_cast<FfiFunctionKind>(untag()->ffi_function_kind_);
+  FfiCallbackKind ffi_function_kind() const {
+    return static_cast<FfiCallbackKind>(untag()->ffi_function_kind_);
   }
-  void set_ffi_function_kind(FfiFunctionKind kind) const;
+  void set_ffi_function_kind(FfiCallbackKind kind) const;
 
   int32_t callback_id() const { return untag()->callback_id_; }
   void set_callback_id(int32_t value) const;
 
-  bool is_leaf() const { return untag()->is_leaf_; }
-  void set_is_leaf(bool value) const;
-
   static FfiTrampolineDataPtr New();
 
   FINAL_HEAP_OBJECT_IMPLEMENTATION(FfiTrampolineData, Object);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 291d46e..15e8b7f 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1501,10 +1501,7 @@
   // Check 'callback_target_' to determine if this is a callback or not.
   int32_t callback_id_;
 
-  // Whether this is a leaf call - i.e. one that doesn't call back into Dart.
-  bool is_leaf_;
-
-  // The kind of trampoline this is. See FfiFunctionKind.
+  // The kind of trampoline this is. See FfiCallbackKind.
   uint8_t ffi_function_kind_;
 };
 
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index 1d1b196..1947035 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -129,7 +129,7 @@
     // FfiTrampolines are the only functions that can still be called
     // dynamically without going through a dynamic invocation forwarder.
     RELEASE_ASSERT(!Function::IsDynamicInvocationForwarderName(function_name) &&
-                   !function.IsFfiTrampoline());
+                   !function.IsFfiCallbackTrampoline());
     // The signature for this function was dropped in the precompiler, which
     // means it is not a possible target for a dynamic call in the program.
     // That means we're resolving an UnlinkedCall for an InstanceCall to