Исключения LLVM; как раскрутиться - PullRequest
2 голосов
/ 23 сентября 2011

на данный момент я вставляю переменные в начало области блока, используя 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, поэтому она не будет повреждена.Надеюсь, у меня хватит смысла

1 Ответ

2 голосов
/ 23 сентября 2011

Я не знаю, как запросить смещение регистров Alloca, созданных с помощью CreateAlloca.Как я могу сделать это надежно?

Вы можете напрямую использовать адрес alloca ... хотя не существует простого способа получить его смещение в кадре стека.

Почему именно вы не хотите использовать внутренние исключения LLVM?Они действительно не так сложны в использовании, особенно в простом случае, когда ваш код никогда ничего не ловит.Вы можете просто взять код, сгенерированный clang в простом случае, и скопировать и вставить его.

Редактировать: Чтобы увидеть, как использовать исключения в IR в простом случае, попробуйте вставитьследующий код C ++ на демонстрационную страницу в http://llvm.org/demo/:

class X { public: ~X() __attribute((nothrow)); };
void a(X* p);
void b() { X x; a(&x); }

Это действительно не так сложно.

...