diff options
| author | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-08 11:15:21 +0000 |
|---|---|---|
| committer | Alexander Ivchenko <alexander.ivchenko@intel.com> | 2018-02-08 11:15:21 +0000 |
| commit | 4b20b3c80c5561040f0c0e7358b88fe8f97cf3c6 (patch) | |
| tree | fb6b8c502f4b863bbc0f24358f3b8002cf20492c /clang/lib/CodeGen | |
| parent | 1db3ca9ab1cc4b35fb1029575ea6bd6d663c7543 (diff) | |
| download | bcm5719-llvm-4b20b3c80c5561040f0c0e7358b88fe8f97cf3c6.tar.gz bcm5719-llvm-4b20b3c80c5561040f0c0e7358b88fe8f97cf3c6.zip | |
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>
llvm-svn: 324594
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index f1f24512e8a..4ca421bb863 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -3529,7 +3529,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; |

