https://github.com/tru created https://github.com/llvm/llvm-project/pull/88857
Previously the trivial_abi was ignored for records when targetting the microsoft abi, the MSVC rules where always enforced to ensure compatibility with MSVC. This commit changes it to be closer to the itanium abi when a record is marked with the trivial_abi attribute. Fixes #87993 >From 22f627cac7b2ea08a5569bb25d9c1d054b3a7cae Mon Sep 17 00:00:00 2001 From: Tobias Hieta <tobias.hi...@ubisoft.com> Date: Tue, 16 Apr 2024 09:38:53 +0200 Subject: [PATCH] [clang] Handle trivial_abi attribute for Microsoft ABI. Previously the trivial_abi was ignored for records when targetting the microsoft abi, the MSVC rules where always enforced to ensure compatibility with MSVC. This commit changes it to be closer to the itanium abi when a record is marked with the trivial_abi attribute. Fixes #87993 --- clang/docs/ReleaseNotes.rst | 4 ++++ clang/lib/CodeGen/MicrosoftCXXABI.cpp | 5 +++++ clang/test/CodeGenCXX/trivial_abi_msvc.cpp | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 clang/test/CodeGenCXX/trivial_abi_msvc.cpp diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 76701dc723b6c3..c5241403711726 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -63,6 +63,10 @@ ABI Changes in This Version MSVC uses a different mangling for these objects, compatibility is not affected. (#GH85423). +- The attribute ``trivial_abi`` now works when targetting the Microsoft ABI. Marking + a struct with this attribute will now cause clang to emit ABI similar to the Itanium + ABI. This is not compatible with the Microsoft ABI. (#GH87993). + AST Dumping Potentially Breaking Changes ---------------------------------------- diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp index d38a26940a3cb6..b930913badcd3f 100644 --- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp @@ -1105,6 +1105,11 @@ bool MicrosoftCXXABI::hasMostDerivedReturn(GlobalDecl GD) const { static bool isTrivialForMSVC(const CXXRecordDecl *RD, QualType Ty, CodeGenModule &CGM) { + // If the record is marked with the trivial_abi attribute, we don't + // have to conform to the standard MSVC ABI. + if (RD->hasAttr<TrivialABIAttr>()) + return true; + // On AArch64, HVAs that can be passed in registers can also be returned // in registers. (Note this is using the MSVC definition of an HVA; see // isPermittedToBeHomogeneousAggregate().) diff --git a/clang/test/CodeGenCXX/trivial_abi_msvc.cpp b/clang/test/CodeGenCXX/trivial_abi_msvc.cpp new file mode 100644 index 00000000000000..8826a8224c6671 --- /dev/null +++ b/clang/test/CodeGenCXX/trivial_abi_msvc.cpp @@ -0,0 +1,21 @@ +// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -std=c++11 -fcxx-exceptions -fexceptions -emit-llvm -o - %s | FileCheck %s + +// CHECK: %[[STRUCT_TRIVIAL:.*]] = type { ptr } +struct __attribute__((trivial_abi)) Trivial { + int *p; + Trivial() : p(0) {} + Trivial(const Trivial &) noexcept = default; +}; + +// CHECK-LABEL: define{{.*}} i64 @"?retTrivial@@YA?AUTrivial@@XZ"( +// CHECK: %retval = alloca %[[STRUCT_TRIVIAL]], align 8 +// CHECK: %call = call noundef ptr @"??0Trivial@@QEAA@XZ"(ptr noundef nonnull align 8 dereferenceable(8) %retval) +// CHECK: %coerce.dive = getelementptr inbounds %[[STRUCT_TRIVIAL]], ptr %retval, i32 0, i32 0 +// CHECK: %0 = load ptr, ptr %coerce.dive, align 8 +// CHECK: %coerce.val.pi = ptrtoint ptr %0 to i64 +// CHECK: ret i64 %coerce.val.pi +Trivial retTrivial() { + Trivial s; + return s; +} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits