LINUX.ORG.RU

Всё же не очень ясно, что нужно. Нужно чтоб на стеке была выделена какая-то область памяти или достаточно узнать текущее значение указателя стека?

Возможно подойдёт __builtin_frame_address или alloca

GPFault ★★
()

А если сделать вторую переменную, указывающую на эту, и её пометить как volatile? Или можно __attribute__((used)) этому указателю сделать.

xaizek ★★★★★
()
Ответ на: комментарий от cvv

Спрошу иначе. Поскольку на произвольной архитектуре нельзя гарантировать то что константа будет помещена в память минуя регистры, встаёт вопрос о том с какого до какого момента требуется наличие нужного значения переменной в стеке? Без такого уточнения вопрос получается не имеющим смысла.

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

void do_nothing_with(void*)
и вызывать
do_nothing_with(&a)
её перед тем как требуется гарантия наличия переменной на стеке. Если генерация машинного кода не будет отложена до момента линковки - компилятор не сможет узнать что функция ничего не делает.

GPFault ★★
()
Ответ на: комментарий от anonymous

В первую очередь из-за того что волатайл приводит к генерации жутко неэффективного или даже неправильного кода в критических секциях.

cvv ★★★★★
() автор топика
Ответ на: комментарий от GPFault

Я немного о другом. Если компилятор имеет свободный регистр то он под переменную вообще не выдяляет место на стэке. А мне нужно чтобы выделял всегда.

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

пиши на ассемблере тогда эти критические участки

Harald ★★★★★
()
Ответ на: комментарий от GPFault

do_nothing_with(&a)

или asm volatile(":::memory")

anonymous
()
Ответ на: комментарий от cvv

А ты внимательно прочитал man longjmp на предмет ограничений связанных с локальными переменными?

anonymous
()
Ответ на: комментарий от anonymous

А еще изучил использование longjump во всех опенсорсных приложениях :-)

cvv ★★★★★
() автор топика
Ответ на: комментарий от cvv

В первую очередь из-за того что волатайл приводит к генерации жутко неэффективного или даже неправильного кода в критических секциях.

А как компилятор будет узнавать, когда именно нужно выгружать значение из регистра в память и когда его надо снова туда загружать?

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

А как компилятор будет узнавать, когда именно нужно выгружать значение из регистра в память и когда его надо снова туда загружать?

Перед longjump сделать что-то, при виде чего компилятор поймет, что все оптимизиции с кешированием переменных в регистрах нужно прекратить на время. Для этого подойдет вызов функции, которую компилятор не сможет зайинлайнить и в результате понять, что внутри делается (как результат, там может быть что угодно, поэтому закешированные данные нужно записать), вызов ассемблерной вставки с указанием, что она использует память, и тогда компилятор все закешированное положит в память. Еще можно использовать барьеры памяти или запись в атомарную переменную с упорядочиванием памяти типа release.

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

anonymous
()
Ответ на: комментарий от proud_anon

Это не проблема. Я планировал использовать барьер

cvv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Благодарю, временная волатильность - это конечно нужно было додуматся :-)

cvv ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.