diff options
author | 2020-11-20 05:07:27 +0000 | |
---|---|---|
committer | 2020-11-20 05:07:27 +0000 | |
commit | c968ca6e72d6d1fa752fc20e33147592b1f8103b (patch) | |
tree | 9ada46f54bd794e6ef747f33dc52985169f0cffb /gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp | |
parent | When doing an sftp recursive upload or download of a read-only directory, (diff) | |
download | wireguard-openbsd-c968ca6e72d6d1fa752fc20e33147592b1f8103b.tar.xz wireguard-openbsd-c968ca6e72d6d1fa752fc20e33147592b1f8103b.zip |
Fix va_arg in C++, Objective-C on 32-bit powerpc
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
I have submitted this diff as https://reviews.llvm.org/D90329
ok kettenis@
Diffstat (limited to 'gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r-- | gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp b/gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp index 51d6ad0cae5..5f138dcaf54 100644 --- a/gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp +++ b/gnu/llvm/clang/lib/CodeGen/TargetInfo.cpp @@ -4248,13 +4248,12 @@ Address PPC32_SVR4_ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAList, // }; bool isI64 = Ty->isIntegerType() && getContext().getTypeSize(Ty) == 64; - bool isInt = - Ty->isIntegerType() || Ty->isPointerType() || Ty->isAggregateType(); + bool isInt = !Ty->isFloatingType(); bool isF64 = Ty->isFloatingType() && getContext().getTypeSize(Ty) == 64; // All aggregates are passed indirectly? That doesn't seem consistent // with the argument-lowering code. - bool isIndirect = Ty->isAggregateType(); + bool isIndirect = isAggregateTypeForABI(Ty); CGBuilderTy &Builder = CGF.Builder; |