Domanda

Sto cercando di fare un programma compilato con GCC e utilizzando intrinseche Qt e SSE. Sembra che quando una delle mie funzioni è chiamato da Qt, l'allineamento dello stack non viene mantenuto. Ecco un breve esempio per illustrare quello che voglio 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;
}

Ecco l'output:

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

Configurazione:

  • Intel Core2
  • WinXP, SP3
  • GCC 4.4 (Mingw incluso nel SDK Qt 2010.01)

ho provato a compilare il programma di esempio con le stesse opzioni come quelli che ho visto nel makefile Qt:

-O2 -Wall -frtti -fexceptions -mthreads

, opzioni di collegamento:

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

Ora non so in quali direzioni per la ricerca. Eventuali suggerimenti sarebbero apprezzati. Grazie!

Fabien

È stato utile?

Soluzione

È possibile utilizzare l'opzione -mstackrealign di farlo senza l'aggiunta di attributi al codice sorgente:

-mstackrealign Riallineare lo stack all'ingresso. Sul Intel x86, l'opzione -mstackrealign genererà un prologo e un epilogo alternativo che riallinea pila di esecuzione, se necessario. Questo supporta miscelazione codici legacy che mantengono uno stack allineato 4 byte con i codici moderni che mantengono uno stack di 16 byte per la compatibilità SSE. Vedere anche il force_align_arg_pointer attributo, applicabile alle singole funzioni.

( la documentazione GCC )

Altri suggerimenti

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

ha reso il lavoro! Qualcuno ha una soluzione migliore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top