Summary: | potrace: ошибка сборки на не-x86 архитектурах | ||||||||
---|---|---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | Alexey Sheplyakov <asheplyakov> | ||||||
Component: | potrace | Assignee: | Yuri N. Sedunov <aris> | ||||||
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||||
Severity: | normal | ||||||||
Priority: | P5 | CC: | aris, asheplyakov, iv, sin | ||||||
Version: | unstable | ||||||||
Hardware: | all | ||||||||
OS: | Linux | ||||||||
Attachments: |
|
Description
Alexey Sheplyakov
2023-06-06 16:23:49 MSK
Вот тестовая программа, с помощью которой configure проверяет, можно ли использовать x86 ассемблер: int main() { int x; asm("bsf %1,%0\njnz 0f\nmovl $32,%0\n0:":"=r"(x):"r"(x)); return x; } Обычно при обработке директивы asm компилятор обрабатывает только ограничения на регистры (constraints) (ну и clobbers), а то, что в двойных кавычках, скармливает ассемблеру. Но данная программа содержит неопределённое поведение (undefined behavior), а именно чтение неинициализированной переменной x. Поэтому оптимизатор решает просто выбросить всю эту строчку. По-простому говоря - какая разница, какой именно мусор вернёт main, можно вернуть просто то, что изначально было в x. То есть преобразует этот тест в int main() { int x; return x; } Никаких инструкций, специфичных для x86, здесь не остаётся, так что тест успешно собирается на любой архитектуре, где осмыслены ограничения "=r", "r" (то есть чуть менее, чем везде). Сразу отвечу на вопрос -- "а как же пакет раньше собирался?". Крайний раз его пересобирали до того, как в добровольно-принудительном порядке внедрили LTO. Created attachment 13393 [details]
исправление проблемы
Created attachment 13394 [details]
таки исправление проблемы
(Ответ для Alexey Sheplyakov на комментарий #4) > Создано вложение 13394 [details] [подробности] > таки исправление проблемы Чтобы LTO не выпилил asm (даже вполне корректный), понадобилось пометить volatile и добавить "memory" clobber. |