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

Mikael Lyngvig
Tue, 03 Dec 2013 22:29:44 -0000

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.


-- Mikael
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20131203/ba4f67f4/attachment.html>