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

 
 
> 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
 
Start new topic
Ответов
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
scifi
сообщение Apr 25 2014, 04:45
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


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

Группа: Свой
Сообщений: 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
Сообщение #7


Гуру
******

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



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

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



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 07:10
Рейтинг@Mail.ru


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