GCC и реентерабельный код - PullRequest
0 голосов
/ 13 июня 2010

Генерирует ли GCC реентерабельный код для всех сценариев?

Ответы [ 5 ]

4 голосов
/ 13 июня 2010

нет, вы должны написать реентерабельный код.

2 голосов
/ 13 июня 2010

Reentrancy - это то, что ISO C и C ++ способны проектировать, так что включает в себя GCC.Вы по-прежнему несете ответственность за кодирование функции для повторного входа.

Компилятор переменного тока, который не генерирует код для повторного входа, даже когда функция закодирована правильно для повторного входа, будет скорее исключением, чем правилом, и будет по причинам архитектурного ограничения (например, из-за недостатка ресурсов для поддержки стека,поэтому генерируем статические кадры).В этих ситуациях документация компилятора должна прояснить это.

Некоторые статьи, которые вы могли бы прочитать:

1 голос
/ 13 июня 2010

GCC генерирует реентерабельный код по крайней мере на большинстве платформ, для которых он компилируется (особенно если вы избегаете передачи или возврата структур по значению), но вполне возможно, что конкретный язык или платформа ABI могут диктовать иное.Вам нужно быть более конкретным, чтобы сделать более убедительное заявление;Я знаю, что он, безусловно, в основном возвращается на процессоры настольных компьютеров, если компилируемый код сам по себе в основном реентерабелен (странные трюки с глобальным состоянием могут, конечно, привести к проблемам на любой платформе).

1 голос
/ 13 июня 2010

Повторный вход - это не то, что компилятор может контролировать, а программист должен писать повторно входящий код.Для этого вам нужно избегать всех очевидных ловушек, например, глобальных (включая локальные статические переменные), общих ресурсов, потоков, вызовов других не реентерабельных функций и т. П.для небольших встроенных систем, например, 8051, может не генерироваться повторно вводимый код по умолчанию, и вам может потребоваться запросить повторно вводимый код для определенных функций, например, через #pragma.

0 голосов
/ 13 июня 2010

Нет, GCC не может гарантировать повторный ввод кода, который вы пишете.

Однако на основных платформах код, созданный компилятором или включенный в него, такой как встроенные математические функции или вызовы функций, является повторным.Поскольку GCC не поддерживает платформы, на которых распространены нереентеративные вызовы функций, такие как 8051, существует небольшой риск возникновения проблем компилятора с повторным входом.

Есть порты GCC, которые имеют ошибки и проблемы, такие каккак версия MSP430.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...