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: [email protected]
ReportedBy: [email protected]
CC: [email protected]
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.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs