diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h index 52c8527f47ce72..690a3f21114a0b 100644 --- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -229,6 +229,7 @@ class TargetLoweringObjectFileXCOFF : public TargetLoweringObjectFile { ~TargetLoweringObjectFileXCOFF() override = default; static bool ShouldEmitEHBlock(const MachineFunction *MF); + static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF); static MCSymbol *getEHInfoTableSymbol(const MachineFunction *MF); diff --git a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index 00a8fca41dfa30..c7fa1d67727169 100644 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2188,6 +2188,17 @@ bool TargetLoweringObjectFileXCOFF::ShouldEmitEHBlock( return true; } +bool TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB( + const MachineFunction *MF) { + const Function &F = MF->getFunction(); + if (!F.hasStackProtectorFnAttr()) + return false; + // FIXME: check presence of canary word + // There are cases that the stack protectors are not really inserted even if + // the attributes are on. + return true; +} + MCSymbol * TargetLoweringObjectFileXCOFF::getEHInfoTableSymbol(const MachineFunction *MF) { return MF->getMMI().getContext().getOrCreateSymbol( diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index e6326ac4c2e315..9c32f18c52d591 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -78,6 +78,10 @@ using namespace llvm::XCOFF; #define DEBUG_TYPE "asmprinter" +static cl::opt EnableSSPCanaryBitInTB( + "aix-ssp-tb-bit", cl::init(false), + cl::desc("Enable Passing SSP Canary info in Trackback on AIX"), cl::Hidden); + // Specialize DenseMapInfo to allow // std::pair in DenseMap. // This specialization is needed here because that type is used as keys in the @@ -2120,6 +2124,9 @@ void PPCAIXAsmPrinter::emitTracebackTable() { if (SecondHalfOfMandatoryField & TracebackTable::HasExtensionTableMask) { if (ShouldEmitEHBlock) ExtensionTableFlag |= ExtendedTBTableFlag::TB_EH_INFO; + if (EnableSSPCanaryBitInTB && + TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(MF)) + ExtensionTableFlag |= ExtendedTBTableFlag::TB_SSP_CANARY; CommentOS << "ExtensionTableFlag = " << getExtendedTBTableFlagString(ExtensionTableFlag); diff --git a/llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll b/llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll new file mode 100644 index 00000000000000..ad57d3045282ba --- /dev/null +++ b/llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll @@ -0,0 +1,37 @@ +; RUN: llc -aix-ssp-tb-bit -mtriple=powerpc64-ibm-aix-xcoff -O0 < %s | FileCheck %s + +; CHECK-LABEL: f: +; CHECK: __ssp_canary_word +; CHECK: TB_SSP_CANARY +define i32 @f() #0 personality i8* bitcast (i32 (...)* @__xlcxx_personality_v1 to i8*) { + invoke i32 undef(i8* undef) + to label %invoke unwind label %lpad + + invoke: + %var = alloca i32, align 4 + store i32 0, i32* %var, align 4 + %gep = getelementptr inbounds i32, i32* %var, i32 1 + %ret = load i32, i32* %gep, align 4 + ret i32 %ret + lpad: + landingpad { i8*, i32 } + catch i8* null + unreachable + +} + +; CHECK-LABEL: f2: +; CHECK: __ssp_canary_word +; Not emitting traceback bit when no unwinding needed. +; CHECK-NOT: TB_SSP_CANARY +define i32 @f2() #0 { + %var = alloca i32, align 4 + store i32 0, i32* %var, align 4 + %gep = getelementptr inbounds i32, i32* %var, i32 1 + %ret = load i32, i32* %gep, align 4 + ret i32 %ret +} + +declare i32 @__xlcxx_personality_v1(...) +attributes #0 = { sspstrong } +