на данный момент, я хочу вставить переменные в начале блока сферы использования CreateEntryBlockAlloca:Исключения LLVM; как расслабиться
template <typename VariableType>
static inline llvm::AllocaInst *CreateEntryBlockAlloca(BuilderParameter& buildParameters,
const std::string &VarName) {
HAssertMsg(1 != 0 , "Not Implemented");
};
template <>
inline llvm::AllocaInst *CreateEntryBlockAlloca<double>(BuilderParameter& buildParameters,
const std::string &VarName) {
llvm::Function* TheFunction = buildParameters.dag.llvmFunction;
llvm::IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
TheFunction->getEntryBlock().begin());
return TmpB.CreateAlloca(llvm::Type::getDoubleTy(buildParameters.getLLVMContext()), 0,
VarName.c_str());
}
Теперь я хочу добавить Allocas для неконтактного типа POD (что может потребовать деструкторов/очистки функция на выходе). Тем не менее, недостаточно добавить вызовы деструктора в конце блока области выхода, так как неясно, как их вызвать, когда вызывается обычное исключение DWARF (для целей этого аргумента можно сказать, что исключения которые вызывают функции C++, которые вызывают только тип POD, поэтому нет, в моем случае, невежество - это блаженство, и я хотел бы держаться подальше от intrinsic llvm exceptions, если я не понимаю их лучше).
Я думал, что может быть, я мог бы иметь таблицу со смещениями в стеке с регистрами Alloca и иметь обработчик исключений (в нижней части стека, в точке вызова функции JIT) смещения на столе и соответствующие деструкторы.
Я не знаю, как запросить смещение регистров Alloca'ed, созданных с помощью CreateAlloca. Как я могу сделать это надежно?
Кроме того, если вы думаете, что это лучший способ для достижения этой цели, пожалуйста, просветите меня по пути LLVM
- Технический комментарий: код JIT вызывается внутри boost::context, который только вызывает JIT-код внутри try catch и ничего не делает в catch, он просто выходит из контекста и возвращается в основной стек выполнения. идея заключается в том, что если я обрабатываю разматывание в главном стеке выполнения, любая функция, которую я вызываю (например, очистка переменных стека), не будет перезаписывать те же содержимое стека из завершенного контекста JIT, поэтому он не будет поврежден. Надеюсь, что я делаю достаточно здравого смысла
Причина в этом; Я не знаю, где и как построить IR-код деструкторов, чтобы они вызывались каждый раз, когда кадр разматывается. – lurscher
Я обновил свой ответ, чтобы попытаться показать, как правильно построить IR. – servn
объясните это мне, пожалуйста; если b вызывается, a вызывается и выдает исключение; где код, который будет вызывать @X :: ~ X() после того, как будет разорван фрейм?я не уверен, как это сделать с уровня API – lurscher