> Вероятно, она объявлена не static и visibilty для DSO оставлен по-умолчанию, что
> заставляет GCC допускать возможность переопределения функции в другом DSO.Проверил гипотезу так:
объявил задействованные функции как static inline;
включил #include *.c с их определением в одну единицу трансляции, откуда происходит вызов;
добавил к -flto вот такое: -finline-limit=200000 --param inline-unit-growth=10000 -fwhole-program
Не инлайнит.
Clang инлайнит с -flto и без вышеуказанных манипуляций.
// сюда передаётся указатель на функцию, и отсюда осуществляется вызов.
/**
* \param painter изменяет цвет вершин, либо NULL для раскрашивания в базовый цвет
*/
static inline
void poly_draw(const struct polygon *p, struct vec4 coordinate,
fn_painter painter, struct color color, struct draw_ctx *restrict ctx);// вот на что передаётся указатель
static inline __attribute__((always_inline))
void colorer(struct vertex *restrict vert, struct color src, unsigned i)
{
if (!i) {
vert->color = src;
} else {
vert->color.r = src.r * (1.0f + fsin(vert->pos.x + omega_bk + i));
vert->color.g = src.g * (1.0f + fsin(vert->pos.y + omega_bk + i));
vert->color.b = src.b * (1.0f + fsin(vert->pos.x + vert->pos.y + omega_bk + i));
vert->color.a = src.a;
}
}
// вызывавется так:
poly_draw(&square108, (struct vec4){ x, y, 0, dot_cnt },
colorer, COLOR_BACKGROUND, ctx);
poly_draw() вызывается из нескольких мест мест с указателями на разные colorer-ы. Так что вроде-как есть причина, почему GCC считает, что инлайнить на надо. Но при этом Clang инлайнит единственный этот вызов poly_draw(), который по факту наиболее дорогой. В результате выигрывает по скорости вдвое. При этом с -O2 -flto размер исполняемого файла после strip у Clang 60720, у GCC - 69104 байт.
> Либо еще какие-то проблемы с опциями оптимизации.
Помимо вышеперечисленного добавил __attribute__((always_inline)) к poly_draw(). GCC заинлайнил (аналогично Clang-у -- только данный дорогой вызов). Стало быстрее на 20% по сравнению с прежним результатом GCC (60% от производительности Clang вместо прежних 50%), размер вырос до 77296. В общем, в данном случае для меня GCC не вариант.