Моя цель - определить все возможные точки выхода из функции LLVM.Я знаю, что инструкции-терминаторы заканчивают базовые блоки либо для выхода из функции, либо для перехода к другой части той же функции.Из инструкций терминатора мне ясно по большинству из них:
ret
и resume
выход из функции br
, switch
, indirectbr
ответвлениек другим блокам в той же функции invoke
, catchswitch
, относящимся к потоку управления исключениями, а также не должен выходить из функции - (
unreachable
для этой цели можно игнорировать)
Я хотел бы получить разъяснения по catchret
и cleanupret
.Я скомпилировал пример кода обработки исключений (clang++
на Mac и Ubuntu) и не вижу этих инструкций в скомпилированном IR LLVM.Они используются только для определенных ABI?