I have reverted this in r345691 because it caused test CodeGen/mingw-long-double.c to start failing.
Command Output (stderr): -- /usr/local/google/clang/install/llvm/tools/clang/test/CodeGen/mingw-long-double.c:36:11: error: MSC64: expected string not found in input // MSC64: define dso_local double @TestLD(double %x) ^ <stdin>:12:1: note: scanning from here ; Function Attrs: noinline nounwind optnone ^ <stdin>:35:1: note: possible intended match here define dso_local void @TestLDC({ double, double }* noalias sret %agg.result, { double, double }* %x) #2 { ^ -- I suspect your patch has changed the type of "double" to a different floating point type, causing the failure. On Tue, Oct 30, 2018 at 5:00 PM Reid Kleckner via cfe-commits < cfe-commits@lists.llvm.org> wrote: > Author: rnk > Date: Tue Oct 30 16:58:41 2018 > New Revision: 345676 > > URL: http://llvm.org/viewvc/llvm-project?rev=345676&view=rev > Log: > [Win64] Handle passing i128 by value > > For arguments, pass it indirectly, since the ABI doc says pretty clearly > that arguments larger than 8 bytes are passed indirectly. This makes > va_list handling easier, anyway. > > When returning, GCC returns in XMM0, and we match them. > > Fixes PR39492. > > Added: > cfe/trunk/test/CodeGen/win64-i128.c > Modified: > cfe/trunk/lib/CodeGen/TargetInfo.cpp > > Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=345676&r1=345675&r2=345676&view=diff > > ============================================================================== > --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Tue Oct 30 16:58:41 2018 > @@ -3944,18 +3944,39 @@ ABIArgInfo WinX86_64ABIInfo::classify(Qu > return ABIArgInfo::getDirect(llvm::IntegerType::get(getVMContext(), > Width)); > } > > - // Bool type is always extended to the ABI, other builtin types are not > - // extended. > - const BuiltinType *BT = Ty->getAs<BuiltinType>(); > - if (BT && BT->getKind() == BuiltinType::Bool) > - return ABIArgInfo::getExtend(Ty); > - > - // Mingw64 GCC uses the old 80 bit extended precision floating point > unit. It > - // passes them indirectly through memory. > - if (IsMingw64 && BT && BT->getKind() == BuiltinType::LongDouble) { > - const llvm::fltSemantics *LDF = &getTarget().getLongDoubleFormat(); > - if (LDF == &llvm::APFloat::x87DoubleExtended()) > - return ABIArgInfo::getIndirect(Align, /*ByVal=*/false); > + if (const BuiltinType *BT = Ty->getAs<BuiltinType>()) { > + switch (BT->getKind()) { > + case BuiltinType::Bool: > + // Bool type is always extended to the ABI, other builtin types are > not > + // extended. > + return ABIArgInfo::getExtend(Ty); > + > + case BuiltinType::LongDouble: > + // Mingw64 GCC uses the old 80 bit extended precision floating point > + // unit. It passes them indirectly through memory. > + if (IsMingw64) { > + const llvm::fltSemantics *LDF = > &getTarget().getLongDoubleFormat(); > + if (LDF == &llvm::APFloat::x87DoubleExtended()) > + return ABIArgInfo::getIndirect(Align, /*ByVal=*/false); > + break; > + } > + > + case BuiltinType::Int128: > + case BuiltinType::UInt128: > + // If it's a parameter type, the normal ABI rule is that arguments > larger > + // than 8 bytes are passed indirectly. GCC follows it. We follow it > too, > + // even though it isn't particularly efficient. > + if (!IsReturnType) > + return ABIArgInfo::getIndirect(Align, /*ByVal=*/false); > + > + // Mingw64 GCC returns i128 in XMM0. Coerce to v2i64 to handle that. > + // Clang matches them for compatibility. > + return ABIArgInfo::getDirect( > + llvm::VectorType::get(llvm::Type::getInt64Ty(getVMContext()), > 2)); > + > + default: > + break; > + } > } > > return ABIArgInfo::getDirect(); > > Added: cfe/trunk/test/CodeGen/win64-i128.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/win64-i128.c?rev=345676&view=auto > > ============================================================================== > --- cfe/trunk/test/CodeGen/win64-i128.c (added) > +++ cfe/trunk/test/CodeGen/win64-i128.c Tue Oct 30 16:58:41 2018 > @@ -0,0 +1,16 @@ > +// RUN: %clang_cc1 -triple x86_64-windows-gnu -emit-llvm -o - %s \ > +// RUN: | FileCheck %s --check-prefix=GNU64 > +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm -o - %s \ > +// RUN: | FileCheck %s --check-prefix=MSC64 > + > +typedef int int128_t __attribute__((mode(TI))); > + > +int128_t foo() { return 0; } > + > +// GNU64: define dso_local <2 x i64> @foo() > +// MSC64: define dso_local <2 x i64> @foo() > + > +int128_t bar(int128_t a, int128_t b) { return a * b; } > + > +// GNU64: define dso_local <2 x i64> @bar(i128*, i128*) > +// MSC64: define dso_local <2 x i64> @bar(i128*, i128*) > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits