10
votes

Alignement de la fonction C dans GCC

J'essaie d'octet-aligner une fonction de 16 octets à l'aide de l'attribut 'aligné (16)'. J'ai fait ce qui suit: void __attribute __ ((aligné (16))) fonction () {}

(source: http://gcc.gnu.org/onlineCs/gccc /Function-attributes.html )

mais quand je compile (gcc foo.c; aucun script de fabrication de maquillage ou de liaison utilisé), je reçois l'erreur suivante:

FOO.c: 99: Erreur: l'alignement peut ne pas être spécifié pour 'Fonction'

J'ai essayé d'aligner jusqu'à 4,8,32, etc., mais l'erreur reste la même. J'en ai besoin pour aligner une routine de service d'interruption pour un processeur basé sur PowerPC. Quelle est la bonne façon de le faire?


3 commentaires

L'OP a expliqué exactement pourquoi ils doivent le faire, dans la deuxième phrase.


Une autre utilisation délicieusement pervers pour les fonctions d'alignement consiste à stocker des données supplémentaires dans les bits faibles de variables de pointeur de fonction ...


@R .., mal. Tout comme conservant dans l'octet élevé des adresses 32 bits sur les processeurs 680ec30 ou 68 000. Très mal en effet.


3 Réponses :


10
votes

Pourquoi ne laissez-vous pas simplement passer les -falign-fonctions = 16 à GCC lors de la compilation?


3 commentaires

Oui, je peux faire cela, mais cela alignerait toutes les fonctions à 16Bytes, alors que je n'ai besoin que de l'ISR pour obtenir 16 octets alignés. Mais, s'il n'y a pas d'autre option, je devrai faire la même chose.


Si vous n'utilisez pas GCC> = 4.3, c'est la voie à suivre.


@Sukanto, faites-le puis placez la fonction dans un fichier C séparé.



2
votes

Vous utilisez probablement une ancienne version de GCC qui ne prend pas en charge cet attribut. Le lien de documentation que vous avez fourni est destiné au "développement actuel" de GCC. En examinant les différentes sorties, l'attribut n'apparaît que dans la documentation de GCC 4.3 et au-delà.


1 commentaires

Je suppose que c'est possible. Mon compilateur est GCC 4.0.0.



10
votes

S'adapter de ma réponse sur cette question GCC A >, vous pouvez essayer d'utiliser des directives #pragma forts>, comme: xxx pré>

#pragma push_options code> et POP_OPTIONS CODE > Les macros sont utilisés pour contrôler la portée de l'effet code> optimiser code> pragma. Plus de détails sur ces macros peuvent être trouvés dans GCC DOCS . P>


p>

alternativez, si vous préférez GCC'S Syntaxe d'attribut strong>, vous devriez pouvoir faire quelque chose comme: p>

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


0 commentaires