Mikael Lyngvig
2013-Dec-03 22:29 UTC
[LLVMdev] Newbie question: LLVM IR, printf, and varargs
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>
Eli Bendersky
2013-Dec-03 22:47 UTC
[LLVMdev] Newbie question: LLVM IR, printf, and varargs
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/a52aa024/attachment.html>
Mikael Lyngvig
2013-Dec-03 22:58 UTC
[LLVMdev] Newbie question: LLVM IR, printf, and varargs
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>
Apparently Analagous Threads
- [LLVMdev] Newbie question: LLVM IR, printf, and varargs
- [LLVMdev] Newbie question: LLVM IR, printf, and varargs
- [LLVMdev] Newbie question: LLVM IR, printf, and varargs
- [LLVMdev] Newbie question: LLVM IR, printf, and varargs
- [LLVMdev] Newbie question: LLVM IR, printf, and varargs