Я создал базовую функцию Foo1
, которая вызывает другой Bar2
через invoke. Первой инструкцией в базовом блоке очистки разматывания должна быть посадочная площадка:
void bar2()
{
throw;
}
llvm::Function* Bar2Fn = llvm::Function::Create( voidSig , &bar2);
engine->addGlobalMapping( Bar2Fn, (void*)&bar2 );
llvm::InvokeInst* inv = builder.CreateInvoke( Bar2Fn , continueBlock, unwindBlock, llvmArgValues , "invoke");
builder.CreateBr(continueBlock);
builder.SetInsertPoint(unwindBlock);
llvm::LandingPadInst* landPadInst = builder.CreateLandingPad(...);
//add some cleanup code? where??
Я честно понятия не имею, что мне нужно поставить между параметрами CreateLandingPad
, чтобы получить базовую посадочную площадку, которая вызывает пользовательский код очистки для текущих объектов Foo1
. Bar2
может вызывать вызовы С++-функций, которые сами бросают (или реконструируют существующее исключение)