Question

Je suis en train de faire un programme compilé avec GCC et en utilisant Qt et intrinsics SSE. Il semble que lorsque l'un de mes fonctions est appelée par Qt, l'alignement de la pile ne se conserve pas. Voici un court exemple pour illustrer ce que je veux dire:

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

Voici la sortie:

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

Configuration:

  • Intel Core2
  • Windows XP, le Service Pack 3
  • GCC 4.4 (Mingw inclus dans le Qt SDK 2010.01)

J'ai essayé de compiler le programme exemple avec les mêmes options que celles que je voyais dans le makefile Qt:

-O2 -Wall -frtti -fexceptions -mthreads

, les options de lien:

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

Maintenant, je ne sais pas dans quelles directions à la recherche. Tous les conseils seraient appréciés. Merci!

Fabien

Était-ce utile?

La solution

Vous pouvez utiliser l'option -mstackrealign de le faire sans l'ajout d'attributs à votre code source:

-mstackrealign Réaligner l'empilement à l'entrée. Sur le Intel x86, l'option -mstackrealign va générer un prologue et un épilogue alternatif qui réaligne la pile d'exécution si nécessaire. Ce mélange prend en charge les codes existants qui empêchent une pile alignée de 4 octets avec des codes modernes qui maintiennent une pile de 16 octets pour la compatibilité SSE. Voir aussi la force_align_arg_pointer d'attribut, applicable aux différentes fonctions.

(à partir de les documents CCG )

Autres conseils

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

fait le travail! Quelqu'un at-il une meilleure solution?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top