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