Цитата(scifi @ Jul 10 2018, 09:23)

Кое-что следует логически из того, что там написано.
Из описание действия volatile на переменные, следует что компилятор
не должен оптимизировать никакие операции с данными через эти указатели.
Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции? Или даже - на всю цепочку функций, вызываемых из данной функции? А это меня не устраивает.
Цитата(scifi @ Jul 10 2018, 09:23)

У вас опасение, что при вызове функции по указателю компилятор заинлайнит код.
Нет, скорее у меня опасение, что раз это
явно не описано в стандарте, то может трактоваться строителями компиляторов так, как они считают правильным.
Это называется "undefined behaviour".
Цитата(scifi @ Jul 10 2018, 09:23)

Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.
Что значит "не знает"? Для функции есть объявление.
И если подходить логически, то что значит volatile для переменных? Он собственно означает, что порядок и количество операций доступа к данным при использовании volatile в оптимизированном коде должны быть точно такими же как в неоптимизированном. Раз в неоптимизированном коде сперва следует чтение указателя из памяти, значит компилятор при оптимизации не должен удалять такое чтение. Но вот что нельзя удалить пару инструкций
BLX Rx/BX LR - это из описания volatile для данных никак не следует. Так как они не выполнят операций с памятью.
volatile накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо.