Можно ли сказать Clang, какие регистры использовать для определенных частей кода без использования сборки - PullRequest
0 голосов
/ 07 февраля 2019

Я работаю над проектом, который требует, чтобы он работал как в Linux, так и в Windows.
Однако есть части кода, которые не работают в Linux из-за различных регистров в clang и msvc.

Есть ли способ сделать последовательное использование регистра или запросить clang использование определенного регистра во время операции?Я хотел бы найти решение, которое не включает переписывание частей в сборке.Вот то, о чем я говорю, как отличающийся выходной код.

https://godbolt.org/z/DO9pQN

Любая помощь приветствуется.

РЕДАКТИРОВАТЬ за комментарии:
Это для эмулятора, поэтому определенные регистры используются для определенных задач.Одним из основных является то, что мы используем RSI для определенной переменной, а затем Clang использует RSI в вызовах функций.Скомпилированный MSVC не страдает от той же проблемы.

РЕДАКТИРОВАТЬ 2 за комментарии:
Это для эмулятора xbox 360, Ксения.
В настоящее время мы пытаемся завершить работу над Linux.Однако мы сталкиваемся с проблемами clang, использующими те же регистры для вызовов функций, что и для хранения чего-то, называемого контекстом.
Наша идея состояла в том, чтобы просто попросить clang не использовать этот конкретный регистр, но я не смог найтиспособ сделать это, не просто написав это в сборке.Другая проблема с этим решением состоит в том, что gcc может также иметь ту же проблему в другом регистре.В частности, мы смотрим на PPC-тесты.Приведенная выше ссылка представляет собой вывод из clang по сравнению с msvc.

Вот соответствующий код:

1 Ответ

0 голосов
/ 07 февраля 2019

rsi не может использоваться для ваших собственных целей в Linux, потому что он используется в соглашении о вызовах функций psABI-x86_64

Но если вы можете использовать другой регистр как r10 код, скомпилированный с Gcc и параметром -ffixed-r10, не будет использовать r10 ( demo ).

...