[LLVMdev] Newbie question: LLVM IR, printf, and varargs

Mikael Lyngvig mikael at lyngvig.org
Tue Dec 3 14:58:11 PST 2013


I just tried adding the cast but it didn't help.  I have the feeling that I
am overlooking something very obvious, but I can't seem to figure out what
it is.  Thanks for your suggestion, though.


-- Mikael



2013/12/3 Eli Bendersky <eliben at google.com>

>
>
>
> On Tue, Dec 3, 2013 at 2:29 PM, Mikael Lyngvig <mikael at lyngvig.org> wrote:
>
>> Hi,
>>
>> I am trying to print two strings using printf.  I have tried various
>> things, but keep getting this error:
>>
>>     llc: printf.ll:4:11: error: '@printf' defined with type 'i32 (i8*,
>> ...)*'
>>         %1 = call i32 @printf(i8* null, i8*, i8* null)
>>
>> The code is:
>>
>>    declare i32 @printf(i8* nocapture readonly, ...) nounwind
>>
>>    define i32 @main() nounwind {
>>       %1 = call i32 @printf(i8* null, i8* null)
>>       ret i32 0
>>   }
>>
>> I am aware that the call will core dump, but I am initially only trying
>> to figure out why LLC won't accept the call itself.  I started out trying
>> with real values and then reduced it to the above to see if I could make it
>> work.  Comparing with the output of Clang didn't help; it does the same -
>> passes in two i8* pointers and declares @printf in the same way (and LLC
>> accepts the Clang output as valid input).  The Clang code goes as follows
>> (edited snippet):
>>
>> @.str = private unnamed_addr constant [11 x i8] c"Error: %s\0A\00", align
>> 1
>> @.str1 = private unnamed_addr constant [5 x i8] c"Test\00", align 1
>>
>> define i32 @main() nounwind {
>>   %1 = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([11
>> x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([5 x i8]* @.str1,
>> i32 0, i32 0)) nounwind
>>   ret i32 0
>> }
>>
>> declare i32 @printf(i8* nocapture readonly, ...) nounwind
>>
>> A good thing about this question is that the answer will find its way
>> into the Mapping Highlevel doc, which is why I am asking it in the first
>> place.
>>
>> This is on Windows using a 32-bit version of LLVM llc v3.4 (built about a
>> week ago).
>>
>> I searched the LR, the FAQ, and Google but found nothing of relevance.
>>
>>
> You're missing the cast, IMHO. The cast appeases the LLVM type checker
> w.r.t. mismatching function type
>
> Eli
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131203/39ec34b2/attachment.html>


More information about the llvm-dev mailing list