diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2009-09-18 16:46:16 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2009-09-18 16:46:16 +0000 |
commit | 7de3bd273ec3f4f027089285106095e8700e226d (patch) | |
tree | f94236f028a888fdad82d4823e8629717e38110e /lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp | |
parent | e2394e9bfecb6532ea0f8171c4fb6039e11843b6 (diff) |
Stop using alloca.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82225 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp')
-rw-r--r-- | lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp index c931081ff6..8c45a36b56 100644 --- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @@ -33,10 +33,6 @@ #include <map> #include <cmath> #include <cstring> -// Some platforms may need malloc.h for alloca. -#ifdef HAVE_MALLOC_H -#include <malloc.h> -#endif #ifdef HAVE_FFI_CALL #ifdef HAVE_FFI_H @@ -207,9 +203,10 @@ static bool ffiInvoke(RawFunc Fn, Function *F, ArgBytes += TD->getTypeStoreSize(ArgTy); } - uint8_t *ArgData = (uint8_t*) alloca(ArgBytes); - uint8_t *ArgDataPtr = ArgData; - std::vector<void*> values(NumArgs); + SmallVector<uint8_t, 128> ArgData; + ArgData.resize(ArgBytes); + uint8_t *ArgDataPtr = ArgData.data(); + SmallVector<void*, 16> values(NumArgs); for (Function::const_arg_iterator A = F->arg_begin(), E = F->arg_end(); A != E; ++A) { const unsigned ArgNo = A->getArgNo(); @@ -222,22 +219,22 @@ static bool ffiInvoke(RawFunc Fn, Function *F, ffi_type *rtype = ffiTypeFor(RetTy); if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NumArgs, rtype, &args[0]) == FFI_OK) { - void *ret = NULL; + SmallVector<uint8_t, 128> ret; if (RetTy->getTypeID() != Type::VoidTyID) - ret = alloca(TD->getTypeStoreSize(RetTy)); - ffi_call(&cif, Fn, ret, &values[0]); + ret.resize(TD->getTypeStoreSize(RetTy)); + ffi_call(&cif, Fn, ret.data(), values.data()); switch (RetTy->getTypeID()) { case Type::IntegerTyID: switch (cast<IntegerType>(RetTy)->getBitWidth()) { - case 8: Result.IntVal = APInt(8 , *(int8_t *) ret); break; - case 16: Result.IntVal = APInt(16, *(int16_t*) ret); break; - case 32: Result.IntVal = APInt(32, *(int32_t*) ret); break; - case 64: Result.IntVal = APInt(64, *(int64_t*) ret); break; + case 8: Result.IntVal = APInt(8 , *(int8_t *) ret.data()); break; + case 16: Result.IntVal = APInt(16, *(int16_t*) ret.data()); break; + case 32: Result.IntVal = APInt(32, *(int32_t*) ret.data()); break; + case 64: Result.IntVal = APInt(64, *(int64_t*) ret.data()); break; } break; - case Type::FloatTyID: Result.FloatVal = *(float *) ret; break; - case Type::DoubleTyID: Result.DoubleVal = *(double*) ret; break; - case Type::PointerTyID: Result.PointerVal = *(void **) ret; break; + case Type::FloatTyID: Result.FloatVal = *(float *) ret.data(); break; + case Type::DoubleTyID: Result.DoubleVal = *(double*) ret.data(); break; + case Type::PointerTyID: Result.PointerVal = *(void **) ret.data(); break; default: break; } return true; |