на данный момент я вставляю переменные в начало области блока, используя CreateEntryBlockAlloca:
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 (для целей этого аргумента предположим, что исключения являютсяБрошенный из Call-точек, которые вызывают функции C ++, которые генерируют только POD-тип, так что нет, в моем случае невежество - это блаженство, и я хотел бы держаться подальше от внутренних исключений llvm , если я не понимаю их лучше).
Я подумал, что, возможно, я мог бы иметь таблицу со смещениями в стеке с регистрами Alloca и иметь обработчик исключений (внизу стека, в точке вызова функции JIT) walkнад этими смещениями в таблице и вызывайте деструкторы соответственно.
Я не знаю, как запросить смещение регистров Alloca, созданных с помощью CreateAlloca. Как я могу сделать это надежно?
Кроме того, если вы думаете, что есть лучший способ достичь этого, пожалуйста, просветите меня на пути llvm
- Технический комментарий : JIT-код вызывается внутри boost :: context , который только вызывает JIT-код внутри try-улова и ничего не делает с уловом, он просто выходит изконтекст и возвращается к основному стеку выполнения.идея заключается в том, что если я обработаю раскрутку в главном стеке выполнения, любая вызываемая мной функция (например, очистка переменных стека) не будет перезаписывать это же содержимое стека из завершенного контекста JIT, поэтому она не будет повреждена.Надеюсь, у меня хватит смысла