Skip to content

Commit 03ff435

Browse files
committed
[RISCV] Default to -ffixed-x18 for Fuchsia
Fuchsia's ABI always reserves the x18 (s2) register for the ShadowCallStack ABI, even when -fsanitize=shadow-call-stack is not enabled. Reviewed By: phosek Differential Revision: https://reviews.llvm.org/D143355
1 parent 34b21e8 commit 03ff435

File tree

6 files changed

+24
-1
lines changed

6 files changed

+24
-1
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "llvm/Support/TargetParser.h"
2020
#include "llvm/Support/VirtualFileSystem.h"
2121
#include "llvm/TargetParser/AArch64TargetParser.h"
22+
#include "llvm/TargetParser/RISCVTargetParser.h"
2223
#include "llvm/Transforms/Instrumentation/AddressSanitizerOptions.h"
2324
#include <memory>
2425

@@ -545,7 +546,8 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
545546
if ((Kinds & SanitizerKind::ShadowCallStack) &&
546547
((TC.getTriple().isAArch64() &&
547548
!llvm::AArch64::isX18ReservedByDefault(TC.getTriple())) ||
548-
TC.getTriple().isRISCV()) &&
549+
(TC.getTriple().isRISCV() &&
550+
!llvm::RISCV::isX18ReservedByDefault(TC.getTriple()))) &&
549551
!Args.hasArg(options::OPT_ffixed_x18) && DiagnoseErrors) {
550552
D.Diag(diag::err_drv_argument_only_allowed_with)
551553
<< lastArgumentForMask(D, Args, Kinds & SanitizerKind::ShadowCallStack)

clang/test/Driver/sanitizer-ld.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,11 @@
731731
// RUN: | FileCheck --check-prefix=CHECK-SHADOWCALLSTACK-LINUX-RISCV64 %s
732732
// CHECK-SHADOWCALLSTACK-LINUX-RISCV64: '-fsanitize=shadow-call-stack' only allowed with '-ffixed-x18'
733733

734+
// RUN: %clang -fsanitize=shadow-call-stack -### %s 2>&1 \
735+
// RUN: --target=riscv64-unknown-fuchsia -fuse-ld=ld \
736+
// RUN: | FileCheck --check-prefix=CHECK-SHADOWCALLSTACK-FUCHSIA-RISCV64 %s
737+
// CHECK-SHADOWCALLSTACK-FUCHSIA-RISCV64-NOT: error:
738+
734739
// RUN: %clang -fsanitize=shadow-call-stack -### %s 2>&1 \
735740
// RUN: --target=aarch64-unknown-linux -fuse-ld=ld -ffixed-x18 \
736741
// RUN: | FileCheck --check-prefix=CHECK-SHADOWCALLSTACK-LINUX-AARCH64-X18 %s

llvm/include/llvm/TargetParser/RISCVTargetParser.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
#include <vector>
1919

2020
namespace llvm {
21+
22+
class Triple;
23+
2124
namespace RISCV {
2225

2326
// We use 64 bits as the known part in the scalable vector types.
@@ -38,6 +41,8 @@ void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
3841
void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64);
3942
bool getCPUFeaturesExceptStdExt(CPUKind Kind, std::vector<StringRef> &Features);
4043

44+
bool isX18ReservedByDefault(const Triple &TT);
45+
4146
} // namespace RISCV
4247
} // namespace llvm
4348

llvm/lib/Target/RISCV/RISCVSubtarget.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,9 @@ RISCVSubtarget::RISCVSubtarget(const Triple &TT, StringRef CPU,
8383
FrameLowering(
8484
initializeSubtargetDependencies(TT, CPU, TuneCPU, FS, ABIName)),
8585
InstrInfo(*this), RegInfo(getHwMode()), TLInfo(TM, *this) {
86+
if (RISCV::isX18ReservedByDefault(TT))
87+
UserReservedRegister.set(RISCV::X18);
88+
8689
CallLoweringInfo.reset(new RISCVCallLowering(*getTargetLowering()));
8790
Legalizer.reset(new RISCVLegalizerInfo(*this));
8891

llvm/lib/TargetParser/RISCVTargetParser.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "llvm/TargetParser/RISCVTargetParser.h"
1515
#include "llvm/ADT/SmallVector.h"
1616
#include "llvm/ADT/StringSwitch.h"
17+
#include "llvm/TargetParser/Triple.h"
1718

1819
namespace llvm {
1920
namespace RISCV {
@@ -100,5 +101,10 @@ bool getCPUFeaturesExceptStdExt(CPUKind Kind,
100101
return true;
101102
}
102103

104+
bool isX18ReservedByDefault(const Triple &TT) {
105+
// X18 is reserved for the ShadowCallStack ABI (even when not enabled).
106+
return TT.isOSFuchsia();
107+
}
108+
103109
} // namespace RISCV
104110
} // namespace llvm

llvm/test/CodeGen/RISCV/reserved-regs.ll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757
; RUN: llc -mtriple=riscv32 -mattr=+reserve-x31 -verify-machineinstrs < %s | FileCheck %s -check-prefix=X31
5858
; RUN: llc -mtriple=riscv64 -mattr=+reserve-x31 -verify-machineinstrs < %s | FileCheck %s -check-prefix=X31
5959

60+
; RUN: llc -mtriple=riscv64-fuchsia -verify-machineinstrs < %s | FileCheck %s -check-prefix=X18
61+
6062
; This program is free to use all registers, but needs a stack pointer for
6163
; spill values, so do not test for reserving the stack pointer.
6264

0 commit comments

Comments
 (0)