llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Igor Kudrin (igorkudrin) <details> <summary>Changes</summary> Fixes #<!-- -->76426 The previous patch for this issue, #<!-- -->94271, generated an error message if a register and a global variable did not have the same size. This patch checks if the register is actually reserved. --- Full diff: https://github.com/llvm/llvm-project/pull/117419.diff 2 Files Affected: - (modified) clang/lib/Basic/Targets/AArch64.cpp (+14-4) - (modified) clang/test/Sema/aarch64-fixed-global-register.c (+3-1) ``````````diff diff --git a/clang/lib/Basic/Targets/AArch64.cpp b/clang/lib/Basic/Targets/AArch64.cpp index eb8a3ada034482..7500c7bb045e54 100644 --- a/clang/lib/Basic/Targets/AArch64.cpp +++ b/clang/lib/Basic/Targets/AArch64.cpp @@ -232,13 +232,23 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const { 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")) { + if (RegName.starts_with("w")) { HasSizeMismatch = RegSize != 32; return true; } + if (RegName == "sp") { + HasSizeMismatch = RegSize != 64; + return true; + } + if (RegName.starts_with("x")) { + HasSizeMismatch = RegSize != 64; + // Check if the register is reserved. See also + // AArch64TargetLowering::getRegisterByName(). + return RegName == "x0" || + (RegName == "x18" && + llvm::AArch64::isX18ReservedByDefault(getTriple())) || + getTargetOpts().FeatureMap.lookup(("reserve-" + RegName).str()); + } return false; } diff --git a/clang/test/Sema/aarch64-fixed-global-register.c b/clang/test/Sema/aarch64-fixed-global-register.c index 9b4a422d8c1b2c..2b7d39dbcdd6f8 100644 --- a/clang/test/Sema/aarch64-fixed-global-register.c +++ b/clang/test/Sema/aarch64-fixed-global-register.c @@ -1,4 +1,6 @@ -// RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -verify -fsyntax-only +// RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -target-feature +reserve-x4 -target-feature +reserve-x15 -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}} +register long x3 __asm__ ("x3"); // expected-error {{register 'x3' unsuitable for global register variables on this target}} +register long x4 __asm__ ("x4"); `````````` </details> https://github.com/llvm/llvm-project/pull/117419 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits