реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Disable inline
jcxz
сообщение Apr 24 2014, 10:10
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Уважаемые, подскажите - как сказать IAR-у чтобы он не inline-ил функцию?
А то что-то на вскидку не нашёл в доке на компилятор....
Можно конечно поставить __root, но сиё не очень правильно, ибо будет включать код функции даже когда она не используется, а этого не хотелось-бы.

Чтобы не было лишних вопросов, поясню "зачем":
Имеется некая функция в которой в начале кратковременно нужно использовать большой объём стека (под временный большой массив).
Далее этот массив не используется никак. И после этого из этой функции вызывается много других с глубоким уровнем вложенности (большим расходом стека на вызовы).
А если описать этот массив как простой локальный, то выделенный под него объём стека далее висит мёртвым грузом.
IAR это дело почему-то не оптимизирует, хотя мог-бы сделать ADD SP, #... Хотя включена максимальная оптимизация.

Выхожу из этого выделяя область функции, где идёт использование временного массива, в отдельную функцию. Но если не применять __root, то, при
максимальной оптимизации, компилятор инлайнит её и включает её фрейм стека во фрейм стека вызывающей функции и получаем исходное положение
с потерянным неиспользуемым объёмом стека.
Или может кто знает лучшее решение такой проблемы чем inline-функция?
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 24 2014, 10:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вынести функцию в отдельный файл, компилировать этот файл отдельно, чтобы у компилятора не было возможности заинлайнить. Линкер у яра не инлайнит, ЕМНИП.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 24 2014, 11:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Да, тоже в принципе вариант, хотя не очень красивый - таких мест в проге может быть много и плодить из-за этого кучу файлов....
Тем более - что та часть кода, которая выносится в отдельную функцию, работает с кучей static объектов, локальных в данном файле и не хочется
это всё делать видимым во всём проекте или создавать отдельные ещё дополнительные хидеры описывающие эти static-объекты и видимые только
в исходном файле и в дополнительном файле.

Хотя это конечно вариант.

PS: И вообще - что это за недоработка в IAR-е - не срезать неиспользуемый фрейм стека обычным ADD SP, #..., а тянуть его по всей функции?
Ведь при вызовах функций с передачей аргументов через стек он нормально это делает - создаёт доп. фрейм, а после возврата - удаляет его...
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 24 2014, 11:15
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(jcxz @ Apr 24 2014, 15:09) *
PS: И вообще - что это за недоработка в IAR-е - не срезать неиспользуемый фрейм стека обычным ADD SP, #..., а тянуть его по всей функции?


а если написать так и компилировать в c89 ?
Код
void func( void )
{

{
использовать большой стек
}

тут должен вернутся


}


ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 24 2014, 11:56
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



#pragma inline = never


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Apr 25 2014, 03:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(SSerge @ Apr 24 2014, 17:56) *
#pragma inline = never

О! Спасибо! Это работает.
Интересно - а почему в даташите на IAR нету этой прагмы? wacko.gif

Цитата(megajohn @ Apr 24 2014, 17:15) *
ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }

Хм... Учту это на будущее.
Но к сожалению
во-первых: у нас проект уже большой и собирается под IAR5.50, где нет C89.
и во-вторых: написан он под C++, а при такой компиляции даже IAR6.50 не даёт включить C89.
crying.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 25 2014, 04:45
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(megajohn @ Apr 24 2014, 15:15) *
ведь в C89 выделение на стеке переменных начинается по { и высвобождается по }

Где это написано? ИМХО, просто выдумка.
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 25 2014, 05:13
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(scifi @ Apr 25 2014, 08:45) *
Где это написано? ИМХО, просто выдумка.


угу, ведь если массив вне области видимости то его не должно быть за скобками и SP должон вернутся на своё место

лень в дизасм лезти


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 25 2014, 05:27
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(megajohn @ Apr 25 2014, 09:13) *
лень в дизасм лезти

Дизасм - это особенности конкретного компилятора в конкретном режиме работы. А вы написали "C89", то есть ссылаетесь на стандарт языка Си. Вот я и попросил выдержку из текста стандарта.
На самом деле очевидно, что это была фантазия. В стандарте ничего такого не написано. Там даже ни разу не применяется слово "стек". Не вводите людей в заблуждение.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 25 2014, 06:03
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(megajohn @ Apr 25 2014, 08:13) *
и SP должон вернутся на своё место
Не должОн. Вы же хотите, чтобы даже кривовато написанная программа была быстрой и маленькой. Оптимизатор имеет право объединить все эти теребления SP и в целях экономии времени выполнения и памяти кода один раз зарезервировать память и один раз освободить. А в промежутках использовать память от уже не нужных переменных под новые не трогая SP.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
megajohn
сообщение Apr 25 2014, 06:24
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Сергей Борщ @ Apr 25 2014, 10:03) *
Вы же хотите, чтобы даже кривовато написанная программа была быстрой и маленькой.
...
использовать память от уже не нужных переменных под новые не трогая SP.


чтобы она была быстрой и маленькой, все возможные операции производятся на регистрах, а если не хватает - то уже на стеке.
После работы, с большим блоком на стеке, нужно восстановить регистры, а восстанавливать без смещения SP - это чревато нарушением собсвенно самого стека



--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 25 2014, 06:35
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(megajohn @ Apr 25 2014, 09:24) *
нужно восстановить регистры, а восстанавливать без смещения SP - это чревато нарушением собсвенно самого стека
Не надо считать компилятор тупее, чем он есть на самом деле. Разумеется, он все это учтет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 02:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016