From 95aacf9fd1f210c575640bc3998a2095981a4b1a Mon Sep 17 00:00:00 2001 From: kobalicek Date: Mon, 28 Mar 2016 23:18:41 +0200 Subject: [PATCH] Moved addFunc() from X86Compiler to Compiler. Fixed CompilerContext not being reset after the first function is translated. --- src/asmjit/base/compiler.cpp | 15 +++++++ src/asmjit/base/compiler.h | 3 ++ src/asmjit/x86/x86assembler.h | 2 +- src/asmjit/x86/x86compiler.cpp | 14 +----- src/asmjit/x86/x86compiler.h | 2 + src/asmjit/x86/x86compilercontext.cpp | 1 - src/asmjit/x86/x86compilercontext_p.h | 2 +- src/test/asmjit_test_x86.cpp | 64 ++++++++++++++++++++++++++- 8 files changed, 87 insertions(+), 16 deletions(-) diff --git a/src/asmjit/base/compiler.cpp b/src/asmjit/base/compiler.cpp index 0d6cde6..f2c719f 100644 --- a/src/asmjit/base/compiler.cpp +++ b/src/asmjit/base/compiler.cpp @@ -165,6 +165,21 @@ HLHint* Compiler::newHintNode(Var& var, uint32_t hint, uint32_t value) noexcept // [asmjit::Compiler - Code-Stream] // ============================================================================ +HLNode* Compiler::addFunc(HLFunc* func) noexcept { + ASMJIT_ASSERT(_func == nullptr); + _func = func; + + addNode(func); // Add function node. + addNode(func->getEntryNode()); // Add function entry. + HLNode* cursor = getCursor(); + + addNode(func->getExitNode()); // Add function exit / epilog marker. + addNode(func->getEnd()); // Add function end. + setCursor(cursor); + + return func; +} + HLNode* Compiler::addNode(HLNode* node) noexcept { ASMJIT_ASSERT(node != nullptr); ASMJIT_ASSERT(node->_prev == nullptr); diff --git a/src/asmjit/base/compiler.h b/src/asmjit/base/compiler.h index cda16e8..fff50fd 100644 --- a/src/asmjit/base/compiler.h +++ b/src/asmjit/base/compiler.h @@ -291,6 +291,9 @@ struct ASMJIT_VIRTAPI Compiler : public ExternalTool { // [Code-Stream] // -------------------------------------------------------------------------- + //! Add a function `node` to the stream. + ASMJIT_API HLNode* addFunc(HLFunc* func) noexcept; + //! Add node `node` after current and set current to `node`. ASMJIT_API HLNode* addNode(HLNode* node) noexcept; //! Insert `node` before `ref`. diff --git a/src/asmjit/x86/x86assembler.h b/src/asmjit/x86/x86assembler.h index b7baed0..22ed6e7 100644 --- a/src/asmjit/x86/x86assembler.h +++ b/src/asmjit/x86/x86assembler.h @@ -3293,7 +3293,7 @@ struct ASMJIT_VIRTAPI X86Assembler : public Assembler { //! Packed DWORD unsigned maximum (SSE4.1). INST_2x(pmaxud, kX86InstIdPmaxud, X86XmmReg, X86XmmReg) //! \overload - INST_2x(pmaxud,kX86InstIdPmaxud , X86XmmReg, X86Mem) + INST_2x(pmaxud, kX86InstIdPmaxud, X86XmmReg, X86Mem) //! Packed WORD unsigned maximum (SSE4.1). INST_2x(pmaxuw, kX86InstIdPmaxuw, X86XmmReg, X86XmmReg) diff --git a/src/asmjit/x86/x86compiler.cpp b/src/asmjit/x86/x86compiler.cpp index 01b2507..95be184 100644 --- a/src/asmjit/x86/x86compiler.cpp +++ b/src/asmjit/x86/x86compiler.cpp @@ -292,6 +292,7 @@ Error X86Compiler::finalize() noexcept { error = context.serialize(assembler, start, node); context.cleanup(); + context.reset(false); if (error != kErrorOk) break; @@ -642,18 +643,7 @@ X86FuncNode* X86Compiler::addFunc(const FuncPrototype& p) noexcept { return nullptr; } - ASMJIT_ASSERT(_func == nullptr); - _func = func; - - addNode(func); // Add function node. - addNode(func->getEntryNode()); // Add function entry. - HLNode* cursor = getCursor(); - - addNode(func->getExitNode()); // Add function exit / epilog marker. - addNode(func->getEnd()); // Add function end. - setCursor(cursor); - - return func; + return static_cast(addFunc(func)); } HLSentinel* X86Compiler::endFunc() noexcept { diff --git a/src/asmjit/x86/x86compiler.h b/src/asmjit/x86/x86compiler.h index 41c5201..c2d33f6 100644 --- a/src/asmjit/x86/x86compiler.h +++ b/src/asmjit/x86/x86compiler.h @@ -856,6 +856,8 @@ struct ASMJIT_VIRTAPI X86Compiler : public Compiler { //! Create a new `X86FuncNode`. ASMJIT_API X86FuncNode* newFunc(const FuncPrototype& p) noexcept; + using Compiler::addFunc; + //! Add a new function. //! //! \param p Function prototype. diff --git a/src/asmjit/x86/x86compilercontext.cpp b/src/asmjit/x86/x86compilercontext.cpp index 3e4d89d..d7d435e 100644 --- a/src/asmjit/x86/x86compilercontext.cpp +++ b/src/asmjit/x86/x86compilercontext.cpp @@ -270,7 +270,6 @@ X86Context::X86Context(X86Compiler* compiler) : Context(compiler) { _state = &_x86State; reset(); } - X86Context::~X86Context() {} // ============================================================================ diff --git a/src/asmjit/x86/x86compilercontext_p.h b/src/asmjit/x86/x86compilercontext_p.h index 442d6bf..bf3c5e3 100644 --- a/src/asmjit/x86/x86compilercontext_p.h +++ b/src/asmjit/x86/x86compilercontext_p.h @@ -280,7 +280,7 @@ struct X86Context : public Context { // [Reset] // -------------------------------------------------------------------------- - virtual void reset(bool releaseMemory = false); + virtual void reset(bool releaseMemory = false) override; // -------------------------------------------------------------------------- // [Arch] diff --git a/src/test/asmjit_test_x86.cpp b/src/test/asmjit_test_x86.cpp index a355f7f..6630e94 100644 --- a/src/test/asmjit_test_x86.cpp +++ b/src/test/asmjit_test_x86.cpp @@ -2804,6 +2804,67 @@ struct X86Test_MiscMultiRet : public X86Test { } }; +// ============================================================================ +// [X86Test_MiscMultiFunc] +// ============================================================================ + +struct X86Test_MiscMultiFunc : public X86Test { + X86Test_MiscMultiFunc() : X86Test("[Misc] MultiFunc") {} + + static void add(PodVector& tests) { + tests.append(new X86Test_MiscMultiFunc()); + } + + virtual void compile(X86Compiler& c) { + X86FuncNode* f1 = c.newFunc(FuncBuilder2(kCallConvHost)); + X86FuncNode* f2 = c.newFunc(FuncBuilder2(kCallConvHost)); + + { + X86GpVar a = c.newInt32("a"); + X86GpVar b = c.newInt32("b"); + + c.addFunc(f1); + c.setArg(0, a); + c.setArg(1, b); + + X86CallNode* call = c.call(f2->getEntryLabel(), FuncBuilder2(kCallConvHost)); + call->setArg(0, a); + call->setArg(1, b); + call->setRet(0, a); + + c.ret(a); + c.endFunc(); + } + + { + X86GpVar a = c.newInt32("a"); + X86GpVar b = c.newInt32("b"); + + c.addFunc(f2); + c.setArg(0, a); + c.setArg(1, b); + + c.add(a, b); + c.ret(a); + c.endFunc(); + } + } + + virtual bool run(void* _func, StringBuilder& result, StringBuilder& expect) { + typedef int (*Func)(int, int); + + Func func = asmjit_cast(_func); + + int resultRet = func(56, 22); + int expectRet = 56 + 22; + + result.setFormat("ret=%d", resultRet); + expect.setFormat("ret=%d", expectRet); + + return result.eq(expect); + } +}; + // ============================================================================ // [X86Test_MiscUnfollow] // ============================================================================ @@ -2959,8 +3020,9 @@ X86TestSuite::X86TestSuite() : // Misc. ADD_TEST(X86Test_MiscConstPool); - ADD_TEST(X86Test_MiscUnfollow); ADD_TEST(X86Test_MiscMultiRet); + ADD_TEST(X86Test_MiscMultiFunc); + ADD_TEST(X86Test_MiscUnfollow); } X86TestSuite::~X86TestSuite() {