Using argument in another module

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Using argument in another module

ChiaLun

Hi everyone,

  I am building a function that would call a function in another module,

I found this related thread

http://llvm.1065342.n5.nabble.com/Using-a-function-from-another-module-td10506.html

All my functions have prototype

int f(myStruct * c);

here comes my problems

If I have Function* f1,*f2

f2 is in another module, f1 is the function I am building.

Somewhere in f1 , I set

builder.CreateCall(f2,f1->arg_begin());                // builder is IRBuilder, its context is the same as f1


When I run my program, I get

llvm/lib/VMCore/Instructions.cpp:274: void llvm::CallInst::init(llvm::Value*, llvm::ArrayRef<llvm::Value*>, const llvm::Twine&): Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i) == Args[i]->getType()) && "Calling a function with a bad signature!"' failed.


I found another thread having the same problem

http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-July/052083.html

It says that the problem results from parameter in different context.

In that thread, it's still unsolved.


The reason I have this problem is that I am using many threads to create and build LLVM functions, each thread

has its own LLVMContext, and they may execute functions built by other threads.


Does anyone have idea on how to solve that ?


Have A Nice Day

Chia Lun Liu
Reply | Threaded
Open this post in threaded view
|

Re: Using argument in another module

David Blaikie
On Tue, Dec 25, 2012 at 9:15 PM, ChiaLun <[hidden email]> wrote:

>
> Hi everyone,
>
>   I am building a function that would call a function in another module,
>
> I found this related thread
>
> http://llvm.1065342.n5.nabble.com/Using-a-function-from-another-module-td10506.html
>
> All my functions have prototype
>
> int f(myStruct * c);
>
> here comes my problems
>
> If I have Function* f1,*f2
>
> f2 is in another module, f1 is the function I am building.
>
> Somewhere in f1 , I set
>
> builder.CreateCall(f2,f1->arg_begin());                // builder is
> IRBuilder, its context is the same as f1
>
>
> When I run my program, I get
>
> llvm/lib/VMCore/Instructions.cpp:274: void
> llvm::CallInst::init(llvm::Value*, llvm::ArrayRef<llvm::Value*>, const
> llvm::Twine&): Assertion `(i >= FTy->getNumParams() || FTy->getParamType(i)
> == Args[i]->getType()) && "Calling a function with a bad signature!"'
> failed.
>
>
> I found another thread having the same problem
>
> http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-July/052083.html
>
> It says that the problem results from parameter in different context.
>
> In that thread, it's still unsolved.
>
>
> The reason I have this problem is that I am using many threads to create and
> build LLVM functions, each thread
>
> has its own LLVMContext, and they may execute functions built by other
> threads.

(caveat: I'm not a specialist in LLVM issues, I work mostly with Clang)

I'm confused - are you using Functions built with one LLVMContext in
another LLVMContext? I'm pretty sure that would be invalid. You'd have
to create an external declaration of the function in any LLVMContext
you want to use it in I would think.

You shouldn't ever be mixing things between LLVMContexts.

- David

>
>
> Does anyone have idea on how to solve that ?
>
>
> Have A Nice Day
>
> Chia Lun Liu
>
>
>
>
> --
> View this message in context: http://llvm.1065342.n5.nabble.com/Using-argument-in-another-module-tp52849.html
> Sent from the LLVM - Dev mailing list archive at Nabble.com.
> _______________________________________________
> LLVM Developers mailing list
> [hidden email]         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
_______________________________________________
LLVM Developers mailing list
[hidden email]         http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev