Skip to content

Commit 54fc788

Browse files
committed
[clang][AArch64] Avoid a crash when a non-reserved register is used
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.
1 parent cfc574a commit 54fc788

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

clang/lib/Basic/Targets/AArch64.cpp

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

233233
bool AArch64TargetInfo::validateGlobalRegisterVariable(
234234
StringRef RegName, unsigned RegSize, bool &HasSizeMismatch) const {
235-
if ((RegName == "sp") || RegName.starts_with("x")) {
236-
HasSizeMismatch = RegSize != 64;
237-
return true;
238-
} else if (RegName.starts_with("w")) {
235+
if (RegName.starts_with("w")) {
239236
HasSizeMismatch = RegSize != 32;
240237
return true;
241238
}
239+
if (RegName == "sp") {
240+
HasSizeMismatch = RegSize != 64;
241+
return true;
242+
}
243+
if (RegName.starts_with("x")) {
244+
HasSizeMismatch = RegSize != 64;
245+
// Check if the register is reserved. See also
246+
// AArch64TargetLowering::getRegisterByName().
247+
return RegName == "x0" ||
248+
(RegName == "x18" &&
249+
llvm::AArch64::isX18ReservedByDefault(getTriple())) ||
250+
getTargetOpts().FeatureMap.lookup(("reserve-" + RegName).str());
251+
}
242252
return false;
243253
}
244254

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
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 -fsyntax-only
22

33
register char i1 __asm__ ("x15"); // expected-error {{size of register 'x15' does not match variable size}}
44
register long long l2 __asm__ ("w14"); // expected-error {{size of register 'w14' does not match variable size}}
5+
register long x3 __asm__ ("x3"); // expected-error {{register 'x3' unsuitable for global register variables on this target}}
6+
register long x4 __asm__ ("x4");

0 commit comments

Comments
 (0)