Mercurial > hg > CbC > CbC_llvm
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()) { |