[PowerPC] Fix va_arg in C++, Objective-C on 32-bit ELF targets
authorGeorge Koehler <kernigh@gmail.com>
Sat, 23 Jan 2021 05:13:36 +0000 (00:13 -0500)
committerBrad Smith <brad@comstyle.com>
Sat, 23 Jan 2021 05:13:36 +0000 (00:13 -0500)
commit018984ae6833fae107aa9c502ab5536efceca88e
treed1e43e283a95b75c0bcf497ff1145c11ae3318e1
parent6c43564530365ac2c074d7515d4eada294d4ca0c
[PowerPC] Fix va_arg in C++, Objective-C on 32-bit ELF targets

In the PPC32 SVR4 ABI, a va_list has copies of registers from the function call.
va_arg looked in the wrong registers for (the pointer representation of) an
object in Objective-C, and for some types in C++. Fix va_arg to look in the
general-purpose registers, not the floating-point registers. Also fix va_arg
for some C++ types, like a member function pointer, that are aggregates for
the ABI.

Anthony Richardby found the problem in Objective-C. Eli Friedman suggested
part of this fix.

Fixes https://bugs.llvm.org/show_bug.cgi?id=47921

Reviewed By: efriedma, nemanjai

Differential Revision: https://reviews.llvm.org/D90329
clang/lib/CodeGen/TargetInfo.cpp
clang/test/CodeGenCXX/ppc32-varargs-method.cpp [new file with mode: 0644]
clang/test/CodeGenObjC/ppc32-varargs-id.m [new file with mode: 0644]