Как сделать так, чтобы g ++ игнорировал -mregparm для определенного кода? - PullRequest
1 голос
/ 27 марта 2009

Некоторый фон:

Как личный проект, я разрабатывал ядро ​​на с ++. Все идет хорошо, на самом деле у меня очень хорошая поддержка большей части 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 возможных решения.

  1. забудьте о поддержке -mregparm все вместе.
  2. перекомпилируйте эти 2 библиотеки поддержки с те же флаги, что и ядро. это может быть раздражающим и слегка непрактично (я не знаю, если они может быть чисто изолирован от GCC обновления сборки и набора инструментов могли быть очень болезненным), но должно работать.
  3. как-то заставить компилятор игнорировать -mregparm при вызове кода, найденного в конкретном файле .a / .o.

Возможен ли вариант 3? У меня нет ощущения интуиции, но я подумал, что задам этот вопрос, поскольку здесь есть несколько гуру g ++: -).

1 Ответ

1 голос
/ 27 марта 2009

Вероятно, вам лучше всего использовать варианты 1 или 2 (1 явно проще). Насколько мне известно, g ++ не имеет конкретного переключателя для варианта 3.

...