Pregunta

Estoy intentando hacer un programa compilado con GCC y el uso de las características intrínsecas de Qt y SSE. Parece que cuando una de mis funciones es llamado por Qt, la alineación de las pilas no se conserva. He aquí un pequeño ejemplo para ilustrar lo que quiero decir:

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

Aquí está la salida:

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

Configuración:

  • Intel Core 2
  • WinXP, SP3
  • GCC 4.4 (Mingw incluido en el Qt SDK 2010,01)

He intentado compilar el programa de ejemplo, con las mismas opciones que los vi en el makefile Qt:

-O2 -Wall -frtti -fexceptions -mthreads

, opciones de enlace:

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

Ahora no sé en qué direcciones a búsqueda. Alguna pista sería apreciada. Gracias!

Fabien

¿Fue útil?

Solución

Puede utilizar la opción -mstackrealign de hacer eso sin añadir atributos a su código fuente:

-mstackrealign Realinear la pila en la entrada. En el Intel x86, la opción -mstackrealign generará un prólogo y un epílogo alternativo que vuelve a alinear la pila de ejecución si es necesario. Esta mezcla códigos heredados que mantienen una pila alineada de 4 bytes con los códigos modernos que mantienen una pila de 16 bytes para la compatibilidad con SSE soportes. Véase también el atributo force_align_arg_pointer, aplicable a las funciones individuales.

(de los docs CCG )

Otros consejos

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

hizo trabajar! ¿Alguien tiene una solución mejor?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top