Skip to content

Commit cba6c8c

Browse files
dcharkescommit-bot@chromium.org
authored andcommitted
[vm/ffi] Fix high memory addresses on 32 bit
Issue: #38789 Change-Id: I3227b77c4953dac6aa8b42326539f565eb28ea84 Cq-Include-Trybots: luci.dart.try:vm-ffi-android-debug-arm-try,vm-ffi-android-debug-arm64-try,app-kernel-linux-debug-x64-try,vm-kernel-linux-debug-ia32-try,vm-dartkb-linux-debug-simarm64-try,vm-kernel-win-debug-x64-try,vm-kernel-win-debug-ia32-try,vm-dartkb-linux-debug-x64-try,vm-kernel-precomp-linux-debug-x64-try,vm-dartkb-linux-release-x64-abi-try,vm-kernel-precomp-android-release-arm64-try,vm-kernel-asan-linux-release-x64-try,vm-kernel-linux-release-simarm-try,vm-kernel-linux-release-simarm64-try,vm-kernel-mac-debug-simdbc64-try,vm-kernel-precomp-android-release-arm_x64-try,vm-kernel-reload-mac-release-simdbc64-try,vm-kernel-precomp-obfuscate-linux-release-x64-try,vm-kernel-reload-rollback-linux-debug-x64-try,vm-kernel-precomp-mac-release-simarm_x64-try,dart-sdk-linux-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121125 Reviewed-by: Martin Kustermann <[email protected]> Commit-Queue: Daco Harkes <[email protected]>
1 parent b97fc2e commit cba6c8c

File tree

5 files changed

+37
-12
lines changed

5 files changed

+37
-12
lines changed

runtime/vm/compiler/backend/il.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7992,8 +7992,10 @@ class IntConverterInstr : public TemplateDefinition<1, NoThrow, Pure> {
79927992
from == kUnboxedInt32 || from == kUntagged);
79937993
ASSERT(to == kUnboxedInt64 || to == kUnboxedUint32 || to == kUnboxedInt32 ||
79947994
to == kUntagged);
7995-
ASSERT(from != kUntagged || to == kUnboxedIntPtr);
7996-
ASSERT(to != kUntagged || from == kUnboxedIntPtr);
7995+
ASSERT(from != kUntagged ||
7996+
(to == kUnboxedIntPtr || to == kUnboxedFfiIntPtr));
7997+
ASSERT(to != kUntagged ||
7998+
(from == kUnboxedIntPtr || from == kUnboxedFfiIntPtr));
79977999
SetInputAt(0, value);
79988000
}
79998001

