File tree Expand file tree Collapse file tree 4 files changed +47
-19
lines changed Expand file tree Collapse file tree 4 files changed +47
-19
lines changed Original file line number Diff line number Diff line change @@ -232,14 +232,23 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
232232
233233bool AArch64TargetInfo::validateGlobalRegisterVariable (
234234 StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const {
235- if (( RegName == " sp" ) || RegName. starts_with ( " x " ) ) {
235+ if (RegName == " sp" ) {
236236 HasSizeMismatch = RegSize != 64 ;
237237 return true ;
238- } else if (RegName.starts_with (" w" )) {
239- HasSizeMismatch = RegSize != 32 ;
240- return true ;
241238 }
242- return false ;
239+ if (RegName.starts_with (" w" ))
240+ HasSizeMismatch = RegSize != 32 ;
241+ else if (RegName.starts_with (" x" ))
242+ HasSizeMismatch = RegSize != 64 ;
243+ else
244+ return false ;
245+ StringRef RegNum = RegName.drop_front ();
246+ // Check if the register is reserved. See also
247+ // AArch64TargetLowering::getRegisterByName().
248+ return RegNum == " 0" ||
249+ (RegNum == " 18" &&
250+ llvm::AArch64::isX18ReservedByDefault (getTriple ())) ||
251+ getTargetOpts ().FeatureMap .lookup ((" reserve-x" + RegNum).str ());
243252}
244253
245254bool AArch64TargetInfo::validateBranchProtection (StringRef Spec, StringRef,
Original file line number Diff line number Diff line change 1+ /// Check that -ffixed register handled for globals.
2+ /// Regression test for #76426, #109778
3+
4+ // RUN: %clang -c --target=aarch64-none-gnu -ffixed-x15 %s 2>&1 | count 0
5+
6+ // RUN: not %clang -c --target=aarch64-none-gnu %s 2>&1 | \
7+ // RUN: FileCheck %s --check-prefix=ERR_INVREG
8+ // ERR_INVREG: error: register 'x15' unsuitable for global register variables on this target
9+
10+ // RUN: not %clang -c --target=aarch64-none-gnu -ffixed-x15 -DTYPE=short %s 2>&1 | \
11+ // RUN: FileCheck %s --check-prefix=ERR_SIZE
12+ // ERR_SIZE: error: size of register 'x15' does not match variable size
13+
14+ #ifndef TYPE
15+ #define TYPE long
16+ #endif
17+
18+ register TYPE x15 __asm__("x15" );
19+
20+ TYPE foo () {
21+ return x15 ;
22+ }
Load Diff This file was deleted.
Original file line number Diff line number Diff line change 1- // RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -verify -fsyntax-only
1+ // RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -target-feature +reserve-x4 -target-feature +reserve-x15 -verify -verify=no_x18 -fsyntax-only
2+ // RUN: %clang_cc1 -triple aarch64-unknown-android %s -target-feature +reserve-x4 -target-feature +reserve-x15 -verify -fsyntax-only
23
4+ register int w0 __asm__ ("w0" );
5+ register long x0 __asm__ ("x0" );
36register char i1 __asm__ ("x15" ); // expected-error {{size of register 'x15' does not match variable size}}
4- register long long l2 __asm__ ("w14" ); // expected-error {{size of register 'w14' does not match variable size}}
7+ register long long l2 __asm__ ("w15" ); // expected-error {{size of register 'w15' does not match variable size}}
8+ register int w3 __asm__ ("w3" ); // expected-error {{register 'w3' unsuitable for global register variables on this target}}
9+ register long x3 __asm__ ("x3" ); // expected-error {{register 'x3' unsuitable for global register variables on this target}}
10+ register int w4 __asm__ ("w4" );
11+ register long x4 __asm__ ("x4" );
12+ register int w18 __asm__ ("w18" ); // no_x18-error {{register 'w18' unsuitable for global register variables on this target}}
13+ register long x18 __asm__ ("x18" ); // no_x18-error {{register 'x18' unsuitable for global register variables on this target}}
You can’t perform that action at this time.
0 commit comments