[PATCH] D103202: [AIX] Add traceback ssp canary bit support

Jinsong Ji via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed May 26 13:32:53 PDT 2021


jsji created this revision.
jsji added reviewers: PowerPC, DiggerLin, xingxue, hubert.reinterpretcast, shchenz, lkail.
Herald added subscribers: kbarton, hiraditya, nemanjai.
jsji requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

We will need to set the ssp canary bit in traceback table to communicate
with unwinder about the canary.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D103202

Files:
  llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
  llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
  llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
  llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll


Index: llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/aix-emit-tracebacktable-ssp.ll
@@ -0,0 +1,37 @@
+; RUN: llc -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 }
+
Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -2110,6 +2110,8 @@
   if (SecondHalfOfMandatoryField & TracebackTable::HasExtensionTableMask) {
     if (ShouldEmitEHBlock)
       ExtensionTableFlag |= ExtendedTBTableFlag::TB_EH_INFO;
+    if (TargetLoweringObjectFileXCOFF::ShouldSetSSPCanaryBitInTB(MF))
+      ExtensionTableFlag |= ExtendedTBTableFlag::TB_SSP_CANARY;
 
     CommentOS << "ExtensionTableFlag = "
               << getExtendedTBTableFlagString(ExtensionTableFlag);
Index: llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- llvm/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ 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(
Index: llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
===================================================================
--- llvm/include/llvm/CodeGen/TargetLoweringObjectFileImpl.h
+++ 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);
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103202.348074.patch
Type: text/x-patch
Size: 3192 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210526/7a905c59/attachment.bin>


More information about the llvm-commits mailing list