Qt,GCC,SSE和堆栈对齐

Fab*_*ien 8 qt gcc sse

我正在尝试使用GCC编译程序并使用Qt和SSE内在函数.似乎当我的一个函数被Qt调用时,堆栈对齐不会被保留.这是一个简短的例子来说明我的意思:

#include <cstdio>
#include <emmintrin.h>
#include <QtGui/QApplication.h>
#include <QtGui/QWidget.h>


class Widget: public QWidget {
public:
    void paintEvent(QPaintEvent *) {
        __m128 a;
        printf("a: 0x%08x\n", ((void *) &a));
    }
};


int main(int argc, char** argv)
{
    QApplication application(argc, argv);
    Widget w;
    w.paintEvent(NULL); // Called from here, my function behaves correctly
    w.show();
    w.update();
    // Qt will call Widget::paintEvent and my __m128 will not be
    // aligned on 16 bytes as it should
    application.processEvents();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

a: 0x0023ff40 // OK, that's aligned on 16 bytes
a: 0x0023d14c // Not aligned!
Run Code Online (Sandbox Code Playgroud)

组态:

  • 英特尔酷睿2
  • WinXP,SP3
  • GCC 4.4(Mingw包含在Qt SDK 2010.01中)

我尝试使用与我在Qt makefile中看到的相同的选项编译示例程序:

-O2 -Wall -frtti -fexceptions -mthreads
Run Code Online (Sandbox Code Playgroud)

,链接选项:

-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads
Run Code Online (Sandbox Code Playgroud)

现在我不知道在哪个方向搜索.任何提示将不胜感激.谢谢!

法比恩

小智 9

您可以使用该选项-mstackrealign执行此操作,而无需向源代码添加属性:

-mstackrealign 在入口处重新对齐堆栈.在Intel x86上,-mstackrealign选项将生成备用序言和结尾,以便在必要时重新调整运行时堆栈.这支持将保留4字节对齐堆栈的传统代码与现代代码混合,后者保持16字节堆栈以实现SSE兼容性.另请参见适用于各个函数的属性force_align_arg_pointer.

(来自海湾合作委员会文件)


Fab*_*ien 5

__attribute__((force_align_arg_pointer)) void paintEvent(QPaintEvent *);
Run Code Online (Sandbox Code Playgroud)

让它工作!有人有更好的解决方案吗?