diff options
author | Simon Hausmann <simon.hausmann@qt.io> | 2017-02-01 13:49:37 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2017-02-07 12:11:37 +0000 |
commit | ff46a4127bbe46d9887457d5740e52ffff4d43d4 (patch) | |
tree | d98a21e0288df8d91f177f7f34b554209b5cb4cf /src | |
parent | 9e926ddbf985f8d41747ae8a89ee3752a11011e4 (diff) |
Fix assembler cross-compilation on 32-bit hosts
The GOT register restoring logic needs to be done via TargetPLatform
members instead of plain #ifdefs.
Task-number: QTBUG-58569
Change-Id: If00d3f92558361ad5dcb20c3ff7eff78d31d75d3
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 2 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 5 | ||||
-rw-r--r-- | src/qml/jit/qv4binop.cpp | 2 | ||||
-rw-r--r-- | src/qml/jit/qv4isel_masm.cpp | 6 | ||||
-rw-r--r-- | src/qml/jit/qv4targetplatform_p.h | 27 | ||||
-rw-r--r-- | src/qml/jit/qv4unop.cpp | 2 |
6 files changed, 29 insertions, 15 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 646d9a8871..c6da60384e 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -709,7 +709,7 @@ JSC::MacroAssemblerCodeRef Assembler<TargetConfiguration>::link(int *codeSize) } template class QV4::JIT::Assembler<DefaultAssemblerTargetConfiguration>; -#if defined(V4_BOOTSTRAP) && CPU(X86_64) +#if defined(V4_BOOTSTRAP) template class QV4::JIT::Assembler<AssemblerTargetConfiguration<JSC::MacroAssemblerARMv7, NoOperatingSystemSpecialization>>; #endif diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index b2d7b13401..fd65c9b3d2 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -1372,9 +1372,8 @@ public: if (prepareCall(function)) loadArgumentOnStackOrRegister<0>(arg1); -#ifdef RESTORE_EBX_ON_CALL - load32(this->ebxAddressOnStack(), JSC::X86Registers::ebx); // restore the GOT ptr -#endif + if (JITTargetPlatform::gotRegister != -1) + load32(Address(JITTargetPlatform::FramePointerRegister, JITTargetPlatform::savedGOTRegisterSlotOnStack()), static_cast<RegisterID>(JITTargetPlatform::gotRegister)); // restore the GOT ptr callAbsolute(functionName, function); diff --git a/src/qml/jit/qv4binop.cpp b/src/qml/jit/qv4binop.cpp index 8468bf65a6..a09f3f8449 100644 --- a/src/qml/jit/qv4binop.cpp +++ b/src/qml/jit/qv4binop.cpp @@ -577,7 +577,7 @@ typename JITAssembler::Jump Binop<JITAssembler>::genInlineBinop(IR::Expr *leftSo } template struct QV4::JIT::Binop<QV4::JIT::Assembler<DefaultAssemblerTargetConfiguration>>; -#if defined(V4_BOOTSTRAP) && CPU(X86_64) +#if defined(V4_BOOTSTRAP) template struct QV4::JIT::Binop<QV4::JIT::Assembler<AssemblerTargetConfiguration<JSC::MacroAssemblerARMv7, NoOperatingSystemSpecialization>>>; #endif diff --git a/src/qml/jit/qv4isel_masm.cpp b/src/qml/jit/qv4isel_masm.cpp index 11e1c6c726..343062c1be 100644 --- a/src/qml/jit/qv4isel_masm.cpp +++ b/src/qml/jit/qv4isel_masm.cpp @@ -1344,12 +1344,10 @@ void InstructionSelection<JITAssembler>::calculateRegistersToSave(const Register fpRegistersToSave.clear(); for (const RegisterInfo &ri : JITTargetPlatform::getRegisterInfo()) { -#if defined(RESTORE_EBX_ON_CALL) - if (ri.isRegularRegister() && ri.reg<JSC::X86Registers::RegisterID>() == JSC::X86Registers::ebx) { + if (JITTargetPlatform::gotRegister != -1 && ri.isRegularRegister() && ri.reg<RegisterID>() == JITTargetPlatform::gotRegister) { regularRegistersToSave.append(ri); continue; } -#endif // RESTORE_EBX_ON_CALL if (ri.isCallerSaved()) continue; if (ri.isRegularRegister()) { @@ -1636,7 +1634,7 @@ QT_BEGIN_NAMESPACE namespace QV4 { namespace JIT { template class Q_QML_EXPORT InstructionSelection<>; template class Q_QML_EXPORT ISelFactory<>; -#if defined(V4_BOOTSTRAP) && CPU(X86_64) +#if defined(V4_BOOTSTRAP) Q_QML_EXPORT QV4::EvalISelFactory *createISelForArchitecture(const QString &architecture) { diff --git a/src/qml/jit/qv4targetplatform_p.h b/src/qml/jit/qv4targetplatform_p.h index 46a618d733..4fc9d83059 100644 --- a/src/qml/jit/qv4targetplatform_p.h +++ b/src/qml/jit/qv4targetplatform_p.h @@ -145,10 +145,8 @@ public: #if OS(WINDOWS) || OS(QNX) || \ ((OS(LINUX) || OS(FREEBSD)) && (defined(__PIC__) || defined(__PIE__))) -#define RESTORE_EBX_ON_CALL - using Address = PlatformAssembler::Address; - static Address ebxAddressOnStack() - { + static const int gotRegister = JSC::X86Registers::ebx; + static int savedGOTRegisterSlotOnStack() { static int ebxIdx = -1; if (ebxIdx == -1) { int calleeSaves = 0; @@ -164,8 +162,11 @@ public: Q_ASSERT(ebxIdx >= 0); ebxIdx += 1; } - return Address(FramePointerRegister, ebxIdx * -int(sizeof(void*))); + return ebxIdx * -int(sizeof(void*)); } +#else + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } #endif }; #endif // x86 @@ -238,6 +239,9 @@ public: static const int StackSpaceAllocatedUponFunctionEntry = RegisterSize; // Return address is pushed onto stack by the CPU. static void platformEnterStandardStackFrame(PlatformAssembler *as) { as->push(FramePointerRegister); } static void platformLeaveStandardStackFrame(PlatformAssembler *as) { as->pop(FramePointerRegister); } + + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } }; #endif // Linux/MacOS on x86_64 @@ -304,6 +308,9 @@ public: static const int StackSpaceAllocatedUponFunctionEntry = RegisterSize; // Return address is pushed onto stack by the CPU. static void platformEnterStandardStackFrame(PlatformAssembler *as) { as->push(FramePointerRegister); } static void platformLeaveStandardStackFrame(PlatformAssembler *as) { as->pop(FramePointerRegister); } + + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } }; #endif // Windows on x86_64 @@ -418,6 +425,9 @@ public: as->pop(FramePointerRegister); as->pop(JSC::ARMRegisters::lr); } + + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } }; #endif // ARM (32 bit) @@ -540,6 +550,9 @@ public: { as->popPair(FramePointerRegister, JSC::ARM64Registers::lr); } + + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } }; #endif // ARM64 @@ -625,6 +638,10 @@ public: as->pop(FramePointerRegister); as->pop(JSC::MIPSRegisters::ra); } + + + static const int gotRegister = -1; + static int savedGOTRegisterSlotOnStack() { return -1; } }; #endif // Linux on MIPS (32 bit) diff --git a/src/qml/jit/qv4unop.cpp b/src/qml/jit/qv4unop.cpp index 31355e5dce..6c19d20592 100644 --- a/src/qml/jit/qv4unop.cpp +++ b/src/qml/jit/qv4unop.cpp @@ -145,7 +145,7 @@ void Unop<JITAssembler>::generateCompl(IR::Expr *source, IR::Expr *target) } template struct QV4::JIT::Unop<QV4::JIT::Assembler<DefaultAssemblerTargetConfiguration>>; -#if defined(V4_BOOTSTRAP) && CPU(X86_64) +#if defined(V4_BOOTSTRAP) template struct QV4::JIT::Unop<QV4::JIT::Assembler<AssemblerTargetConfiguration<JSC::MacroAssemblerARMv7, NoOperatingSystemSpecialization>>>; #endif |