[LLVMdev] Trouble with passing an array as argument to CreateCall()

Joshua Tuttle jtuttle at i-a-i.com
Mon Mar 24 08:27:13 PDT 2014


Hello All,

I am having a bit of trouble with inserting a function into some IR. My function takes in more than five arguments so I am trying to use the CreateCall(Value * Callee, ArrayRef<Value*> Args, const Twine & Name="") method.
I believe where I am running into problems is the declaration part where I am using the getOrInsertFunction() method. Here is the code I have written so far:

//Function declaration for "mmap"
                                                                                                /*
                                                                                                Constant *b = M->getOrInsertFunction("mmap",
                                                                                                                FunctionType::getInt8PtrTy(F.getContext()),
                                                                                                                Type::getInt8PtrTy(F.getContext()),
                                                                                                                Type::getInt8PtrTy(F.getContext()),
                                                                                                                NULL);
                                                                                                Function *mmap = cast<Function>(b);
                                                                                                */

                                                                                                Constant *b = M->getOrInsertFunction("mmap",
                                                                                                                FunctionType::getInt8PtrTy(F.getContext()),
                                                                                                                Type::getInt8PtrTy(F.getContext()),
                                                                                                                Type::getInt32Ty(F.getContext()),
                                                                                                                Type::getInt32Ty(F.getContext()),
                                                                                                                Type::getInt32Ty(F.getContext()),
                                                                                                                Type::getInt32Ty(F.getContext()),
                                                                                                                Type::getInt32Ty(F.getContext()),
                                                                                                                NULL);
                                                                                                Function *mmap = cast<Function>(b);


                                                                                                //IRBuilder responsible for inserting instructions into IR
                                                                                                IRBuilder<> builder(inst);
                                                                                                                //Inserts the two variables and call for "open"
                                                                                                Value *strPtr = builder.CreateGlobalStringPtr("/dev/mem", ".str");
                                                                                                ConstantInt *open_Argument = builder.getInt32(9437184);
                                                                                                Value *file_desc = builder.CreateCall2(open,strPtr,open_Argument);

                                                                                                                //Inserts the 5 variables needed for "mmap"
                                                                                                ConstantInt *Arg1 = builder.getInt32(0);
                                                                                                ConstantInt *Arg2 = builder.getInt32(4096);
                                                                                                ConstantInt *Arg3 = builder.getInt32(3);
                                                                                                ConstantInt *Arg4 = builder.getInt32(1);
                                                                                                ConstantInt *Arg6 = builder.getInt32(1);



                                                                                                                //Creates array of values to pass to "mmap"
                                                                                                std::vector<llvm::Value *> putsArgs;
                                                                                                putsArgs.push_back(Arg1);
                                                                                                putsArgs.push_back(Arg2);
                                                                                                putsArgs.push_back(Arg3);
                                                                                                putsArgs.push_back(Arg4);
                                                                                                putsArgs.push_back(file_desc);
                                                                                                putsArgs.push_back(Arg6);
                                                                                                llvm::ArrayRef<llvm::Value *> argsRef(putsArgs);

                                                                                                builder.CreateCall(mmap, putsArgs, "mmap");


I have written two function declarations, but am unsure of which type I should use because I am passing an array as an argument. Is the function declaration supposed to accept each argument individually or will it be expecting a pointer type if I'm using an array? My assert error is just "Calling a function with a bad signature!"

Thanks for any help!
Josh



________________________________
This message and all attachments are PRIVATE, and contain information that is PROPRIETARY to Intelligent Automation, Inc. You are not authorized to transmit or otherwise disclose this message or any attachments to any third party whatsoever without the express written consent of Intelligent Automation, Inc. If you received this message in error or you are not willing to view this message or any attachments on a confidential basis, please immediately delete this email and any attachments and notify Intelligent Automation, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140324/a3d7ebf2/attachment.html>


More information about the llvm-dev mailing list