| // 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 |