Pull in r324594 from upstream clang trunk (by Alexander Ivchenko):
Fix for #31362 - ms_abi is implemented incorrectly for values >=16 bytes. Summary: This patch is a fix for following issue: https://bugs.llvm.org/show_bug.cgi?id=31362 The problem was caused by front end lowering C calling conventions without taking into account calling conventions enforced by attribute. In this case win64cc was no correctly lowered on targets other than Windows. Reviewed By: rnk (Reid Kleckner) Differential Revision: https://reviews.llvm.org/D43016 Author: belickim <mateusz.belicki@intel.com> This fixes clang 6.0.0 assertions when building the emulators/wine and emulators/wine-devel ports, and should also make it use the correct Windows calling conventions. Bump __FreeBSD_version to make the fix easy to detect. PR: 224863 MFC after: 3 months X-MFC-With: r327952
This commit is contained in:
parent
de55bbfc5b
commit
b1562cfa89
@ -3543,7 +3543,17 @@ ABIArgInfo X86_64ABIInfo::classifyRegCallStructType(QualType Ty,
|
||||
|
||||
void X86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const {
|
||||
|
||||
bool IsRegCall = FI.getCallingConvention() == llvm::CallingConv::X86_RegCall;
|
||||
const unsigned CallingConv = FI.getCallingConvention();
|
||||
// It is possible to force Win64 calling convention on any x86_64 target by
|
||||
// using __attribute__((ms_abi)). In such case to correctly emit Win64
|
||||
// compatible code delegate this call to WinX86_64ABIInfo::computeInfo.
|
||||
if (CallingConv == llvm::CallingConv::Win64) {
|
||||
WinX86_64ABIInfo Win64ABIInfo(CGT);
|
||||
Win64ABIInfo.computeInfo(FI);
|
||||
return;
|
||||
}
|
||||
|
||||
bool IsRegCall = CallingConv == llvm::CallingConv::X86_RegCall;
|
||||
|
||||
// Keep track of the number of assigned registers.
|
||||
unsigned FreeIntRegs = IsRegCall ? 11 : 6;
|
||||
|
@ -60,7 +60,7 @@
|
||||
* in the range 5 to 9.
|
||||
*/
|
||||
#undef __FreeBSD_version
|
||||
#define __FreeBSD_version 1200056 /* Master, propagated to newvers */
|
||||
#define __FreeBSD_version 1200057 /* Master, propagated to newvers */
|
||||
|
||||
/*
|
||||
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
|
||||
|
Loading…
Reference in New Issue
Block a user