C выравнивание функций в GCC - PullRequest
7 голосов
/ 16 декабря 2009

Я пытаюсь выровнять байты функции по 16-байтовой границе с помощью атрибута align (16). Я сделал следующее: void __attribute__((aligned(16))) function() { }

(Источник: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)

Но когда я компилирую (gcc foo.c; никакие make-файлы или сценарии компоновщика не используются), я получаю следующую ошибку:

FOO.c: 99: ошибка: выравнивание не может быть указано для «функции»

Я также попытался настроить на 4,8,32 и т. Д., Но ошибка осталась прежней. Мне нужно это для выравнивания подпрограммы обработки прерывания для процессора на базе PowerPC. Как правильно это сделать?

Ответы [ 3 ]

8 голосов
/ 16 декабря 2009

Почему бы вам просто не передать -falign-functions = 16 в gcc при компиляции?

7 голосов
/ 12 января 2013

Адаптируясь из моего ответа на этот вопрос GCC , вы можете попробовать использовать # прагматические директивы , например:

    #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

Макросы #pragma push_options и pop_options используются для управления областью действия прагмы optimize. Более подробную информацию об этих макросах можно найти в GCC документах .


В качестве альтернативы, если вы предпочитаете Синтаксис атрибута GCC , вы можете сделать что-то вроде:

    //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;
        }
    }
2 голосов
/ 16 декабря 2009

Возможно, вы используете более старую версию gcc, которая не поддерживает этот атрибут. Ссылка на документацию, которую вы предоставили, предназначена для «текущей разработки» gcc. При просмотре различных выпусков атрибут появляется только в документации для gcc 4.3 и выше.

...