[LLVMdev] Any suggestion for "Unknown instruction type encountered" error?
Nick Lewycky
nicholas at mxc.ca
Fri Jul 5 12:43:28 PDT 2013
hacker cling wrote:
> Hello all,
> I was playing with LLVM pass. I changed the
> lib/Transforms/Hello/Hello.cpp 's content to be my own pass. Then I make
> install the pass and use an example test1.c to see whether it works or
> not. When I run example using the following command:
> clang -emit-llvm test1.c -c -o test1.bc
> opt -load ../build_llvm/Debug+Asserts/lib/LLVMHello.so -hello < test1.bc
> > /dev/null
>
> It shows the following error:
>
> Unknown instruction type encountered!
> UNREACHABLE executed at include/llvm/InstVisitor.h:120!
The error message here means that the type of instruction -- alloca,
add, sub, load, store, etc. -- is one that did not exist in the compiler
at the time that opt was built. This is a static list in the compiler,
same as documented on llvm.org/docs/LangRef.html .
My guess is that your .bc file is from a very different version of llvm
than your 'opt' binary. Perhaps you're using a clang installed on the
system and an opt your built yourself? We sometimes change the
instruction numbering for the encoding in the .bc files. Does 'opt
-verify < test1.bc' work?
Another alternative is that you've managed to form invalid IR in some
other way, or corrupted memory. Have you tried building 'opt' and
LLVMHello.so with debug (so that llvm's assertions are enabled)? And
what about running the 'opt' command under valgrind?
Nick
> 0 opt 0x00000000014190b6
> llvm::sys::PrintStackTrace(_IO_FILE*) + 38
> 1 opt 0x0000000001419333
> 2 opt 0x0000000001418d8b
> 3 libpthread.so.0 0x0000003aa600f500
> 4 libc.so.6 0x0000003aa5c328a5 gsignal + 53
> 5 libc.so.6 0x0000003aa5c34085 abort + 373
> 6 opt 0x000000000140089b
> 7 LLVMHello.so 0x00007f889beb5833
> 8 LLVMHello.so 0x00007f889beb57bd
> 9 LLVMHello.so 0x00007f889beb575e
> 10 LLVMHello.so 0x00007f889beb56c5
> 11 LLVMHello.so 0x00007f889beb55f2
> 12 LLVMHello.so 0x00007f889beb5401
> 13 opt 0x00000000013a4e21
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 393
> 14 opt 0x00000000013a5021
> llvm::FPPassManager::runOnModule(llvm::Module&) + 89
> 15 opt 0x00000000013a5399
> llvm::MPPassManager::runOnModule(llvm::Module&) + 573
> 16 opt 0x00000000013a59a8
> llvm::PassManagerImpl::run(llvm::Module&) + 254
> 17 opt 0x00000000013a5bbf
> llvm::PassManager::run(llvm::Module&) + 39
> 18 opt 0x000000000084b455 main + 5591
> 19 libc.so.6 0x0000003aa5c1ecdd __libc_start_main + 253
> 20 opt 0x000000000083d359
> Stack dump:
> 0. Program arguments: opt -load
> ../build_llvm/Debug+Asserts/lib/LLVMHello.so -hello
> 1. Running pass 'Function Pass Manager' on module '<stdin>'.
> 2. Running pass 'Hello Pass' on function '@main'
>
> I will illustrate the pass code, the test1 example, and the IR generated
> below, so that anyone could help me or give me some suggestion. Thanks.
>
> The Hello.cpp pass is as the following:
>
> #define DEBUG_TYPE"hello"
> #include"llvm/Pass.h"
> #include"llvm/IR/Module.h"
> #include"llvm/InstVisitor.h"
> #include"llvm/IR/Constants.h"
> #include"llvm/IR/IRBuilder.h"
> #include"llvm/Support/raw_ostream.h"
> namespace {
>
> struct Hello : public llvm::FunctionPass, llvm::InstVisitor<Hello> {
> private:
> llvm::BasicBlock *FailBB;
> public:
> static char ID;
> Hello() : llvm::FunctionPass(ID) {FailBB = 0;}
>
>
> virtual bool runOnFunction(llvm::Function&F) {
>
> visit(F);
> return false;
> }
>
> llvm::BasicBlock *getTrapBB(llvm::Instruction&Inst) {
>
> if (FailBB) return FailBB;
> llvm::Function *Fn = Inst.getParent()->getParent();
>
> llvm::LLVMContext& ctx = Fn->getContext();
> llvm::IRBuilder<> builder(ctx);
You don't seem to ever use this builder?
>
> FailBB = llvm::BasicBlock::Create(ctx,"FailBlock", Fn);
> llvm::ReturnInst::Create(Fn->getContext(), FailBB);
> return FailBB;
>
> }
> void visitLoadInst(llvm::LoadInst& LI) {
> }
>
> void visitStoreInst(llvm::StoreInst& SI) {
> llvm::Value * Addr = SI.getOperand(1);
> llvm::PointerType* PTy = llvm::cast<llvm::PointerType>(Addr->getType());
> llvm::Type * ElTy = PTy -> getElementType();
> if (!ElTy->isPointerTy()) {
> llvm::BasicBlock *OldBB = SI.getParent();
> llvm::errs()<< "yes, got it \n";
> llvm::ICmpInst *Cmp = new llvm::ICmpInst(&SI, llvm::CmpInst::ICMP_EQ, Addr, llvm::Constant::getNullValue(Addr->getType()),"");
>
> llvm::Instruction *Iter =&SI;
> OldBB->getParent()->dump();
> llvm::BasicBlock *NewBB = OldBB->splitBasicBlock(Iter,"newBlock");
> OldBB->getParent()->dump();
>
> }
>
> }
> };
>
> char Hello::ID = 0;
> static llvm::RegisterPass<Hello> X("hello","Hello Pass", false, false);
> }
>
> The test1.c example is as the following:
>
> #include<stdio.h>
> void main() {
> int x;
> x = 5;
> }
>
> The IR for the example after adding the pass is as the following:
> define void @main() #0 {
> entry:
> %x = alloca i32, align 4
> %0 = icmp eq i32* %x, null
> br label %newBlock
>
> newBlock: ; preds = %entry
> store i32 5, i32* %x, align 4
> ret void
> }
>
>
> any suggestion?
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list