Я немного запутался насчет isLandingPad
на BasicBlock
с в LLVM. У меня есть следующий код, где я создаю пустой BasicBlock и затем вызываю isLandingPad
на нем:
#include "llvm/IR/IRBuilder.h"
#include <assert.h>
using namespace llvm;
int main(void)
{
// Start with a LLVM context.
LLVMContext TheContext;
// Make a module.
Module *TheModule = new Module("mymod", TheContext);
// Make a function
std::vector<Type*> NoArgs = {};
Type *u32 = Type::getInt32Ty(TheContext);
FunctionType *FT = FunctionType::get(u32, NoArgs, false);
Function *F = Function::Create(FT, Function::ExternalLinkage, "main", TheModule);
// Make an empty block
IRBuilder<> Builder(TheContext);
BasicBlock *BB = BasicBlock::Create(TheContext, "entry", F);
Builder.SetInsertPoint(BB);
auto fnp = BB->getFirstNonPHI();
assert(fnp == nullptr);
// I think this should crash.
auto islp = BB->isLandingPad();
printf("isLP = %d\n", islp);
// If we inline the implementation of the above call, we have the following
// (which *does* crash).
auto islp2 = isa<LandingPadInst>(BB->getFirstNonPHI());
printf("isLP2 = %d\n", islp2);
return 0;
}
, который выводит:
isLP = 0
codegen: /usr/lib/llvm-7/include/llvm/Support/Casting.h:106: static bool llvm::isa_impl_cl<llvm::LandingPadInst, const llvm::Instruction *>::doit(const From *) [To = llvm::LandingPadInst, From = const llvm::Instruction *]: Assertion `Val && "isa<> used on a null pointer"' failed.
В соответствии с источником LLVM isLandingPad
(https://llvm.org/doxygen/BasicBlock_8cpp_source.html#l00470) это должно вызвать ошибку, когда BasicBlock пуст (так как мы вызываем isa
для nullptr
). Однако когда я запускаю эту программу, вызов isLandingPad
завершается успешно и возвращает false
. Интересно, что когда я встраиваю определение функции isLandingPad
(как показано ниже), он вылетает, как и ожидалось.
Я явно что-то здесь не так делаю, но не вижу, каким образом * Вызов 1021 * отличается от встроенной версии, и почему isLandingPad
не обрабатывает sh, когда это следует в зависимости от источника.