[PATCH] D143353: [RISCV] Use OS-specific stack-guard ABI for Fuchsia
Roland McGrath via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 5 18:46:27 PST 2023
This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rG34b21e817f19: [RISCV] Use OS-specific stack-guard ABI for Fuchsia (authored by mcgrathr).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D143353/new/
https://reviews.llvm.org/D143353
Files:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVISelLowering.h
llvm/lib/Target/RISCV/RISCVSubtarget.h
llvm/test/CodeGen/RISCV/stack-protector-target.ll
Index: llvm/test/CodeGen/RISCV/stack-protector-target.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/RISCV/stack-protector-target.ll
@@ -0,0 +1,32 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+
+;; Test target-specific stack cookie location.
+;
+; RUN: llc -mtriple=riscv64-fuchsia < %s | FileCheck --check-prefix=FUCHSIA-RISCV64 %s
+
+define void @func() sspreq {
+; FUCHSIA-RISCV64-LABEL: func:
+; FUCHSIA-RISCV64: # %bb.0:
+; FUCHSIA-RISCV64-NEXT: addi sp, sp, -32
+; FUCHSIA-RISCV64-NEXT: .cfi_def_cfa_offset 32
+; FUCHSIA-RISCV64-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
+; FUCHSIA-RISCV64-NEXT: .cfi_offset ra, -8
+; FUCHSIA-RISCV64-NEXT: ld a0, -16(tp)
+; FUCHSIA-RISCV64-NEXT: sd a0, 16(sp)
+; FUCHSIA-RISCV64-NEXT: addi a0, sp, 12
+; FUCHSIA-RISCV64-NEXT: call capture at plt
+; FUCHSIA-RISCV64-NEXT: ld a0, -16(tp)
+; FUCHSIA-RISCV64-NEXT: ld a1, 16(sp)
+; FUCHSIA-RISCV64-NEXT: bne a0, a1, .LBB0_2
+; FUCHSIA-RISCV64-NEXT: # %bb.1: # %SP_return
+; FUCHSIA-RISCV64-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
+; FUCHSIA-RISCV64-NEXT: addi sp, sp, 32
+; FUCHSIA-RISCV64-NEXT: ret
+; FUCHSIA-RISCV64-NEXT: .LBB0_2: # %CallStackCheckFailBlk
+; FUCHSIA-RISCV64-NEXT: call __stack_chk_fail at plt
+ %1 = alloca i32, align 4
+ call void @capture(ptr nonnull %1)
+ ret void
+}
+
+declare void @capture(ptr)
Index: llvm/lib/Target/RISCV/RISCVSubtarget.h
===================================================================
--- llvm/lib/Target/RISCV/RISCVSubtarget.h
+++ llvm/lib/Target/RISCV/RISCVSubtarget.h
@@ -176,6 +176,8 @@
const LegalizerInfo *getLegalizerInfo() const override;
const RegisterBankInfo *getRegBankInfo() const override;
+ bool isTargetFuchsia() const { return getTargetTriple().isOSFuchsia(); }
+
bool useConstantPoolForLargeInts() const;
// Maximum cost used for building integers, integers will be put into constant
Index: llvm/lib/Target/RISCV/RISCVISelLowering.h
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelLowering.h
+++ llvm/lib/Target/RISCV/RISCVISelLowering.h
@@ -633,6 +633,10 @@
return Scale == 1;
}
+ /// If the target has a standard location for the stack protector cookie,
+ /// returns the address of that location. Otherwise, returns nullptr.
+ Value *getIRStackGuard(IRBuilderBase &IRB) const override;
+
private:
/// RISCVCCAssignFn - This target-specific function extends the default
/// CCValAssign with additional information used to lower RISC-V calling
Index: llvm/lib/Target/RISCV/RISCVISelLowering.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -14221,6 +14221,25 @@
return true;
}
+static Value *useTpOffset(IRBuilderBase &IRB, unsigned Offset) {
+ Module *M = IRB.GetInsertBlock()->getParent()->getParent();
+ Function *ThreadPointerFunc =
+ Intrinsic::getDeclaration(M, Intrinsic::thread_pointer);
+ return IRB.CreatePointerCast(
+ IRB.CreateConstGEP1_32(IRB.getInt8Ty(),
+ IRB.CreateCall(ThreadPointerFunc), Offset),
+ IRB.getInt8PtrTy()->getPointerTo(0));
+}
+
+Value *RISCVTargetLowering::getIRStackGuard(IRBuilderBase &IRB) const {
+ // Fuchsia provides a fixed TLS slot for the stack cookie.
+ // <zircon/tls.h> defines ZX_TLS_STACK_GUARD_OFFSET with this value.
+ if (Subtarget.isTargetFuchsia())
+ return useTpOffset(IRB, -0x10);
+
+ return TargetLowering::getIRStackGuard(IRB);
+}
+
#define GET_REGISTER_MATCHER
#include "RISCVGenAsmMatcher.inc"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143353.494974.patch
Type: text/x-patch
Size: 3734 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230206/77958011/attachment.bin>
More information about the llvm-commits
mailing list