2009-12-16 18 views
6

Estoy intentando alinear en bytes una función con un límite de 16 bytes usando el atributo 'alineado (16)'. Hice lo siguiente: void __attribute__((aligned(16))) function() { }C Alineación de funciones en GCC

(Fuente: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)

Pero cuando compilo (foo.c gcc; no hay archivos make o scripts de enlazador utilizadas), me sale el siguiente error:

Foo.c : 99: error: la alineación no se puede especificar para 'función'

Intenté alinearme a 4,8,32, etc., pero el error sigue siendo el mismo. Necesito esto para alinear una rutina de servicio de interrupción para un procesador basado en powerpc. ¿Cuál es la forma correcta de hacerlo?

+0

¿Por qué quieres hacer esto? –

+10

El OP ha explicado exactamente por qué necesitan hacer esto, en la penúltima oración. – caf

+3

Otro uso deliciosamente malo para las funciones de alineación es el almacenamiento de datos adicionales en los bits bajos de las variables de puntero a la función ... –

Respuesta

8

¿Por qué no acaba de pasar el -falign-functions = 16 a gcc al compilar?

+2

Eso es muy fácil, ¿no? –

+3

Sí, puedo hacerlo, pero eso alinearía todas las funciones a 16 bytes, mientras que solo necesito el ISR para alinear 16 bytes. Pero, si no hay otra opción, tendré que hacer lo mismo. – Sukanto

+0

Si no está usando GCC> = 4.3, este es el camino a seguir. – Gonzalo

2

Probablemente esté utilizando una versión anterior de gcc que no sea compatible con ese atributo. El enlace de documentación que proporcionó es para el "desarrollo actual" de gcc. Al revisar las distintas versiones, el atributo solo aparece en la documentación de gcc 4.3 y posteriores.

+0

Supongo que es posible. Mi compilador es gcc 4.0.0. – Sukanto

7

La adaptación de mi respuesta en this GCC question, puede intentar utilizar directivas #pragma, así:

#pragma GCC push_options 
    #pragma GCC optimize ("align-functions=16") 

    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
     int i = 19; 
     for(; i > 0; i--) { 
      a[i] += 5; 
     } 
    } 

    #pragma GCC pop_options 

Los #pragma push_options y pop_options macros se utilizan para controlar el alcance del efecto de la optimize de Pragma. Se pueden encontrar más detalles sobre estas macros en el GCC docs.


Alternativamente, si lo prefiere de GCC attribute syntax, usted debería ser capaz de hacer algo como:

//add 5 to each element of the int array. 
    __attribute__((optimize("align-functions=16"))) 
    void add5(int a[20]) { 
     int i = 19; 
     for(; i > 0; i--) { 
      a[i] += 5; 
     } 
    } 
Cuestiones relacionadas