mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
[AIX] Add traceback ssp canary bit support
We will need to set the ssp canary bit in traceback table to communicate with unwinder about the canary. Reviewed By: #powerpc, shchenz Differential Revision: https://reviews.llvm.org/D103202
This commit is contained in:
parent
55528042c5
commit
34315a15e8
@ -229,6 +229,7 @@ public:
|
||||
~TargetLoweringObjectFileXCOFF() override = default;
|
||||
|
||||
static bool ShouldEmitEHBlock(const MachineFunction *MF);
|
||||
static bool ShouldSetSSPCanaryBitInTB(const MachineFunction *MF);
|
||||
|
||||
static MCSymbol *getEHInfoTableSymbol(const MachineFunction *MF);
|
||||
|
||||
|
@ -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(
|
||||
|
@ -78,6 +78,10 @@ using namespace llvm::XCOFF;
|
||||
|
||||
#define DEBUG_TYPE "asmprinter"
|
||||
|
||||
static cl::opt<bool> 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<const MCSymbol *, MCSymbolRefExpr::VariantKind> 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);
|
||||
|
37
test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll
Normal file
37
test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll
Normal file
@ -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 }
|
||||
|
Loading…
Reference in New Issue
Block a user