comparison llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @ 152:e8a9b4f4d755

pull from 146
author anatofuz
date Wed, 11 Mar 2020 18:29:16 +0900
parents 1d019706d866
children dd44ba33042e
comparison
equal deleted inserted replaced
151:dbda48fb9435 152:e8a9b4f4d755
71 static Interpreter *TheInterpreter; 71 static Interpreter *TheInterpreter;
72 72
73 static char getTypeID(Type *Ty) { 73 static char getTypeID(Type *Ty) {
74 switch (Ty->getTypeID()) { 74 switch (Ty->getTypeID()) {
75 case Type::VoidTyID: return 'V'; 75 case Type::VoidTyID: return 'V';
76 #ifndef noCbC
77 case Type::__CodeTyID: return 'V';
78 #endif
76 case Type::IntegerTyID: 79 case Type::IntegerTyID:
77 switch (cast<IntegerType>(Ty)->getBitWidth()) { 80 switch (cast<IntegerType>(Ty)->getBitWidth()) {
78 case 1: return 'o'; 81 case 1: return 'o';
79 case 8: return 'B'; 82 case 8: return 'B';
80 case 16: return 'S'; 83 case 16: return 'S';
121 124
122 #ifdef USE_LIBFFI 125 #ifdef USE_LIBFFI
123 static ffi_type *ffiTypeFor(Type *Ty) { 126 static ffi_type *ffiTypeFor(Type *Ty) {
124 switch (Ty->getTypeID()) { 127 switch (Ty->getTypeID()) {
125 case Type::VoidTyID: return &ffi_type_void; 128 case Type::VoidTyID: return &ffi_type_void;
129 #ifndef noCbC
130 case Type::__CodeTyID: return &ffi_type_void;
131 #endif
126 case Type::IntegerTyID: 132 case Type::IntegerTyID:
127 switch (cast<IntegerType>(Ty)->getBitWidth()) { 133 switch (cast<IntegerType>(Ty)->getBitWidth()) {
128 case 8: return &ffi_type_sint8; 134 case 8: return &ffi_type_sint8;
129 case 16: return &ffi_type_sint16; 135 case 16: return &ffi_type_sint16;
130 case 32: return &ffi_type_sint32; 136 case 32: return &ffi_type_sint32;
228 ffi_type *rtype = ffiTypeFor(RetTy); 234 ffi_type *rtype = ffiTypeFor(RetTy);
229 235
230 if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NumArgs, rtype, args.data()) == 236 if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NumArgs, rtype, args.data()) ==
231 FFI_OK) { 237 FFI_OK) {
232 SmallVector<uint8_t, 128> ret; 238 SmallVector<uint8_t, 128> ret;
239 #ifndef noCbC
240 if (RetTy->getTypeID() != Type::VoidTyID && RetTy->getTypeID() != Type::__CodeTyID)
241 #else
233 if (RetTy->getTypeID() != Type::VoidTyID) 242 if (RetTy->getTypeID() != Type::VoidTyID)
243 #endif
234 ret.resize(TD.getTypeStoreSize(RetTy)); 244 ret.resize(TD.getTypeStoreSize(RetTy));
235 ffi_call(&cif, Fn, ret.data(), values.data()); 245 ffi_call(&cif, Fn, ret.data(), values.data());
236 switch (RetTy->getTypeID()) { 246 switch (RetTy->getTypeID()) {
237 case Type::IntegerTyID: 247 case Type::IntegerTyID:
238 switch (cast<IntegerType>(RetTy)->getBitWidth()) { 248 switch (cast<IntegerType>(RetTy)->getBitWidth()) {