Skip to content

Commit 01f4479

Browse files
committed
[vm/ffi] Change internal loads and stores to take byteOffesets
Change-Id: Iaff7aa9f158b3b168ccf2d7014a43b08afaa448e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/136182 Reviewed-by: Martin Kustermann <[email protected]>
1 parent 493779a commit 01f4479

File tree

5 files changed

+146
-134
lines changed

5 files changed

+146
-134
lines changed

runtime/lib/ffi.cc

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,10 @@ DEFINE_NATIVE_ENTRY(Ffi_address, 0, 1) {
103103
static RawObject* LoadValueNumeric(Zone* zone,
104104
const Pointer& target,
105105
classid_t type_cid,
106-
const Integer& index) {
106+
const Integer& offset) {
107107
// TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
108108
const size_t address =
109-
target.NativeAddress() +
110-
static_cast<intptr_t>(index.AsInt64Value()) *
111-
compiler::ffi::NativeType::FromTypedDataClassId(type_cid, zone)
112-
.SizeInBytes();
109+
target.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
113110
switch (type_cid) {
114111
case kFfiInt8Cid:
115112
return Integer::New(*reinterpret_cast<int8_t*>(address));
@@ -141,15 +138,15 @@ static RawObject* LoadValueNumeric(Zone* zone,
141138
#define DEFINE_NATIVE_ENTRY_LOAD(type) \
142139
DEFINE_NATIVE_ENTRY(Ffi_load##type, 0, 2) { \
143140
GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0)); \
144-
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1)); \
145-
return LoadValueNumeric(zone, pointer, kFfi##type##Cid, index); \
141+
GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1)); \
142+
return LoadValueNumeric(zone, pointer, kFfi##type##Cid, offset); \
146143
}
147144
CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_LOAD)
148145
#undef DEFINE_NATIVE_ENTRY_LOAD
149146

150147
DEFINE_NATIVE_ENTRY(Ffi_loadPointer, 1, 2) {
151148
GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
152-
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
149+
GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));
153150

