Frage

Ich versuche, ein Programm mit GCC und mit Qt und SSE-Spezifika zusammengestellt zu machen. Es scheint, dass, wenn einer meiner Funktionen von Qt genannt wird, der Stapel Ausrichtung nicht beibehalten wird. Hier ist ein kleines Beispiel zu veranschaulichen, was ich meine:

#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;
}

Hier ist der Ausgang:

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

Konfiguration:

  • Intel Core2
  • WinXP SP3
  • GCC 4.4 (Mingw enthalten im Qt SDK 2010.01)

Ich habe versucht, das Beispielprogramm mit den gleichen Optionen wie die, die ich sehe in der Qt-Make-Datei zu kompilieren:

-O2 -Wall -frtti -fexceptions -mthreads

, Link Optionen:

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

Jetzt weiß ich nicht, in welche Richtung zu suchen. Für Hinweise wäre sehr hilfreich. Dank!

Fabien

War es hilfreich?

Lösung

Sie können die Option -mstackrealign verwenden, das zu tun, ohne Attribute zu Ihrem Quellcode hinzufügen:

-mstackrealign Richten Sie den Stapel auf Eintrag. Auf dem Intel x86, wird die -mstackrealign Option einen alternativen Prolog und Epilog erzeugen, die die Laufzeitstapel bei Bedarf neu ausrichtet. Dies unterstützt Legacy-Codes, der einen Misch 4-Byte-ausgerichteten Stapel mit modernen Codes halten, die einen 16-Byte-Stack für SSE Kompatibilität halten. Siehe auch das Attribut force_align_arg_pointer, anwendbar auf einzelne Funktionen.

(von der GCC-docs )

Andere Tipps

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

hat es funktioniert! Hat jemand eine bessere Lösung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top