[LLVMdev] Function Insertion Error

Duncan Sands baldrick at free.fr
Wed Feb 1 01:03:16 PST 2012


Hi Rohit,

> I am trying to insert a function into the LLVM IR. But i get a stack dump
> exception.

you should include the message since it can help us understand what you did
wrong.  You built LLVM with assertions enabled, right?

  My code is as follows.
>
>
>
> #include "llvm/Pass.h"
> #include "llvm/Function.h"
> #include "llvm/Module.h"
> #include "llvm/Support/raw_ostream.h"
> #include "llvm/ADT/Statistic.h"
> #include "llvm/Support/IRBuilder.h"
> using namespace llvm;
>
>
> namespace {
> struct FunctionInsert : public ModulePass {
> static char ID;
> FunctionInsert() : ModulePass(ID) {}
>
> };
> virtual bool runOnModule(Module &M) {
>
>
> FunctionType* ty=FunctionType::get(Type::getInt32Ty(M.getContext()),false);

A function with no parameters that returns an int: int func(void)
However I think you wanted a function that also has an int argument, thus
this should have been

   FunctionType* ty=FunctionType::get(Type::getInt32Ty(M.getContext()),
     Type::getInt32Ty(M.getContext()), false);

which corresponds to: int func(int)

> Function *func = cast<Function>(M.getOrInsertFunction("func",
> ty,Type::getInt32Ty(M.getContext()), (Type *)0));

Inserting a function that returns type ty and has one argument of type int.
Clearly you don't mean to have your function return a value of function type
(which is what ty is).  Probably you meant:

   Function *func = cast<Function>(M.getOrInsertFunction("func", ty));

This will insert a function with type ty, i.e. int func(int)

I didn't look at the rest since this first part needs to be sorted out
before worrying about anything else.

Ciao, Duncan.

> BasicBlock *BB = BasicBlock::Create(M.getContext(), "bb1", func);
> IRBuilder<> builder(BB);
> Value *One = builder.getInt32(1);
> Argument *ArgX = func->arg_begin();
> ArgX->setName("firstarg");
> Value *Add = builder.CreateAdd(One, ArgX);
> builder.CreateRet(Add);
> return true;
> }
> };
> }
>
> char FunctionInsert::ID = 0;
> static RegisterPass<FunctionInsert> X("FunctionInsert", "Function Insertion Pass");
>
> Most of the above code is from the file examples/HowToUseJIT/HowToUseJIT.cpp.
> Thanks:) happy
>
>
> _______________________________________________
> 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