Здравствуйте, Константин Б., Вы писали:
V>>Вызывается изнутри _Unwind_RaiseException ...
КБ>А _Unwind_RaiseException кто вызовет?
Его вызывает ф-ия __cxa_throw — это "высокоуровневый" хелпер для запуска исключения, т.е. чтобы конструкция throw компилялась в малое кол-во опкодов.
Унутре __cxa_throw инициализирует локальные данные потока объектом-исключением и текущим контекстом функции и вызывает _Unwind_RaiseException.
Затем изнутри __cxa_throw (или по возврату из неё — в зависимости от реализации) вызывается:
__builtin_eh_return (offset, handler), which adjusts the stack by offset and then jumps to the handler.
Или другой аналог longjmp.
Там ключевое отличие лишь в том, что setjmp вызывается коде динамически, т.е. некий твой код динамически заполняет структуру jmp_buf, а компилятор генерит таблицу уже заполненных аналогичных структур для ф-ии еще в процессе компиляции.
V>>В случае структурных исключений ядро просто трансформирует аппаратные прерывания в софтовые с известной на уровне ABI операционки структурой данных, описывающих исключение.
V>>Т.е., сводит сигналы различной природы к одному АПИ.
КБ>Да. В SEH понятно кто что вызывает. А кто вызывает _Unwind_RaiseException/longjump?
Примерно так:
throw SomeException();
; передача аргументов в x64_call: RDI, RSI, RDX, RCX...
mov edi, sizeof(SomeException)
call __cxa_allocate_exception
mov rbx, rax
mov rdi, rax
call SomeException::SomeException()
; __cxa_throw(void *thrown_object, std::type_info *tinfo, void (*dest)(void *))
mov rdx, SomeException::~SomeException()
mov rsi, typeid(SomeException)
mov rdi, rbx
call __cxa_throw
; далее зависит от реализации - где происходит вызов деструктора исключения -
; внутри __cxa_throw или реализация разбита на две фазы
mov rdi, rbx
mov rbx, rax
call __cxa_free_exception
// если по возвращении, то вызываем вторую фазу обработки исключения
mov rdi, rbx
call _Unwind_Resume ; внутри будет вызван аналог __builtin_eh_return
V>>longjmp — это ...
КБ>Я знаю что оно такое и что делает. Вызывает-то его кто?
Сгенерированный компилятором С++ код.