Skip to content

Commit da65fe1

Browse files
committed
Revert "[clang][AArch64] Avoid a crash when a non-reserved register is used (#117419)"
This reverts commit 8fc6fca.
1 parent 8fc6fca commit da65fe1

File tree

4 files changed

+19
-47
lines changed

4 files changed

+19
-47
lines changed

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -232,23 +232,14 @@ bool AArch64TargetInfo::validateTarget(DiagnosticsEngine &Diags) const {
232232

233233
bool AArch64TargetInfo::validateGlobalRegisterVariable(
234234
StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const {
235-
if (RegName == "sp") {
235+
if ((RegName == "sp") || RegName.starts_with("x")) {
236236
HasSizeMismatch = RegSize != 64;
237237
return true;
238-
}
239-
if (RegName.starts_with("w"))
238+
} else if (RegName.starts_with("w")) {
240239
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());
240+
return true;
241+
}
242+
return false;
252243
}
253244

254245
bool AArch64TargetInfo::validateBranchProtection(StringRef Spec, StringRef,

clang/test/CodeGen/AArch64/fixed-register-global.c

Lines changed: 0 additions & 22 deletions
This file was deleted.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// Check that -ffixed register handled for globals.
2+
// Regression test for #76426
3+
// RUN: %clang --target=aarch64-none-gnu -ffixed-x15 -### %s 2>&1 | FileCheck %s
4+
// CHECK-NOT: fatal error: error in backend: Invalid register name "x15".
5+
register int i1 __asm__("x15");
6+
7+
int foo() {
8+
return i1;
9+
}
10+
int main() {
11+
return foo();
12+
}
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,4 @@
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
1+
// RUN: %clang_cc1 -triple aarch64-unknown-none-gnu %s -verify -fsyntax-only
32

4-
register int w0 __asm__ ("w0");
5-
register long x0 __asm__ ("x0");
63
register char i1 __asm__ ("x15"); // expected-error {{size of register 'x15' 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}}
4+
register long long l2 __asm__ ("w14"); // expected-error {{size of register 'w14' does not match variable size}}

0 commit comments

Comments
 (0)