diff --git a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h --- a/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h +++ b/llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h @@ -229,6 +229,7 @@ ~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 --- a/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -2171,6 +2171,17 @@ 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 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -78,6 +78,10 @@ #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 @@ -2110,6 +2114,9 @@ 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 --- /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 } +