add PowerPC Secure PLT support and enable Secure PLT by default for OpenBSD. from Brad (maintainer)
33 lines
1.1 KiB
Plaintext
33 lines
1.1 KiB
Plaintext
$OpenBSD: patch-lib_Target_PowerPC_PPCISelDAGToDAG_cpp,v 1.5 2018/11/17 08:32:38 ajacoutot Exp $
|
|
|
|
[PowerPC] Secure PLT support
|
|
|
|
Index: lib/Target/PowerPC/PPCISelDAGToDAG.cpp
|
|
--- lib/Target/PowerPC/PPCISelDAGToDAG.cpp.orig
|
|
+++ lib/Target/PowerPC/PPCISelDAGToDAG.cpp
|
|
@@ -3894,6 +3894,24 @@ void PPCDAGToDAGISel::Select(SDNode *N) {
|
|
return;
|
|
break;
|
|
|
|
+ case PPCISD::CALL: {
|
|
+ const Module *M = MF->getFunction().getParent();
|
|
+ if (PPCLowering->getPointerTy(CurDAG->getDataLayout()) != MVT::i32 ||
|
|
+ !PPCSubTarget->isSecurePlt() || !PPCSubTarget->isTargetELF() ||
|
|
+ M->getPICLevel() == PICLevel::SmallPIC)
|
|
+ break;
|
|
+ SDValue Op = N->getOperand(1);
|
|
+ if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(Op)) {
|
|
+ if (GA->getTargetFlags() == PPCII::MO_PLT)
|
|
+ getGlobalBaseReg();
|
|
+ }
|
|
+ else if (ExternalSymbolSDNode *ES = dyn_cast<ExternalSymbolSDNode>(Op)) {
|
|
+ if (ES->getTargetFlags() == PPCII::MO_PLT)
|
|
+ getGlobalBaseReg();
|
|
+ }
|
|
+ }
|
|
+ break;
|
|
+
|
|
case PPCISD::GlobalBaseReg:
|
|
ReplaceNode(N, getGlobalBaseReg());
|
|
return;
|