Jump to content
    

При максимальной оптимизации - ошибка

20 минут назад, const сказал:

Если я не ошибаюсь, в С++ глобальные переменные по умолчанию static, если не указано иного (extern напр.), может в этом дело.

Сильно сомневаюсь в этом.

Для теста только что создал в C++-проекте глобальную переменную qqq (нигде не используемую). Просто написал в main():

int qqq;

После компиляции вижу имя "qqq" в результирующем .obj-файле. 

Далее - для теста добавляю перед int слово static:

static int qqq;

более ничего не меняя. Результат - имя "qqq" пропало из результирующего .obj.

 

Вывод: Значит в первом случае "qqq" - глобальна (так как явно её имя имеется в таблице экспорта .obj-файла); а во втором - локальна.

PS: IAR ARM 7.80.4

Share this post


Link to post
Share on other sites

3 minutes ago, jcxz said:

Может такое быть? Да, может.

может, а lto может увидеть, что никто больше ничего в переменную glb из секции zero bss не пишет, ни в одной единице трансляции, и посчитать что там всегда 0.

Share this post


Link to post
Share on other sites

2 минуты назад, _pv сказал:

может, а lto может увидеть, что никто больше ничего в переменную glb из секции zero bss не пишет, ни в одной единице трансляции, и посчитать что там всегда 0.

Ну и пускай видит. Я же писал о том, что для корректного теста результата IAR другим компилятором, следует выключить LTO. Так как неизвестно - была ли включена LTO при компиляции примеров ТС из первого поста.

Share this post


Link to post
Share on other sites

4 minutes ago, jcxz said:

Ну и пускай видит. Я же писал о том, что для корректного теста результата IAR другим компилятором, следует выключить LTO. Так как неизвестно - была ли включена LTO при компиляции примеров ТС из первого поста.

а как это включаеся в ИАР. Понятия не имею, что такое LTO.

Share this post


Link to post
Share on other sites

15 минут назад, jcxz сказал:

Сильно сомневаюсь в этом.

Для теста только что создал в C++-проекте глобальную переменную qqq (нигде не используемую). Просто написал в main():

int qqq;

После компиляции вижу имя "qqq" в результирующем .obj-файле. 

Далее - для теста добавляю перед int слово static:

static int qqq;

более ничего не меняя. Результат - имя "qqq" пропало из результирующего .obj.

 

Вывод: Значит в первом случае "qqq" - глобальна (так как явно её имя имеется в таблице экспорта .obj-файла); а во втором - локальна.

PS: IAR ARM 7.80.4

ТС перепутал с const. Те да - по-умолчанию статические.

5 минут назад, const сказал:

а как это включаеся в ИАР. Понятия не имею, что такое LTO.

У вас это вроде, называется, multi-file compilation. Но не знаю, запускается ли там полноценная LTO, и вообще есть ли она в IAR, т.к. это "фишка" GCC/CLang, т.к. они транслируют код сначала в IR (внутреннее представление), а уже потом его в общую сборную солянку bitimage, а уже потом в объектник, а уже потом в файл исполнения.

Share this post


Link to post
Share on other sites

3 minutes ago, Arlleex said:

ТС перепутал с const. Те да - по-умолчанию статические.

У вас это вроде, называется, multi-file compilation. Но не знаю, запускается ли там полноценная LTO, и вообще есть ли она в IAR.

все что есть

 

iar.png

Share this post


Link to post
Share on other sites

3 минуты назад, const сказал:

все что есть

У меня IAR-а нету, но вот скрин из интернетов

Optimizations — BLE-Stack User's Guide for Bluetooth 4.2 3.01.01.00  documentation

Видимо, у Вас какая-то старая совсем версия или что-то подобное.

Share this post


Link to post
Share on other sites

@Arlleex

Есть такое, не обратил внимания.

С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам.

При дополнительном выборе "Discard Unused Publics" - не компилируется вообще - ошибка.

Share this post


Link to post
Share on other sites

Да перейдите на другую версию компилятора. На предыдущей странице вы уже убедительное доказательство косяка IAR привели, когда к регистрам volatile полезли🙂

13 минут назад, const сказал:

С "Multi-file Compilation" компилируется. Листинг тот же. Ничего не выкидывает даже когда забираю обращения к портам.

Значит в данном случае у IAR не такая агрессивная оптимизация. Что ж, бывает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...