2011-09-23 4 views
2

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

ответ

2

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

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

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

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

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

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

+0

Причина в этом; Я не знаю, где и как построить IR-код деструкторов, чтобы они вызывались каждый раз, когда кадр разматывается. – lurscher

+0

Я обновил свой ответ, чтобы попытаться показать, как правильно построить IR. – servn

+0

объясните это мне, пожалуйста; если b вызывается, a вызывается и выдает исключение; где код, который будет вызывать @X :: ~ X() после того, как будет разорван фрейм?я не уверен, как это сделать с уровня API – lurscher

 Смежные вопросы

  • Нет связанных вопросов^_^