| // 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/recognized_method.h" |
| |
| #include "vm/symbols.h" |
| |
| namespace dart { |
| |
| namespace compiler { |
| |
| namespace ffi { |
| |
| classid_t ElementTypedDataCid(classid_t class_id) { |
| switch (class_id) { |
| case kFfiInt8Cid: |
| return kTypedDataInt8ArrayCid; |
| case kFfiUint8Cid: |
| return kTypedDataUint8ArrayCid; |
| case kFfiInt16Cid: |
| return kTypedDataInt16ArrayCid; |
| case kFfiUint16Cid: |
| return kTypedDataUint16ArrayCid; |
| case kFfiInt32Cid: |
| return kTypedDataInt32ArrayCid; |
| case kFfiUint32Cid: |
| return kTypedDataUint32ArrayCid; |
| case kFfiInt64Cid: |
| return kTypedDataInt64ArrayCid; |
| case kFfiUint64Cid: |
| return kTypedDataUint64ArrayCid; |
| case kPointerCid: |
| return target::kWordSize == 4 ? kTypedDataUint32ArrayCid |
| : kTypedDataUint64ArrayCid; |
| case kFfiFloatCid: |
| return kTypedDataFloat32ArrayCid; |
| case kFfiDoubleCid: |
| return kTypedDataFloat64ArrayCid; |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| classid_t ElementExternalTypedDataCid(classid_t class_id) { |
| switch (class_id) { |
| case kFfiInt8Cid: |
| return kExternalTypedDataInt8ArrayCid; |
| case kFfiUint8Cid: |
| return kExternalTypedDataUint8ArrayCid; |
| case kFfiInt16Cid: |
| return kExternalTypedDataInt16ArrayCid; |
| case kFfiUint16Cid: |
| return kExternalTypedDataUint16ArrayCid; |
| case kFfiInt32Cid: |
| return kExternalTypedDataInt32ArrayCid; |
| case kFfiUint32Cid: |
| return kExternalTypedDataUint32ArrayCid; |
| case kFfiInt64Cid: |
| return kExternalTypedDataInt64ArrayCid; |
| case kFfiUint64Cid: |
| return kExternalTypedDataUint64ArrayCid; |
| case kFfiFloatCid: |
| return kExternalTypedDataFloat32ArrayCid; |
| case kFfiDoubleCid: |
| return kExternalTypedDataFloat64ArrayCid; |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| classid_t RecognizedMethodTypeArgCid(MethodRecognizer::Kind kind) { |
| switch (kind) { |
| #define LOAD_STORE(type) \ |
| case MethodRecognizer::kFfiLoad##type: \ |
| case MethodRecognizer::kFfiStore##type: \ |
| return kFfi##type##Cid; |
| CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(LOAD_STORE) |
| #undef LOAD_STORE |
| case MethodRecognizer::kFfiLoadFloatUnaligned: |
| case MethodRecognizer::kFfiStoreFloatUnaligned: |
| return kFfiFloatCid; |
| case MethodRecognizer::kFfiLoadDoubleUnaligned: |
| case MethodRecognizer::kFfiStoreDoubleUnaligned: |
| return kFfiDoubleCid; |
| case MethodRecognizer::kFfiLoadPointer: |
| case MethodRecognizer::kFfiStorePointer: |
| return kPointerCid; |
| #define AS_EXTERNAL_TYPED_DATA(type) \ |
| case MethodRecognizer::kFfiAsExternalTypedData##type: \ |
| return kFfi##type##Cid; |
| CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(AS_EXTERNAL_TYPED_DATA) |
| #undef AS_EXTERNAL_TYPED_DATA |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| AlignmentType RecognizedMethodAlignment(MethodRecognizer::Kind kind) { |
| switch (kind) { |
| #define LOAD_STORE(type) \ |
| case MethodRecognizer::kFfiLoad##type: \ |
| case MethodRecognizer::kFfiStore##type: \ |
| return kAlignedAccess; |
| CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(LOAD_STORE) |
| LOAD_STORE(Pointer) |
| #undef LOAD_STORE |
| case MethodRecognizer::kFfiLoadFloatUnaligned: |
| case MethodRecognizer::kFfiStoreFloatUnaligned: |
| case MethodRecognizer::kFfiLoadDoubleUnaligned: |
| case MethodRecognizer::kFfiStoreDoubleUnaligned: |
| return kUnalignedAccess; |
| default: |
| UNREACHABLE(); |
| } |
| } |
| |
| MethodRecognizer::Kind FfiLoad(const NativeType& native_type) { |
| if (native_type.IsPrimitive()) { |
| switch (native_type.AsPrimitive().representation()) { |
| #define CASE(type) \ |
| case k##type: \ |
| return MethodRecognizer::kFfiLoad##type; |
| CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE) |
| #undef CASE |
| default: |
| break; |
| } |
| } |
| UNIMPLEMENTED(); |
| } |
| |
| MethodRecognizer::Kind FfiStore(const NativeType& native_type) { |
| if (native_type.IsPrimitive()) { |
| switch (native_type.AsPrimitive().representation()) { |
| #define CASE(type) \ |
| case k##type: \ |
| return MethodRecognizer::kFfiStore##type; |
| CLASS_LIST_FFI_NUMERIC_FIXED_SIZE(CASE) |
| #undef CASE |
| default: |
| break; |
| } |
| } |
| UNIMPLEMENTED(); |
| } |
| |
| } // namespace ffi |
| |
| } // namespace compiler |
| |
| } // namespace dart |