[llvm-dev] How to create a sprintf call in IR
zhi chen via llvm-dev
llvm-dev at lists.llvm.org
Wed Nov 25 09:46:18 PST 2015
Thanks for the pointer. It's working now.
Best,
Zhi
On Tue, Nov 24, 2015 at 8:39 PM, Jeremy Lakeman <Jeremy.Lakeman at gmail.com>
wrote:
> You know the C code you want to replicate. So ask llvm to generate the C++
> api calls that would produce that output.
>
> eg;
> https://gist.github.com/alloy/d86b007b1b14607a112f
>
>
> On Wed, Nov 25, 2015 at 5:34 AM, zhi chen via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Hi,
>>
>> I created a global char array, char buffer[1024]. I want to call a
>> function to append the string information to the buffer repeatedly. For
>> example, I need to implement the following code, where length, a, b, c, are
>> global variables.
>>
>> int length = 0;
>> length += sprintf(buffer+length, "str%d", a);
>> length += sprintf(buffer+length, "str%c", b);
>> length += sprintf(buffer+length, "str%d", c);
>>
>> I did it in the following way.
>> 1. Create the global array:
>> IntegerType CHARTYPE = IntegerType::get(llvm::getGlobalContext(), 8);
>> ArrayType* ty = ArrayType::get(CHARTYPE, 1024);
>>
>> GlobalVariable* buffer = new GlobalVariable(mod, ty, false,
>> GlobalValue::ExternalLinkage, 0, "buffer");
>>
>> 2. Create sprintf
>> std::vector<Type*> agrs(2, Type::getInt8PtrTy(ctxt));
>> FunctionType* sprintfFT = FunctionType::get(Type::getInt32Ty(ctxt),
>> args, true);
>> Constant* sprintf = mod->getOrInsertFunction("sprintf", sprintfFT);
>>
>> Now, I got stuck to create teh function call for sprintf.
>>
>> I didn't it like the following:
>> Value* str = builder.CreateGlobalStringPtr("str", "");
>> Value* data = builder.CreateLoad(a); //load a, b, or c
>> Value* buf = builder.CreateLoad(buffer);
>> builder.CreateCall3((value*)sprintf, buf, str, data);
>>
>> I want to test the sprintf function before adding the offset, but it
>> didn't work. The error information is "llvm.sys:PrintStackTrace(_IO_FILE)".
>> Any help will be appreciated.
>>
>> Best,
>> Zhi
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151125/52b7c50e/attachment.html>
More information about the llvm-dev
mailing list