> Данной оптимизация отключена, поскольку обратная опция находится в зависимостях других
> опций вроде C++ исключений. Без которых GCC не может сгенерировать рабочий
> код.По поводу "других" в документации сказано: Omit the frame pointer in functions that don't need one.
make V=1 показывает, что fomit-frame-pointer передаётся компилятору.
Пример навскидку.
void cyc2ns_read_begin(struct cyc2ns_data *data)
{
int seq, idx; preempt_disable_notrace();
do {
seq = this_cpu_read(cyc2ns.seq.sequence);
idx = seq & 1;
data->cyc2ns_offset = this_cpu_read(cyc2ns.data[idx].cyc2ns_offset);
data->cyc2ns_mul = this_cpu_read(cyc2ns.data[idx].cyc2ns_mul);
data->cyc2ns_shift = this_cpu_read(cyc2ns.data[idx].cyc2ns_shift);
} while (unlikely(seq != this_cpu_read(cyc2ns.seq.sequence)));
}
void cyc2ns_read_end(void)
{
preempt_enable_notrace();
}
Прошу прощения, если кому непривычен формат,
отсутствие фреймов видно:
.text:0000000000000228 cyc2ns_read_begin proc near
.text:0000000000000228 inc gs:__preempt_count
.text:000000000000022F mov rsi, offset cyc2ns
.text:0000000000000236 loc_236:
.text:0000000000000236 mov edx, dword ptr gs:cyc2ns+20h
.text:000000000000023D mov eax, edx
.text:000000000000023F and eax, 1
.text:0000000000000242 shl rax, 4
.text:0000000000000246 add rax, rsi
.text:0000000000000249 mov rcx, gs:[rax+8]
.text:000000000000024E mov [rdi+8], rcx
.text:0000000000000252 mov ecx, gs:[rax]
.text:0000000000000255 mov [rdi], ecx
.text:0000000000000257 mov eax, gs:[rax+4]
.text:000000000000025B mov [rdi+4], eax
.text:000000000000025E mov eax, dword ptr gs:cyc2ns+20h
.text:0000000000000265 cmp edx, eax
.text:0000000000000267 jnz short loc_236
.text:0000000000000269 retn
.text:0000000000000269 cyc2ns_read_begin endp
.text:000000000000026A cyc2ns_read_end proc near
.text:000000000000026A dec gs:__preempt_count
.text:0000000000000271 jnz short locret_278
.text:0000000000000273 call ___preempt_schedule_notrace
.text:0000000000000278 locret_278:
.text:0000000000000278 retn
.text:0000000000000278 cyc2ns_read_end endp
.text:0000000000000278
Можно предположить, что собирали там с опцией CONFIG_FRAME_POINTER.
grep -C2 frame-pointer Makefile HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 \
-fomit-frame-pointer -std=gnu89 $(HOST_LFS_CFLAGS)
--
ifdef CONFIG_FRAME_POINTER
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
else
# Some targets (ARM with Thumb2, for example), can't be built with frame
# pointers. For those, we don't have FUNCTION_TRACER automatically
# select FRAME_POINTER. However, FUNCTION_TRACER adds -pg, and this is
# incompatible with -fomit-frame-pointer with current GCC, so we don't use
# -fomit-frame-pointer with FUNCTION_TRACER.
ifndef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS += -fomit-frame-pointer
endif
endif
В таком случае, возникает вопрос: влияет ли она на эффект от inline?