Перейти к содержанию
    

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, jcxz said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, а уже потом в объектник, а уже потом в файл исполнения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Arlleex said:

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

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

все что есть

 

iar.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

все что есть

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

@Arlleex

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...