154151
const auto& pointer_type_arg =
155152
AbstractType::Handle(zone, pointer.type_argument());
@@ -159,8 +156,7 @@ DEFINE_NATIVE_ENTRY(Ffi_loadPointer, 1, 2) {
159156

160157
// TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
161158
const size_t address =
162-
pointer.NativeAddress() + static_cast<intptr_t>(index.AsInt64Value()) *
163-
SizeOf(pointer_type_arg, zone);
159+
pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
164160

165161
return Pointer::New(type_arg, *reinterpret_cast<uword*>(address));
166162
}
@@ -209,14 +205,11 @@ DEFINE_NATIVE_ENTRY(Ffi_loadStruct, 0, 2) {
209205
static void StoreValueNumeric(Zone* zone,
210206
const Pointer& pointer,
211207
classid_t type_cid,
212-
const Integer& index,
208+
const Integer& offset,
213209
const Instance& new_value) {
214210
// TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
215211
const size_t address =
216-
pointer.NativeAddress() +
217-
static_cast<intptr_t>(index.AsInt64Value()) *
218-
compiler::ffi::NativeType::FromTypedDataClassId(type_cid, zone)
219-
.SizeInBytes();
212+
pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
220213
switch (type_cid) {
221214
case kFfiInt8Cid:
222215
*reinterpret_cast<int8_t*>(address) = AsInteger(new_value).AsInt64Value();
@@ -267,17 +260,17 @@ static void StoreValueNumeric(Zone* zone,
267260
#define DEFINE_NATIVE_ENTRY_STORE(type) \
268261
DEFINE_NATIVE_ENTRY(Ffi_store##type, 0, 3) { \
269262
GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0)); \
270-
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1)); \
263+
GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1)); \
271264
GET_NON_NULL_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(2)); \
272-
StoreValueNumeric(zone, pointer, kFfi##type##Cid, index, value); \
265+
StoreValueNumeric(zone, pointer, kFfi##type##Cid, offset, value); \
273266
return Object::null(); \
274267
}
275268
CLASS_LIST_FFI_NUMERIC(DEFINE_NATIVE_ENTRY_STORE)
276269
#undef DEFINE_NATIVE_ENTRY_STORE
277270

278271
DEFINE_NATIVE_ENTRY(Ffi_storePointer, 0, 3) {
279272
GET_NON_NULL_NATIVE_ARGUMENT(Pointer, pointer, arguments->NativeArgAt(0));
280-
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
273+
GET_NON_NULL_NATIVE_ARGUMENT(Integer, offset, arguments->NativeArgAt(1));
281274
GET_NON_NULL_NATIVE_ARGUMENT(Pointer, new_value, arguments->NativeArgAt(2));
282275
AbstractType& pointer_type_arg =
283276
AbstractType::Handle(pointer.type_argument());
@@ -296,8 +289,7 @@ DEFINE_NATIVE_ENTRY(Ffi_storePointer, 0, 3) {
296289
ASSERT(IsPointerType(pointer_type_arg));
297290
// TODO(36370): Make representation consistent with kUnboxedFfiIntPtr.
298291
const size_t address =
299-
pointer.NativeAddress() + static_cast<intptr_t>(index.AsInt64Value()) *
300-
SizeOf(pointer_type_arg, zone);
292+
pointer.NativeAddress() + static_cast<intptr_t>(offset.AsInt64Value());
301293
*reinterpret_cast<uword*>(address) = new_value.NativeAddress();
302294
return Object::null();
303295
}

runtime/tools/ffi/sdk_lib_ffi_generator.dart

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,10 @@ void generatePatchExtension(StringBuffer buffer, Config config) {
196196
final nativeType = config.nativeType;
197197
final dartType = config.dartType;
198198
final typedListType = config.typedListType;
199+
final elementSize = config.elementSize;
200+
201+
final sizeTimes =
202+
elementSize != 1 ? '${sizeOfIntPtrSize(elementSize)} * ' : '';
199203

200204
final asTypedList = typedListType == kDoNotEmit
201205
? ""
@@ -213,10 +217,10 @@ extension ${nativeType}Pointer on Pointer<$nativeType> {
213217
set value($dartType value) => _store$nativeType(this, 0, value);
214218
215219
@patch
216-
$dartType operator [](int index) => _load$nativeType(this, index);
220+
$dartType operator [](int index) => _load$nativeType(this, ${sizeTimes}index);
217221
218222
@patch
219-
operator []=(int index, $dartType value) => _store$nativeType(this, index, value);
223+
operator []=(int index, $dartType value) => _store$nativeType(this, ${sizeTimes}index, value);
220224
221225
$asTypedList
222226
}
@@ -259,6 +263,15 @@ String sizeOfBits(int size) {
259263
}
260264
}
261265

266+
String sizeOfIntPtrSize(int size) {
267+
switch (size) {
268+
case kIntPtrElementSize:
269+
return "_intPtrSize";
270+
default:
271+
return "$size";
272+
}
273+
}
274+
262275
String bracketOr(String input) {
263276
if (input.contains("or")) {
264277
return "($input)";

runtime/vm/compiler/frontend/kernel_to_il.cc

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,22 +1219,18 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
12191219
ASSERT(ffi_type_arg_cid == type_arg.type_class_id());
12201220

12211221
ASSERT(function.NumParameters() == 2);
1222-
body += LoadLocal(parsed_function_->RawParameterVariable(0)); // Pointer.
1222+
LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
1223+
LocalVariable* arg_offset = parsed_function_->RawParameterVariable(1);
1224+
1225+
body += LoadLocal(arg_pointer);
12231226
body += CheckNullOptimized(TokenPosition::kNoSource,
12241227
String::ZoneHandle(Z, function.name()));
12251228
body += LoadNativeField(Slot::Pointer_c_memory_address());
12261229
body += UnboxTruncate(kUnboxedFfiIntPtr);
1227-
// We do Pointer.address + index * sizeOf<T> manually because LoadIndexed
1228-
// does not support Mint index arguments.
1229-
body += LoadLocal(parsed_function_->RawParameterVariable(1)); // Index.
1230+
body += LoadLocal(arg_offset);
12301231
body += CheckNullOptimized(TokenPosition::kNoSource,
12311232
String::ZoneHandle(Z, function.name()));
12321233
body += UnboxTruncate(kUnboxedFfiIntPtr);
1233-
body += IntConstant(native_rep.SizeInBytes());
1234-
body += UnboxTruncate(kUnboxedIntPtr);
1235-
// TODO(38831): Implement Shift for Uint32, and use that instead.
1236-
body +=
1237-
BinaryIntegerOp(Token::kMUL, kUnboxedFfiIntPtr, /* truncate= */ true);
12381234
body +=
12391235
BinaryIntegerOp(Token::kADD, kUnboxedFfiIntPtr, /* truncate= */ true);
12401236
body += ConvertIntptrToUntagged();
@@ -1309,7 +1305,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
13091305
ASSERT(ffi_type_arg_cid == type_arg.type_class_id());
13101306

13111307
LocalVariable* arg_pointer = parsed_function_->RawParameterVariable(0);
1312-
LocalVariable* arg_index = parsed_function_->RawParameterVariable(1);
1308+
LocalVariable* arg_offset = parsed_function_->RawParameterVariable(1);
13131309
LocalVariable* arg_value = parsed_function_->RawParameterVariable(2);
13141310

13151311
if (kind == MethodRecognizer::kFfiStorePointer) {
@@ -1356,17 +1352,10 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
13561352
String::ZoneHandle(Z, function.name()));
13571353
body += LoadNativeField(Slot::Pointer_c_memory_address());
13581354
body += UnboxTruncate(kUnboxedFfiIntPtr);
1359-
// We do Pointer.address + index * sizeOf<T> manually because LoadIndexed
1360-
// does not support Mint index arguments.
1361-
body += LoadLocal(arg_index); // Index.
1355+
body += LoadLocal(arg_offset); // Offset.
13621356
body += CheckNullOptimized(TokenPosition::kNoSource,
13631357
String::ZoneHandle(Z, function.name()));
13641358
body += UnboxTruncate(kUnboxedFfiIntPtr);
1365-
body += IntConstant(native_rep.SizeInBytes());
1366-
body += UnboxTruncate(kUnboxedFfiIntPtr);
1367-
// TODO(38831): Implement Shift for Uint32, and use that instead.
1368-
body +=
1369-
BinaryIntegerOp(Token::kMUL, kUnboxedFfiIntPtr, /* truncate= */ true);
13701359
body +=
13711360
BinaryIntegerOp(Token::kADD, kUnboxedFfiIntPtr, /* truncate= */ true);
13721361
body += ConvertIntptrToUntagged();

0 commit comments

Comments
 (0)