Вот пара расширений gcc, которые использует ядро Linux:
- встроенная сборка
- встроенные gcc, такие как __builtin_expect, __buildin_constant, __buildin_return_address
- атрибуты функции для указания, например, какие регистры использовать (например, __attribute __ ((regparm (0)), __ attribute __ ((упаковано, выровнено (PAGE_SIZE)))))
- определенный код в зависимости от предопределенных макросов gcc (например, обходные пути для определенных ошибок gcc в определенных версиях)
- диапазоны в корпусах переключателей (случай 8 ... 15:)
Вот еще несколько: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/
Многие из этих особенностей gcc сильно зависят от архитектуры или стали возможными из-за того, как реализован gcc, и, вероятно, не имеют смысла указываться стандартом Си. Другие являются просто удобными расширениями C. Поскольку ядро Linux построено так, чтобы полагаться на эти расширения, другие компиляторы должны предоставлять те же расширения, что и gcc, чтобы иметь возможность собирать ядро.
Это не значит, что Linux должен был полагаться на эти функции gcc, например ядро NetBSD очень мало зависит от gcc.