forked from OSchip/llvm-project
[ARM64] [Windows] Follow MS X86_64 C++ ABI when passing structs
Summary: Microsoft's C++ object model for ARM64 is the same as that for X86_64. For example, small structs with non-trivial copy constructors or virtual function tables are passed indirectly. Currently, they are passed in registers when compiled with clang. Reviewers: rnk, mstorsjo, TomTan, haripul, javed.absar Reviewed By: rnk, mstorsjo Subscribers: kristof.beyls, chrib, llvm-commits, cfe-commits Differential Revision: https://reviews.llvm.org/D49770 llvm-svn: 338076
This commit is contained in:
parent
23df1319ca
commit
56391d6f84
|
@ -1223,7 +1223,7 @@ public:
|
|||
enum CallingConvKind {
|
||||
CCK_Default,
|
||||
CCK_ClangABI4OrPS4,
|
||||
CCK_MicrosoftX86_64
|
||||
CCK_MicrosoftWin64
|
||||
};
|
||||
|
||||
virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const;
|
||||
|
|
|
@ -533,6 +533,11 @@ void MicrosoftARM64TargetInfo::getTargetDefines(const LangOptions &Opts,
|
|||
getVisualStudioDefines(Opts, Builder);
|
||||
}
|
||||
|
||||
TargetInfo::CallingConvKind
|
||||
MicrosoftARM64TargetInfo::getCallingConvKind(bool ClangABICompat4) const {
|
||||
return CCK_MicrosoftWin64;
|
||||
}
|
||||
|
||||
MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
|
||||
const TargetOptions &Opts)
|
||||
: WindowsARM64TargetInfo(Triple, Opts) {
|
||||
|
|
|
@ -126,6 +126,8 @@ public:
|
|||
MacroBuilder &Builder) const;
|
||||
void getTargetDefines(const LangOptions &Opts,
|
||||
MacroBuilder &Builder) const override;
|
||||
TargetInfo::CallingConvKind
|
||||
getCallingConvKind(bool ClangABICompat4) const override;
|
||||
};
|
||||
|
||||
// ARM64 MinGW target
|
||||
|
|
|
@ -752,7 +752,7 @@ public:
|
|||
|
||||
TargetInfo::CallingConvKind
|
||||
getCallingConvKind(bool ClangABICompat4) const override {
|
||||
return CCK_MicrosoftX86_64;
|
||||
return CCK_MicrosoftWin64;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -827,6 +827,7 @@ MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
|
|||
return RAA_Default;
|
||||
|
||||
case llvm::Triple::x86_64:
|
||||
case llvm::Triple::aarch64:
|
||||
return !canCopyArgument(RD) ? RAA_Indirect : RAA_Default;
|
||||
}
|
||||
|
||||
|
|
|
@ -5831,7 +5831,7 @@ static bool canPassInRegisters(Sema &S, CXXRecordDecl *D,
|
|||
return !D->hasNonTrivialDestructorForCall() &&
|
||||
!D->hasNonTrivialCopyConstructorForCall();
|
||||
|
||||
if (CCK == TargetInfo::CCK_MicrosoftX86_64) {
|
||||
if (CCK == TargetInfo::CCK_MicrosoftWin64) {
|
||||
bool CopyCtorIsTrivial = false, CopyCtorIsTrivialForCall = false;
|
||||
bool DtorIsTrivialForCall = false;
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=i386-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck -check-prefix WIN32 %s
|
||||
// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=thumb-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck -check-prefix WOA %s
|
||||
// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=x86_64-pc-win32 -mconstructor-aliases -fno-rtti | FileCheck -check-prefix WIN64 %s
|
||||
// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -triple=aarch64-windows-msvc -mconstructor-aliases -fno-rtti | FileCheck -check-prefix WOA64 %s
|
||||
|
||||
struct Empty {};
|
||||
|
||||
|
@ -163,6 +164,9 @@ void small_arg_with_dtor(SmallWithDtor s) {}
|
|||
// WIN64: define dso_local void @"?small_arg_with_dtor@@YAXUSmallWithDtor@@@Z"(i32 %s.coerce) {{.*}} {
|
||||
// WIN64: call void @"??1SmallWithDtor@@QEAA@XZ"
|
||||
// WIN64: }
|
||||
// WOA64: define dso_local void @"?small_arg_with_dtor@@YAXUSmallWithDtor@@@Z"(i64 %s.coerce) {{.*}} {
|
||||
// WOA64: call void @"??1SmallWithDtor@@QEAA@XZ"
|
||||
// WOA64: }
|
||||
|
||||
// FIXME: MSVC incompatible!
|
||||
// WOA: define dso_local arm_aapcs_vfpcc void @"?small_arg_with_dtor@@YAXUSmallWithDtor@@@Z"(%struct.SmallWithDtor* %s) {{.*}} {
|
||||
|
@ -227,12 +231,14 @@ void small_arg_with_vftable(SmallWithVftable s) {}
|
|||
// LINUX-LABEL: define void @_Z22small_arg_with_vftable16SmallWithVftable(%struct.SmallWithVftable* %s)
|
||||
// WIN32: define dso_local void @"?small_arg_with_vftable@@YAXUSmallWithVftable@@@Z"(<{ %struct.SmallWithVftable }>* inalloca)
|
||||
// WIN64: define dso_local void @"?small_arg_with_vftable@@YAXUSmallWithVftable@@@Z"(%struct.SmallWithVftable* %s)
|
||||
// WOA64: define dso_local void @"?small_arg_with_vftable@@YAXUSmallWithVftable@@@Z"(%struct.SmallWithVftable* %s)
|
||||
|
||||
void medium_arg_with_copy_ctor(MediumWithCopyCtor s) {}
|
||||
// LINUX-LABEL: define void @_Z25medium_arg_with_copy_ctor18MediumWithCopyCtor(%struct.MediumWithCopyCtor* %s)
|
||||
// WIN32: define dso_local void @"?medium_arg_with_copy_ctor@@YAXUMediumWithCopyCtor@@@Z"(<{ %struct.MediumWithCopyCtor }>* inalloca)
|
||||
// WIN64: define dso_local void @"?medium_arg_with_copy_ctor@@YAXUMediumWithCopyCtor@@@Z"(%struct.MediumWithCopyCtor* %s)
|
||||
// WOA: define dso_local arm_aapcs_vfpcc void @"?medium_arg_with_copy_ctor@@YAXUMediumWithCopyCtor@@@Z"(%struct.MediumWithCopyCtor* %s)
|
||||
// WOA64: define dso_local void @"?medium_arg_with_copy_ctor@@YAXUMediumWithCopyCtor@@@Z"(%struct.MediumWithCopyCtor* %s)
|
||||
|
||||
void big_arg(Big s) {}
|
||||
// LINUX-LABEL: define void @_Z7big_arg3Big(%struct.Big* byval align 4 %s)
|
||||
|
|
Loading…
Reference in New Issue