Author: Daniel Kiss Date: 2024-06-17T08:48:53+02:00 New Revision: 5fe7f7364abcabe34f9bf157e5e6a6fa4fa0248a
URL: https://github.com/llvm/llvm-project/commit/5fe7f7364abcabe34f9bf157e5e6a6fa4fa0248a DIFF: https://github.com/llvm/llvm-project/commit/5fe7f7364abcabe34f9bf157e5e6a6fa4fa0248a.diff LOG: [clang][AArch64] Add validation for Global Register Variable. (#94271) Fixes: #76426 Added: clang/test/Driver/aarch64-fixed-register-global.c clang/test/Sema/aarch64-fixed-global-register.c Modified: clang/lib/Basic/Targets/AArch64.cpp clang/lib/Basic/Targets/AArch64.h Removed: ################################################################################ diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index 08d13c41a4857..e125ad551f098 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -221,6 +221,18 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const { return true; } +bool AArch64TargetInfo::validateGlobalRegisterVariable( + StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const { + if ((RegName == "sp") || RegName.starts_with("x")) { + HasSizeMismatch = RegSize != 64; + return true; + } else if (RegName.starts_with("w")) { + HasSizeMismatch = RegSize != 32; + return true; + } + return false; +} + bool AArch64TargetInfo::validateBranchProtection(StringRef Spec, StringRef, BranchProtectionInfo &BPI, StringRef &Err) const { diff --git a/clang/lib/Basic/Targets/AArch64.h b/clang/lib/Basic/Targets/AArch64.h index 12fb50286f751..22d7c420d5510 100644 --- a/clang/lib/Basic/Targets/AArch64.h +++ b/clang/lib/Basic/Targets/AArch64.h @@ -202,6 +202,9 @@ class LLVM_LIBRARY_VISIBILITY AArch64TargetInfo : public TargetInfo { bool hasBitIntType() const override { return true; } bool validateTarget(DiagnosticsEngine &Diags) const override; + + bool validateGlobalRegisterVariable(StringRef RegName, unsigned RegSize, + bool &HasSizeMismatch) const override; }; class LLVM_LIBRARY_VISIBILITY AArch64leTargetInfo : public AArch64TargetInfo { diff --git a/clang/test/Driver/aarch64-fixed-register-global.c b/clang/test/Driver/aarch64-fixed-register-global.c new file mode 100644 index 0000000000000..7b1fb118fcdf7 --- /dev/null +++ b/clang/test/Driver/aarch64-fixed-register-global.c @@ -0,0 +1,12 @@ +// Check that -ffixed register handled for globals. +// Regression test for #76426 +// RUN: %clang --target=aarch64-none-gnu -ffixed-x15 -### %s 2>&1 | FileCheck %s +// CHECK-NOT: fatal error: error in backend: Invalid register name "x15". +register int i1 __asm__("x15"); + +int foo() { + return i1; +} +int main() { + return foo(); +} diff --git a/clang/test/Sema/aarch64-fixed-global-register.c b/clang/test/Sema/aarch64-fixed-global-register.c new file mode 100644 index 0000000000000..9b4a422d8c1b2 --- /dev/null +++ b/clang/test/Sema/aarch64-fixed-global-register.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -verify -fsyntax-only + +register char i1 __asm__ ("x15"); // expected-error {{size of register 'x15' does not match variable size}} +register long long l2 __asm__ ("w14"); // expected-error {{size of register 'w14' does not match variable size}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits