-fomit-frame-pointer
Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save, set up and restore frame
pointers; it also makes an extra register available in many functions. It also makes debugging impossible on some machines.
Ага, ясно. Когда я смотрел в сторону Генты там был еще 4.6.3 по умолчанию. Звучить курьезно, (почти по-идиотски), но судя по lfs это самый безглючный компилер :)
Ну так есть же всякие подвиды, разные там ревизии, подрезанный или не подрезанный кеш, не говоря уже про версии микрокода на одном и том же процессоре...
ты правда думаешь что это всё знает и умеет компилятор!? о_О
да и что понимается под каждым march в мане расписано. возьмём core2 - из тех же SIMD поддерживаются все вплоть до ssse3. это то, что умеют все 2-ые корки, а у меня вот умеет ещё и sse4.1. поэтому уже получается -march=core2 -msse4.1. что тут сложного и не очевидного?
там где это возможно не пихает в стек адрес возврата из функции, а использует регистры, как то так извращается....
нет.
Вот такая функция
int foo(int x)
{
int y = x+1;
return y;
}
тут x, y лежат в стеке по соглашениям C/C++. Т.е. в памяти выделяется восемь байт, и на них указывает ebp. Компилятор оптимизирует это, занося всё в регистры. Получается одна команда, и фрейм не нужен. Ну и функция тоже очевидно не нужна, как и адрес возврата. Регистр ebx также не нужен.
Правильно было бы сказать не использует регистр (r)ebp для сохранения текущего кадра стека и адресации локальных переменных в вызываемой процедуре относительно последнего. Обходится одним (r)esp. Что на чистой х86 архитектуре делает раскрутку стекового кадра при отладке невозможной. Более подробно описано тут