@@ -1215,15 +1215,17 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
12151215 LocalVariable* arg_pointer = parsed_function_->RawParameterVariable (0 );
12161216 LocalVariable* arg_offset = parsed_function_->RawParameterVariable (1 );
12171217
1218- body += LoadLocal (arg_pointer );
1218+ body += LoadLocal (arg_offset );
12191219 body += CheckNullOptimized (TokenPosition::kNoSource ,
12201220 String::ZoneHandle (Z, function.name ()));
1221- body += LoadNativeField (Slot::Pointer_c_memory_address ());
1222- body += UnboxTruncate (kUnboxedFfiIntPtr );
1223- body += ConvertUnboxedToUntagged (kUnboxedFfiIntPtr );
1224- body += LoadLocal (arg_offset);
1221+ LocalVariable* arg_offset_not_null = MakeTemporary ();
1222+
1223+ body += LoadLocal (arg_pointer);
12251224 body += CheckNullOptimized (TokenPosition::kNoSource ,
12261225 String::ZoneHandle (Z, function.name ()));
1226+ // No GC from here til LoadIndexed.
1227+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
1228+ body += LoadLocal (arg_offset_not_null);
12271229 body += UnboxTruncate (kUnboxedFfiIntPtr );
12281230 body += LoadIndexedTypedData (typed_data_cid, /* index_scale=*/ 1 ,
12291231 /* index_unboxed=*/ true );
@@ -1263,11 +1265,13 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
12631265 LocalVariable* pointer = MakeTemporary ();
12641266 body += LoadLocal (pointer);
12651267 body += LoadLocal (address);
1266- body += StoreInstanceField (TokenPosition::kNoSource ,
1267- Slot::Pointer_c_memory_address ());
1268+ body += UnboxTruncate (kUnboxedFfiIntPtr );
1269+ body += ConvertUnboxedToUntagged (kUnboxedFfiIntPtr );
1270+ body += StoreUntagged (compiler::target::Pointer::data_offset ());
12681271 body += DropTempsPreserveTop (1 ); // Drop [address] keep [pointer].
12691272 }
12701273 }
1274+ body += DropTempsPreserveTop (1 ); // Drop [arg_offset].
12711275 } break ;
12721276 case MethodRecognizer::kFfiStoreInt8 :
12731277 case MethodRecognizer::kFfiStoreInt16 :
@@ -1327,21 +1331,27 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
13271331 }
13281332
13291333 ASSERT (function.NumParameters () == 3 );
1330- body += LoadLocal (arg_pointer); // Pointer.
1334+ body += LoadLocal (arg_offset);
13311335 body += CheckNullOptimized (TokenPosition::kNoSource ,
13321336 String::ZoneHandle (Z, function.name ()));
1333- body += LoadNativeField (Slot::Pointer_c_memory_address ());
1334- body += UnboxTruncate (kUnboxedFfiIntPtr );
1335- body += ConvertUnboxedToUntagged (kUnboxedFfiIntPtr );
1336- body += LoadLocal (arg_offset); // Offset.
1337+ LocalVariable* arg_offset_not_null = MakeTemporary ();
1338+ body += LoadLocal (arg_value);
13371339 body += CheckNullOptimized (TokenPosition::kNoSource ,
13381340 String::ZoneHandle (Z, function.name ()));
1339- body += UnboxTruncate (kUnboxedFfiIntPtr );
1340- body += LoadLocal (arg_value); // Value.
1341+ LocalVariable* arg_value_not_null = MakeTemporary ();
1342+
1343+ body += LoadLocal (arg_pointer); // Pointer.
13411344 body += CheckNullOptimized (TokenPosition::kNoSource ,
13421345 String::ZoneHandle (Z, function.name ()));
1346+ // No GC from here til StoreIndexed.
1347+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
1348+ body += LoadLocal (arg_offset_not_null);
1349+ body += UnboxTruncate (kUnboxedFfiIntPtr );
1350+ body += LoadLocal (arg_value_not_null);
13431351 if (kind == MethodRecognizer::kFfiStorePointer ) {
1344- body += LoadNativeField (Slot::Pointer_c_memory_address ());
1352+ // This can only be Pointer, so it is always safe to LoadUntagged.
1353+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
1354+ body += ConvertUntaggedToUnboxed (kUnboxedFfiIntPtr );
13451355 } else if (kind == MethodRecognizer::kFfiStoreFloat ||
13461356 kind == MethodRecognizer::kFfiStoreDouble ) {
13471357 body += UnboxTruncate (kUnboxedDouble );
@@ -1353,6 +1363,8 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
13531363 }
13541364 body += StoreIndexedTypedData (typed_data_cid, /* index_scale=*/ 1 ,
13551365 /* index_unboxed=*/ true );
1366+ body += Drop (); // Drop [arg_value].
1367+ body += Drop (); // Drop [arg_offset].
13561368 body += NullConstant ();
13571369 } break ;
13581370 case MethodRecognizer::kFfiFromAddress : {
@@ -1369,21 +1381,19 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
13691381 body += LoadLocal (parsed_function_->RawParameterVariable (0 )); // Address.
13701382 body += CheckNullOptimized (TokenPosition::kNoSource ,
13711383 String::ZoneHandle (Z, function.name ()));
1372- #if defined(TARGET_ARCH_IS_32_BIT)
1373- // Truncate to 32 bits on 32 bit architecture.
13741384 body += UnboxTruncate (kUnboxedFfiIntPtr );
1375- body += Box (kUnboxedFfiIntPtr );
1376- #endif // defined(TARGET_ARCH_IS_32_BIT)
1377- body += StoreInstanceField (TokenPosition::kNoSource ,
1378- Slot::Pointer_c_memory_address (),
1379- StoreInstanceFieldInstr::Kind::kInitializing );
1385+ body += ConvertUnboxedToUntagged (kUnboxedFfiIntPtr );
1386+ body += StoreUntagged (compiler::target::Pointer::data_offset ());
13801387 } break ;
13811388 case MethodRecognizer::kFfiGetAddress : {
13821389 ASSERT (function.NumParameters () == 1 );
13831390 body += LoadLocal (parsed_function_->RawParameterVariable (0 )); // Pointer.
13841391 body += CheckNullOptimized (TokenPosition::kNoSource ,
13851392 String::ZoneHandle (Z, function.name ()));
1386- body += LoadNativeField (Slot::Pointer_c_memory_address ());
1393+ // This can only be Pointer, so it is always safe to LoadUntagged.
1394+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
1395+ body += ConvertUntaggedToUnboxed (kUnboxedFfiIntPtr );
1396+ body += Box (kUnboxedFfiIntPtr );
13871397 } break ;
13881398 default : {
13891399 UNREACHABLE ();
@@ -2752,12 +2762,6 @@ Fragment FlowGraphBuilder::UnboxTruncate(Representation to) {
27522762 return Fragment (unbox);
27532763}
27542764
2755- Fragment FlowGraphBuilder::Box (Representation from) {
2756- BoxInstr* box = BoxInstr::Create (from, Pop ());
2757- Push (box);
2758- return Fragment (box);
2759- }
2760-
27612765Fragment FlowGraphBuilder::NativeReturn (
27622766 const compiler::ffi::CallbackMarshaller& marshaller) {
27632767 auto * instr = new (Z) NativeReturnInstr (TokenPosition::kNoSource , Pop (),
@@ -2787,9 +2791,9 @@ Fragment FlowGraphBuilder::FfiPointerFromAddress(const Type& result_type) {
27872791 LocalVariable* pointer = MakeTemporary ();
27882792 code += LoadLocal (pointer);
27892793 code += LoadLocal (address);
2790- code += StoreInstanceField (TokenPosition:: kNoSource ,
2791- Slot::Pointer_c_memory_address (),
2792- StoreInstanceFieldInstr::Kind:: kInitializing );
2794+ code += UnboxTruncate ( kUnboxedFfiIntPtr );
2795+ code += ConvertUnboxedToUntagged ( kUnboxedFfiIntPtr );
2796+ code += StoreUntagged ( compiler::target::Pointer::data_offset () );
27932797 code += StoreLocal (TokenPosition::kNoSource , result);
27942798 code += Drop (); // StoreLocal^
27952799 code += Drop (); // address
@@ -2837,11 +2841,13 @@ Fragment FlowGraphBuilder::FfiConvertArgumentToNative(
28372841 String::ZoneHandle (Z, marshaller.function_name ()));
28382842
28392843 if (marshaller.IsPointer (arg_index)) {
2840- body += LoadNativeField (Slot::Pointer_c_memory_address ());
2844+ // This can only be Pointer, so it is always safe to LoadUntagged.
2845+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
2846+ body += ConvertUntaggedToUnboxed (kUnboxedFfiIntPtr );
2847+ } else {
2848+ body += UnboxTruncate (marshaller.RepInDart (arg_index));
28412849 }
28422850
2843- body += UnboxTruncate (marshaller.RepInDart (arg_index));
2844-
28452851 if (marshaller.RequiresBitCast (arg_index)) {
28462852 body += BitCast (marshaller.RepInDart (arg_index),
28472853 marshaller.RepInFfiCall (arg_index));
@@ -2885,15 +2891,18 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfFfiNative(const Function& function) {
28852891 body += FfiConvertArgumentToNative (marshaller, i);
28862892 }
28872893
2888- // Push the function pointer, which is stored (boxed) in the first slot of the
2889- // context.
2894+ // Push the function pointer, which is stored (as Pointer object) in the
2895+ // first slot of the context.
28902896 body += LoadLocal (parsed_function_->ParameterVariable (0 ));
28912897 body += LoadNativeField (Slot::Closure_context ());
28922898 body += LoadNativeField (Slot::GetContextVariableSlotFor (
28932899 thread_, *MakeImplicitClosureScope (
28942900 Z, Class::Handle (I->object_store ()->ffi_pointer_class ()))
28952901 ->context_variables ()[0 ]));
2896- body += UnboxTruncate (kUnboxedFfiIntPtr );
2902+
2903+ // This can only be Pointer, so it is always safe to LoadUntagged.
2904+ body += LoadUntagged (compiler::target::Pointer::data_offset ());
2905+ body += ConvertUntaggedToUnboxed (kUnboxedFfiIntPtr );
28972906 body += FfiCall (marshaller);
28982907
28992908 body += FfiConvertArgumentToDart (marshaller, compiler::ffi::kResultIndex );
0 commit comments