runtime/vm/compiler/backend/il_arm.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6864,8 +6864,10 @@ LocationSummary* IntConverterInstr::MakeLocationSummary(Zone* zone,
68646864
LocationSummary* summary = new (zone)
68656865
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
68666866
if (from() == kUntagged || to() == kUntagged) {
6867-
ASSERT((from() == kUntagged && to() == kUnboxedIntPtr) ||
6868-
(from() == kUnboxedIntPtr && to() == kUntagged));
6867+
ASSERT((from() == kUntagged && to() == kUnboxedInt32) ||
6868+
(from() == kUntagged && to() == kUnboxedUint32) ||
6869+
(from() == kUnboxedInt32 && to() == kUntagged) ||
6870+
(from() == kUnboxedUint32 && to() == kUntagged));
68696871
ASSERT(!CanDeoptimize());
68706872
summary->set_in(0, Location::RequiresRegister());
68716873
summary->set_out(0, Location::SameAsFirstInput());

runtime/vm/compiler/backend/il_ia32.cc

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ void NativeReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
198198
__ popl(EBX);
199199

200200
#if defined(TARGET_OS_FUCHSIA)
201-
UNREACHABLE(); // Fuchsia does not allow dart:ffi.
201+
UNREACHABLE(); // Fuchsia does not allow dart:ffi.
202202
#elif defined(USING_SHADOW_CALL_STACK)
203203
#error Unimplemented
204204
#endif
@@ -1037,7 +1037,7 @@ void NativeEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
10371037
__ pushl(EAX);
10381038

10391039
#if defined(TARGET_OS_FUCHSIA)
1040-
UNREACHABLE(); // Fuchsia does not allow dart:ffi.
1040+
UNREACHABLE(); // Fuchsia does not allow dart:ffi.
10411041
#elif defined(USING_SHADOW_CALL_STACK)
10421042
#error Unimplemented
10431043
#endif
@@ -6123,8 +6123,10 @@ LocationSummary* IntConverterInstr::MakeLocationSummary(Zone* zone,
61236123
LocationSummary(zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
61246124

61256125
if (from() == kUntagged || to() == kUntagged) {
6126-
ASSERT((from() == kUntagged && to() == kUnboxedIntPtr) ||
6127-
(from() == kUnboxedIntPtr && to() == kUntagged));
6126+
ASSERT((from() == kUntagged && to() == kUnboxedInt32) ||
6127+
(from() == kUntagged && to() == kUnboxedUint32) ||
6128+
(from() == kUnboxedInt32 && to() == kUntagged) ||
6129+
(from() == kUnboxedUint32 && to() == kUntagged));
61286130
ASSERT(!CanDeoptimize());
61296131
summary->set_in(0, Location::RequiresRegister());
61306132
summary->set_out(0, Location::SameAsFirstInput());
@@ -6153,8 +6155,10 @@ LocationSummary* IntConverterInstr::MakeLocationSummary(Zone* zone,
61536155

61546156
void IntConverterInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
61556157
const bool is_nop_conversion =
6156-
(from() == kUntagged && to() == kUnboxedIntPtr) ||
6157-
(from() == kUnboxedIntPtr && to() == kUntagged);
6158+
(from() == kUntagged && to() == kUnboxedInt32) ||
6159+
(from() == kUntagged && to() == kUnboxedUint32) ||
6160+
(from() == kUnboxedInt32 && to() == kUntagged) ||
6161+
(from() == kUnboxedUint32 && to() == kUntagged);
61586162
if (is_nop_conversion) {
61596163
ASSERT(locs()->in(0).reg() == locs()->out(0).reg());
61606164
return;

runtime/vm/compiler/frontend/kernel_to_il.cc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
10771077
body += CheckNullOptimized(TokenPosition::kNoSource,
10781078
String::ZoneHandle(Z, function.name()));
10791079
body += LoadNativeField(Slot::Pointer_c_memory_address());
1080-
body += UnboxTruncate(kUnboxedIntPtr); // Truncating, so signed is ok.
1080+
body += UnboxTruncate(kUnboxedFfiIntPtr);
10811081
body += ConvertIntptrToUntagged(); // Requires signed intptr.
10821082
body += IntConstant(0); // Index.
10831083
body += LoadIndexedTypedData(typed_data_cid);
@@ -1196,7 +1196,7 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
11961196
body += CheckNullOptimized(TokenPosition::kNoSource,
11971197
String::ZoneHandle(Z, function.name()));
11981198
body += LoadNativeField(Slot::Pointer_c_memory_address());
1199-
body += UnboxTruncate(kUnboxedIntPtr); // Truncating, so signed is ok.
1199+
body += UnboxTruncate(kUnboxedFfiIntPtr);
12001200
body += ConvertIntptrToUntagged(); // Requires signed intptr.
12011201
body += IntConstant(0); // Index.
12021202
body += LoadLocal(arg_value); // Value.
@@ -1231,6 +1231,8 @@ FlowGraph* FlowGraphBuilder::BuildGraphOfRecognizedMethod(
12311231
body += LoadLocal(parsed_function_->RawParameterVariable(0)); // Address.
12321232
body += CheckNullOptimized(TokenPosition::kNoSource,
12331233
String::ZoneHandle(Z, function.name()));
1234+
// Truncate to 32 bits on 32 bit architecture.
1235+
body += UnboxTruncate(kUnboxedFfiIntPtr);
12341236
body += StoreInstanceField(TokenPosition::kNoSource,
12351237
Slot::Pointer_c_memory_address());
12361238
} break;

tests/ffi/data_test.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ void main() {
5252
testSizeOfNativeFunction();
5353
testSizeOfNativeType();
5454
testDynamicInvocation();
55+
testMemoryAddressTruncation();
5556
}
5657

5758
void testPointerBasic() {
@@ -506,3 +507,17 @@ void testDynamicInvocation() {
506507
final Pointer<Int16> p2 = p.cast<Int16>();
507508
free(p);
508509
}
510+
511+
void testMemoryAddressTruncation() {
512+
const int kIgnoreBytesPositive = 0x1122334400000000;
513+
const int kIgnoreBytesNegative = 0xffddccbb00000000;
514+
if (sizeOf<IntPtr>() == 4) {
515+
final p1 = Pointer<Int8>.fromAddress(123);
516+
final p2 = Pointer<Int8>.fromAddress(123 + kIgnoreBytesPositive);
517+
final p3 = Pointer<Int8>.fromAddress(123 + kIgnoreBytesNegative);
518+
Expect.equals(p1.address, p2.address);
519+
Expect.equals(p1, p2);
520+
Expect.equals(p1.address, p3.address);
521+
Expect.equals(p1, p3);
522+
}
523+
}

0 commit comments

Comments
 (0)