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

Eli Bendersky
Tue, 03 Dec 2013 23:03:01 -0000

This code:

declare i32 @printf(i8* nocapture readonly, ...) nounwind

define i32 @bar(i8* %c, i32 %i) #0 {
entry:
  %call = tail call i32 (i8*, ...)* @printf(i8* %c, i8* %c)
  ret i32 %call
}

Is accepted without complaints by close-to-trunk llc on my Ubuntu machine.

Eli


On Tue, Dec 3, 2013 at 2:58 PM, Mikael Lyngvig <mikael at lyngvig.org>
wrote:

> 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/3afaad55/attachment.html>