Вопрос

Я пытаюсь сделать программу скомпилированной 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;
}

Вот вывод:

a: 0x0023ff40 // OK, that's aligned on 16 bytes
a: 0x0023d14c // Not aligned!

Конфигурация:

  • Intel Core2.
  • WinXP, SP3.
  • GCC 4.4 (Mingw включен в QT SDK 2010.01)

Я пытался собрать примерную программу с одинаковыми вариантами, что и те, которые я видел в Makefile Qt:

-O2 -Wall -frtti -fexceptions -mthreads

, Варианты ссылки:

-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads

Теперь я не знаю, в каких направлениях для поиска. Любые подсказки будут оценены. Спасибо!

Fabien

Это было полезно?

Решение

Вы можете использовать опцию -mstackrealign Для этого без добавления атрибутов на исходный код:

-МстакреализаторRealign Stack при входе. На Intel x86 вариант -mstackrealignign генерирует альтернативный пролог и эпилог, который при необходимости передает стек времени выполнения. Это поддерживает Mixing Legacy Codes, которые поддерживают 4-байт выровненный стек с современными кодами, которые поддерживают 16 байтовый стек для совместимости SSE. Смотрите также атрибут Force_align_Arg_Pointer, применимый к отдельным функциям.

(от Документы GCC)

Другие советы

__attribute__((force_align_arg_pointer)) void paintEvent(QPaintEvent *);

сделал это работать! У кого-нибудь есть лучшее решение?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top