[llvm-dev] calling va_arg functions on win32 seems to require explicit stack alignment? (original) (raw)

Nikodemus Siivola via llvm-dev llvm-dev at lists.llvm.org
Sun Nov 5 08:58:54 PST 2017


target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" target triple = "i686-pc-windows-msvc"

declare void @llvm.va_start(i8**) declare void @llvm.va_end(i8**)

define i64 @foo(...) { %va = alloca i8*, i32 16 ; 4 words should be enough? call void @llvm.va_start(i8** %va) %x = va_arg i8** %va, i64 call void @llvm.va_end(i8** %va) ret i64 %x }

;; should return 123 define i32 @main() { %val0 = call i64(...) @foo(i64 123) %res = trunc i64 %val0 to i32 ret i32 %res }

Running this returns mostly 0, but sometimes 123.

$ while sleep 1; do lli bug.ll; echo $?; done 123 0 0 0 123 0 0

Adding { alignstack=8 } to main makes it always return 123.

Is this a bug or just a missing piece of documentation?

Cheers,

-- nikodemus -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20171105/a4fd8c46/attachment.html>



More information about the llvm-dev mailing list