У меня есть программа, которая работает только при компиляции с определенной версией gcc и с использованием некоторой оптимизации (-O1
или выше, но не -O0
).Найти точные gcc неявные параметры
Эта программа неверна в смысле C, но, тем не менее, мне нужно понять, почему она не работает с -O0. Он слишком велик, чтобы его вручную проверяли, сравнивая сгенерированные коды сборки, поэтому я хотел бы, чтобы GCC сообщил мне точные флаги, которые соответствуют выполнению, скажем, -O1, но без использования самого -O1. Идея состоит в том, что, удаляя каждую оптимизацию по одному, я смогу лучше понять проблему.
Я пошел в свой specific gcc's optimization options page и попробовал добавить все опции -f
, которые, согласно документу, включены -O1, но этого было недостаточно (программа по-прежнему ведет себя как -O0).
Есть ли способ получить какую-то нормализованную командную строку на основе «нижнего уровня» опций -f*
, которые соответствуют тому, что GCC делает внутренне?
Обратите внимание, что эта проблема звучит, как будто в вашем коде есть неопределенное поведение. Можете попробовать -fsanitize = undefined и посмотреть, всплывает ли что-нибудь. – rubenvb
НЕТ, нет способа получить эквивалент -O1 со списком флагов -f. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html «Не все оптимизации контролируются непосредственно флагом». «Большинство оптимизаций разрешены только в том случае, если в командной строке задан уровень -O. В противном случае они отключены, даже если указаны отдельные флаги оптимизации». Вы можете отключить несколько оптимизаций с помощью '-O1 -fno- *', может быть, некоторого '-fdisable- *', но я до сих пор не верю, что это вам очень поможет. –
@ rubenvb Я согласен полностью, это неправильная программа, но в любом случае она касается всех видов неприятных сборок и аппаратных взаимодействий, поэтому я не могу этого исправить. Тем не менее, это поведение, связанное с «-O», должно быть понято каким-то образом, поэтому, я думаю, мне придется исправить gcc, чтобы получить дополнительную информацию. – anol