[LLVMbugs] [Bug 14792] New: va_start is not computed correctly on x86 and x86-32
bugzilla-daemon at llvm.org
bugzilla-daemon at llvm.org
Fri Jan 4 09:54:39 PST 2013
http://llvm.org/bugs/show_bug.cgi?id=14792
Bug #: 14792
Summary: va_start is not computed correctly on x86 and x86-32
Product: new-bugs
Version: trunk
Platform: PC
OS/Version: Linux
Status: NEW
Severity: enhancement
Priority: P
Component: new bugs
AssignedTo: unassignedbugs at nondot.org
ReportedBy: tjablin at gmail.com
CC: llvmbugs at cs.uiuc.edu
Classification: Unclassified
Created attachment 9802
--> http://llvm.org/bugs/attachment.cgi?id=9802
Testcase
In llvm 3.3 (trunk 171467), va_start is not computed correctly on x86 and
x86-64 when the first two arguments are passed on the stack and the first
argument is not aligned to 4 bytes on x86 or 8 bytes on x86-64. The va_start
pointer arithmetic should account for the alignment of the first parameter, but
does not. A test case follows:
#include <stdarg.h>
#include <stdio.h>
struct Foo { char array[24]; };
template<int X> struct Baz { char array[X]; };
static Foo foo = { " :("};
static Foo qux = { "GOOD" };
template<class X>
void bar(X x, ...) {
va_list va;
va_start(va, x);
va_arg(va, Foo);
Foo f = va_arg(va, Foo);
va_end(va);
puts(f.array);
}
int main(int argc, char **argv) {
bar(Baz<17>(), foo, qux);
bar(Baz<21>(), foo, qux);
bar(Baz<25>(), foo, qux);
return 0;
}
The output should be:
GOOD
GOOD
GOOD
Currently, on x86-64:
:(
:(
:(
Currently, on x86:
:(
:(
:(
--
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.
More information about the llvm-bugs
mailing list