Задать вопрос
Monnoroch
@Monnoroch

Есть ли portable аналог __attribute__((noinline))?

Собственно, нужно запретить инлайнинг функции: совместно с instruction reordering-ом вызывает краши. Для gcc есть специальный аттрибут, но не хотелось бы ограничивать себя gcc, хочется и студией собрать и клангом и интел компилером тоже. Возможен ли сабж?


Пока что решение такое:

#if defined(_MSC_VER)
#define NOINLINE __declspec(noinline)
#else
#define NOINLINE __attribute__ ((noinline))
#endif


Но я совсем не уверен, что это достаточно кроссплатформенно.
  • Вопрос задан
  • 3502 просмотра
Подписаться 3 Оценить 4 комментария
Пригласить эксперта
Ответы на вопрос 2
@mayorovp
По идее, данная вещь должна чиниться правильно расставленными барьерами…
Ответ написан
@gribozavr
У вас где-то в другом месте проблема, а это не решение, а просто уход от неё.

Портабельного аналога в стандарте нет. А Clang понимает __attribute__((noinline)).

Но если у вас там действительно всякие нестандартные атомики, то:

1. используйте стандартные атомики;

2. используйте ordered атомики;

3. используйте барьеры (или для процессора, или только для компилятора asm volatile("":::"memory"););

4. выясните, почему компилятор себе позволяет делать reordering вокруг ваших ассемблерных вставок или интринсиков. Баг компилятора?

А то потом придёт какой-нибудь link-time optimization и снова всё вам сломает.

И да, вы уверены что вы правильно написали свою критическую секцию? И зачем?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы