Некоторый фон:
Как личный проект, я разрабатывал ядро на с ++. Все идет хорошо, на самом деле у меня очень хорошая поддержка большей части c ++, доступного в стране ядра (я реализовал почти все libc и libstdc ++).
Одной из наиболее сложных и специфичных для компилятора вещей является RTTI и поддержка исключений. Пока я полностью отключаю исключения, но RTTI - это то, чего я хочу, поскольку такие вещи, как dynamic_cast
, могут быть очень полезны. Чтобы это работало, у меня есть базовая реализация std :: type_info, которая соответствует ожиданиям g ++, а затем я связываюсь с g ++ s libsupc++.a
и libgcc_eh.a
. Это прекрасно работает. RTTI работает как чемпион!
Вопрос:
Я играл с некоторыми вариантами оптимизации и хотел бы когда-нибудь иметь -mregparm в качестве выбора времени компиляции. Очевидно, что это ядро и необходимость взаимодействовать с ассемблерным кодом, есть определенные функции, которые не очень хороши из-за отсутствия параметров в стеке. Чтобы решить эту проблему, я использую следующий макрос:
#define asmlinkage attribute((regparm(0)))
Еще раз, это работает очень хорошо. Проблема в том, что когда вы делаете dynamic_cast
. Компиляция генерирует вызовы некоторых неявно определенных внутренних функций (определенных в библиотеках поддержки, упомянутых ранее) и делает это с соблюдением флага -mregparm. Конечно, поскольку я связывался с вспомогательными библиотеками системы, они могут иметь или не иметь (в моем случае нет) совместимое соглашение о вызовах ... что приводит к приятной панике ядра. Поскольку эти функции являются неявными (нет прототипов ни в одном из моих файлов) и имеют длинные искаженные имена, добавить (почти) невозможно добавить к ним мой атрибут asmlinkage.
На ум приходит 3 возможных решения.
- забудьте о поддержке
-mregparm все вместе.
- перекомпилируйте эти 2 библиотеки поддержки с
те же флаги, что и ядро. это
может быть раздражающим и слегка
непрактично (я не знаю, если они
может быть чисто изолирован от GCC
обновления сборки и набора инструментов могли
быть очень болезненным), но должно работать.
- как-то заставить компилятор игнорировать
-mregparm при вызове кода, найденного в конкретном файле .a / .o.
Возможен ли вариант 3? У меня нет ощущения интуиции, но я подумал, что задам этот вопрос, поскольку здесь есть несколько гуру g ++: -).