From 78254b65124d40642c7f6f4e4f437dcd4b0b9d78 Mon Sep 17 00:00:00 2001 From: Josh Klontz Date: Fri, 25 Jan 2013 23:59:07 -0500 Subject: [PATCH] substantial LLVM progress --- sdk/jitcv/jitcv.h | 18 +++++++++++------- sdk/plugins/llvm.cpp | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 65 insertions(+), 17 deletions(-) diff --git a/sdk/jitcv/jitcv.h b/sdk/jitcv/jitcv.h index 06c2ee2..30ea08d 100644 --- a/sdk/jitcv/jitcv.h +++ b/sdk/jitcv/jitcv.h @@ -3,9 +3,7 @@ #include #include - -namespace jitcv -{ +#include /*! * \brief jitcv matrix @@ -83,16 +81,22 @@ struct Matrix inline uint32_t bytes() const { return bits() / 8 * elements(); } }; +#ifdef __cplusplus +extern "C" { +#endif + typedef void (*UnaryFunction)(const Matrix *src, Matrix *dst); typedef void (*BinaryFunction)(const Matrix *srcA, const Matrix *srcB, Matrix *dst); -UnaryFunction makeUnaryFunction(const char *description); -BinaryFunction makeBinaryFunction(const char *description); +BR_EXPORT UnaryFunction makeUnaryFunction(const char *description); +BR_EXPORT BinaryFunction makeBinaryFunction(const char *description); typedef void (*UnaryKernel)(const Matrix *src, Matrix *dst, uint32_t size); typedef void (*BinaryKernel)(const Matrix *srcA, const Matrix *srcB, Matrix *dst, uint32_t size); -UnaryKernel makeUnaryKernel(const char *description, const Matrix *src); -BinaryKernel makeBinaryKernel(const char *description, const Matrix *srcA, const Matrix *srcB); +BR_EXPORT UnaryKernel makeUnaryKernel(const char *description, const Matrix *src); +BR_EXPORT BinaryKernel makeBinaryKernel(const char *description, const Matrix *srcA, const Matrix *srcB); +#ifdef __cplusplus } +#endif #endif // __JITCV_H diff --git a/sdk/plugins/llvm.cpp b/sdk/plugins/llvm.cpp index 8a8fb47..047c7d2 100644 --- a/sdk/plugins/llvm.cpp +++ b/sdk/plugins/llvm.cpp @@ -25,7 +25,6 @@ using namespace br; using namespace cv; -using namespace jitcv; using namespace llvm; static Module *TheModule = NULL; @@ -33,6 +32,8 @@ static ExecutionEngine *TheExecutionEngine = NULL; static FunctionPassManager *TheFunctionPassManager = NULL; static FunctionPassManager *TheExtraFunctionPassManager = NULL; static StructType *TheMatrixStruct = NULL; +static Function *makeUnaryKernelFunction = NULL; +static Function *makeBinaryKernelFunction = NULL; static QString MatrixToString(const Matrix &m) { @@ -326,12 +327,21 @@ namespace br class UnaryTransform : public UntrainableMetaTransform { Q_OBJECT - + uint32_t fileIndex; UnaryKernel kernel; - quint16 hash; + uint16_t hash; public: - UnaryTransform() : kernel(NULL), hash(0) {} + static QHash fileTable; + + UnaryTransform() : fileIndex(0), kernel(NULL), hash(0) {} + + void init() + { + fileIndex = fileTable.size()+1; + fileTable.insert(fileIndex, file); + } + virtual int preallocate(const Matrix &src, Matrix &dst) const = 0; /*!< Preallocate destintation matrix based on source matrix. */ virtual Value *buildPreallocate(const MatrixBuilder &src, const MatrixBuilder &dst) const { (void) src; (void) dst; return MatrixBuilder::constant(0); } virtual void build(const MatrixBuilder &src, const MatrixBuilder &dst, PHINode *i) const = 0; /*!< Build the kernel. */ @@ -375,9 +385,6 @@ private: Function *compile(const Matrix &m) const { - Function *kernel = compileKernel(m); - optimize(kernel); - Constant *c = TheModule->getOrInsertFunction(qPrintable(mangledName()), Type::getVoidTy(getGlobalContext()), PointerType::getUnqual(TheMatrixStruct), @@ -419,7 +426,10 @@ private: builder.CreateCondBr(hashTest, getKernel, preallocate); builder.SetInsertPoint(getKernel); - builder.CreateStore(kernel, kernelFunction); + builder.CreateStore(builder.CreateCall2(makeUnaryKernelFunction, + builder.CreateIntToPtr(MatrixBuilder::constant(fileIndex, 32), Type::getInt8PtrTy(getGlobalContext())), + src), + kernelFunction); builder.CreateStore(mb.hash(), kernelHash); builder.CreateBr(preallocate); builder.SetInsertPoint(preallocate); @@ -486,6 +496,8 @@ private: } }; +QHash UnaryTransform::fileTable; + /*! * \brief LLVM Binary Kernel * \author Josh Klontz \cite jklontz @@ -1017,6 +1029,34 @@ class LLVMInitializer : public Initializer Type::getInt16Ty(getGlobalContext()), // hash NULL); + std::vector unaryKernelParams; + unaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + unaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + unaryKernelParams.push_back(Type::getInt32Ty(getGlobalContext())); + Type *unaryKernelReturn = Type::getVoidTy(getGlobalContext()); + Type *unaryKernelType = PointerType::getUnqual(FunctionType::get(unaryKernelReturn, unaryKernelParams, false)); + std::vector makeUnaryKernelParams; + makeUnaryKernelParams.push_back(Type::getInt8PtrTy(getGlobalContext())); + makeUnaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + FunctionType* makeUnaryKernelType = FunctionType::get(unaryKernelType, makeUnaryKernelParams, false); + makeUnaryKernelFunction = Function::Create(makeUnaryKernelType, GlobalValue::ExternalLinkage, "makeUnaryKernel", TheModule); + makeUnaryKernelFunction->setCallingConv(CallingConv::C); + + std::vector binaryKernelParams; + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + binaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + binaryKernelParams.push_back(Type::getInt32Ty(getGlobalContext())); + Type *binaryKernelReturn = Type::getVoidTy(getGlobalContext()); + Type *binaryKernelType = PointerType::getUnqual(FunctionType::get(binaryKernelReturn, binaryKernelParams, false)); + std::vector makeBinaryKernelParams; + makeBinaryKernelParams.push_back(Type::getInt8PtrTy(getGlobalContext())); + makeBinaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + makeBinaryKernelParams.push_back(PointerType::getUnqual(TheMatrixStruct)); + FunctionType* makeBinaryKernelType = FunctionType::get(binaryKernelType, makeBinaryKernelParams, false); + makeBinaryKernelFunction = Function::Create(makeBinaryKernelType, GlobalValue::ExternalLinkage, "makeBinaryKernel", TheModule); + makeBinaryKernelFunction->setCallingConv(CallingConv::C); + QSharedPointer kernel(Transform::make("add(1)", NULL)); Template src, dst; @@ -1082,7 +1122,8 @@ BR_REGISTER(Initializer, LLVMInitializer) UnaryFunction makeUnaryFunction(const char *description) { - QScopedPointer unaryTransform(Factory::make(description)); + QScopedPointer unaryTransform(dynamic_cast(Transform::make(description, NULL))); + if (unaryTransform == NULL) qFatal("makeUnaryFunction NULL transform!"); return unaryTransform->getFunction(NULL); } @@ -1094,7 +1135,10 @@ BinaryFunction makeBinaryFunction(const char *description) UnaryKernel makeUnaryKernel(const char *description, const Matrix *src) { - QScopedPointer unaryTransform(Factory::make(description)); + if (description == NULL) qFatal("makeUnaryKernel NULL description!"); + const File f = long(description) < 1000 ? UnaryTransform::fileTable[long(description)] : File(description); + QScopedPointer unaryTransform(dynamic_cast(Transform::make(f, NULL))); + if (unaryTransform == NULL) qFatal("makeUnaryKernel NULL transform!"); return unaryTransform->getKernel(src); } -- libgit2 0.21.4