<div dir="ltr">Hello Strahinja,<br><br>This commit broke tests at one of our builders:<br><br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/8693">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/8693</a><br><br>. . .<br>Failing Tests (7):<br> LLVM :: CodeGen/PowerPC/2008-10-28-f128-i32.ll<br> LLVM :: CodeGen/PowerPC/big-endian-formal-args.ll<br> LLVM :: CodeGen/PowerPC/calls.ll<br> LLVM :: CodeGen/PowerPC/crsave.ll<br> LLVM :: CodeGen/PowerPC/debuginfo-split-int.ll<br> LLVM :: CodeGen/PowerPC/ppc32-pic-large.ll<br> LLVM :: CodeGen/PowerPC/stack-realign.ll<br><br>Please have a look?<br><br>Thanks<br><br>Galina<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 27, 2018 at 4:23 AM, Strahinja Petrovic via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spetrovic<br>
Date: Tue Mar 27 04:23:53 2018<br>
New Revision: 328617<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=328617&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=328617&view=rev</a><br>
Log:<br>
[PowerPC] Secure PLT support<br>
<br>
This patch supports secure PLT mode for PowerPC 32 architecture.<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D42112" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D42112</a><br>
<br>
Modified:<br>
llvm/trunk/lib/Target/PowerPC/<wbr>PPC.td<br>
llvm/trunk/lib/Target/PowerPC/<wbr>PPCAsmPrinter.cpp<br>
llvm/trunk/lib/Target/PowerPC/<wbr>PPCISelDAGToDAG.cpp<br>
llvm/trunk/lib/Target/PowerPC/<wbr>PPCMCInstLower.cpp<br>
llvm/trunk/lib/Target/PowerPC/<wbr>PPCSubtarget.h<br>
llvm/trunk/test/CodeGen/<wbr>PowerPC/ppc32-pic-large.ll<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/<wbr>PPC.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPC.td?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>PowerPC/PPC.td?rev=328617&r1=<wbr>328616&r2=328617&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/PowerPC/<wbr>PPC.td (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/<wbr>PPC.td Tue Mar 27 04:23:53 2018<br>
@@ -119,6 +119,8 @@ def FeatureMSYNC : SubtargetFeature<<br>
[FeatureBookE]>;<br>
def FeatureE500 : SubtargetFeature<"e500", "IsE500", "true",<br>
"Enable E500/E500mc instructions">;<br>
+def FeatureSecurePlt : SubtargetFeature<"secure-plt",<wbr>"SecurePlt", "true",<br>
+ "Enable secure plt mode">;<br>
def FeaturePPC4xx : SubtargetFeature<"ppc4xx", "IsPPC4xx", "true",<br>
"Enable PPC 4xx instructions">;<br>
def FeaturePPC6xx : SubtargetFeature<"ppc6xx", "IsPPC6xx", "true",<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/<wbr>PPCAsmPrinter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>PowerPC/PPCAsmPrinter.cpp?rev=<wbr>328617&r1=328616&r2=328617&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/PowerPC/<wbr>PPCAsmPrinter.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/<wbr>PPCAsmPrinter.cpp Tue Mar 27 04:23:53 2018<br>
@@ -563,33 +563,63 @@ void PPCAsmPrinter::<wbr>EmitInstruction(cons<br>
// Transform %rd = UpdateGBR(%rt, %ri)<br>
// Into: lwz %rt, .L0$poff - .L0$pb(%ri)<br>
// add %rd, %rt, %ri<br>
+ // or into (if secure plt mode is on):<br>
+ // addis r30, r30, .LTOC - .L0$pb@ha<br>
+ // addi r30, r30, .LTOC - .L0$pb@l<br>
// Get the offset from the GOT Base Register to the GOT<br>
LowerPPCMachineInstrToMCInst(<wbr>MI, TmpInst, *this, isDarwin);<br>
- MCSymbol *PICOffset =<br>
- MF->getInfo<PPCFunctionInfo>()<wbr>->getPICOffsetSymbol();<br>
- TmpInst.setOpcode(PPC::LWZ);<br>
- const MCExpr *Exp =<br>
- MCSymbolRefExpr::create(<wbr>PICOffset, MCSymbolRefExpr::VK_None, OutContext);<br>
- const MCExpr *PB =<br>
- MCSymbolRefExpr::create(MF-><wbr>getPICBaseSymbol(),<br>
- MCSymbolRefExpr::VK_None,<br>
- OutContext);<br>
- const MCOperand TR = TmpInst.getOperand(1);<br>
- const MCOperand PICR = TmpInst.getOperand(0);<br>
+ if (Subtarget->isSecurePlt() && isPositionIndependent() ) {<br>
+ unsigned PICR = TmpInst.getOperand(0).getReg()<wbr>;<br>
+ MCSymbol *LTOCSymbol = OutContext.getOrCreateSymbol(<wbr>StringRef(".LTOC"));<br>
+ const MCExpr *PB =<br>
+ MCSymbolRefExpr::create(MF-><wbr>getPICBaseSymbol(),<br>
+ OutContext);<br>
<br>
- // Step 1: lwz %rt, .L$poff - .L$pb(%ri)<br>
- TmpInst.getOperand(1) =<br>
- MCOperand::createExpr(<wbr>MCBinaryExpr::createSub(Exp, PB, OutContext));<br>
- TmpInst.getOperand(0) = TR;<br>
- TmpInst.getOperand(2) = PICR;<br>
- EmitToStreamer(*OutStreamer, TmpInst);<br>
+ const MCExpr *LTOCDeltaExpr =<br>
+ MCBinaryExpr::createSub(<wbr>MCSymbolRefExpr::create(<wbr>LTOCSymbol, OutContext),<br>
+ PB, OutContext);<br>
+<br>
+ const MCExpr *LTOCDeltaHi =<br>
+ PPCMCExpr::createHa(<wbr>LTOCDeltaExpr, false, OutContext);<br>
+ EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDIS)<br>
+ .addReg(PICR)<br>
+ .addReg(PICR)<br>
+ .addExpr(LTOCDeltaHi));<br>
+<br>
+ const MCExpr *LTOCDeltaLo =<br>
+ PPCMCExpr::createLo(<wbr>LTOCDeltaExpr, false, OutContext);<br>
+ EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::ADDI)<br>
+ .addReg(PICR)<br>
+ .addReg(PICR)<br>
+ .addExpr(LTOCDeltaLo));<br>
+ return;<br>
+ } else {<br>
+ MCSymbol *PICOffset =<br>
+ MF->getInfo<PPCFunctionInfo>()<wbr>->getPICOffsetSymbol();<br>
+ TmpInst.setOpcode(PPC::LWZ);<br>
+ const MCExpr *Exp =<br>
+ MCSymbolRefExpr::create(<wbr>PICOffset, MCSymbolRefExpr::VK_None, OutContext);<br>
+ const MCExpr *PB =<br>
+ MCSymbolRefExpr::create(MF-><wbr>getPICBaseSymbol(),<br>
+ MCSymbolRefExpr::VK_None,<br>
+ OutContext);<br>
+ const MCOperand TR = TmpInst.getOperand(1);<br>
+ const MCOperand PICR = TmpInst.getOperand(0);<br>
<br>
- TmpInst.setOpcode(PPC::ADD4);<br>
- TmpInst.getOperand(0) = PICR;<br>
- TmpInst.getOperand(1) = TR;<br>
- TmpInst.getOperand(2) = PICR;<br>
- EmitToStreamer(*OutStreamer, TmpInst);<br>
- return;<br>
+ // Step 1: lwz %rt, .L$poff - .L$pb(%ri)<br>
+ TmpInst.getOperand(1) =<br>
+ MCOperand::createExpr(<wbr>MCBinaryExpr::createSub(Exp, PB, OutContext));<br>
+ TmpInst.getOperand(0) = TR;<br>
+ TmpInst.getOperand(2) = PICR;<br>
+ EmitToStreamer(*OutStreamer, TmpInst);<br>
+<br>
+ TmpInst.setOpcode(PPC::ADD4);<br>
+ TmpInst.getOperand(0) = PICR;<br>
+ TmpInst.getOperand(1) = TR;<br>
+ TmpInst.getOperand(2) = PICR;<br>
+ EmitToStreamer(*OutStreamer, TmpInst);<br>
+ return;<br>
+ }<br>
}<br>
case PPC::LWZtoc: {<br>
// Transform %r3 = LWZtoc @min1, %r2<br>
@@ -1233,7 +1263,7 @@ void PPCLinuxAsmPrinter::<wbr>EmitFunctionEnt<br>
<br>
if (!Subtarget->isPPC64()) {<br>
const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>()<wbr>;<br>
- if (PPCFI->usesPICBase()) {<br>
+ if (PPCFI->usesPICBase() && !Subtarget->isSecurePlt()) {<br>
MCSymbol *RelocSymbol = PPCFI->getPICOffsetSymbol();<br>
MCSymbol *PICBase = MF->getPICBaseSymbol();<br>
OutStreamer->EmitLabel(<wbr>RelocSymbol);<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/<wbr>PPCISelDAGToDAG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>PowerPC/PPCISelDAGToDAG.cpp?<wbr>rev=328617&r1=328616&r2=<wbr>328617&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/PowerPC/<wbr>PPCISelDAGToDAG.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/<wbr>PPCISelDAGToDAG.cpp Tue Mar 27 04:23:53 2018<br>
@@ -4001,6 +4001,27 @@ void PPCDAGToDAGISel::Select(SDNode *N)<br>
return;<br>
break;<br>
<br>
+ case PPCISD::CALL: {<br>
+ const Module *M = MF->getFunction().getParent();<br>
+<br>
+ if (PPCLowering->getPointerTy(<wbr>CurDAG->getDataLayout()) != MVT::i32 ||<br>
+ !PPCSubTarget->isSecurePlt() || !PPCSubTarget->isTargetELF() ||<br>
+ M->getPICLevel() == PICLevel::SmallPIC)<br>
+ break;<br>
+<br>
+ SDValue Op = N->getOperand(1);<br>
+<br>
+ if (GlobalAddressSDNode *GA = dyn_cast<GlobalAddressSDNode>(<wbr>Op)) {<br>
+ if (GA->getTargetFlags() == PPCII::MO_PLT)<br>
+ getGlobalBaseReg();<br>
+ }<br>
+ else if (ExternalSymbolSDNode *ES = dyn_cast<ExternalSymbolSDNode><wbr>(Op)) {<br>
+ if (ES->getTargetFlags() == PPCII::MO_PLT)<br>
+ getGlobalBaseReg();<br>
+ }<br>
+ }<br>
+ break;<br>
+<br>
case PPCISD::GlobalBaseReg:<br>
ReplaceNode(N, getGlobalBaseReg());<br>
return;<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/<wbr>PPCMCInstLower.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCMCInstLower.cpp?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>PowerPC/PPCMCInstLower.cpp?<wbr>rev=328617&r1=328616&r2=<wbr>328617&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/PowerPC/<wbr>PPCMCInstLower.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/<wbr>PPCMCInstLower.cpp Tue Mar 27 04:23:53 2018<br>
@@ -107,10 +107,20 @@ static MCOperand GetSymbolRef(const Mach<br>
break;<br>
}<br>
<br>
- if (MO.getTargetFlags() == PPCII::MO_PLT)<br>
+ if (MO.getTargetFlags() == PPCII::MO_PLT)<br>
RefKind = MCSymbolRefExpr::VK_PLT;<br>
<br>
+ const MachineFunction *MF = MO.getParent()->getParent()-><wbr>getParent();<br>
+ const PPCSubtarget *Subtarget = &(MF->getSubtarget<<wbr>PPCSubtarget>());<br>
+ const TargetMachine &TM = Printer.TM;<br>
const MCExpr *Expr = MCSymbolRefExpr::create(<wbr>Symbol, RefKind, Ctx);<br>
+ // -msecure-plt option works only in PIC mode. If secure plt mode<br>
+ // is on add 32768 to symbol.<br>
+ if (Subtarget->isSecurePlt() && TM.isPositionIndependent() &&<br>
+ MO.getTargetFlags() == PPCII::MO_PLT)<br>
+ Expr = MCBinaryExpr::createAdd(Expr,<br>
+ MCConstantExpr::create(32768, Ctx),<br>
+ Ctx);<br>
<br>
if (!MO.isJTI() && MO.getOffset())<br>
Expr = MCBinaryExpr::createAdd(Expr,<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/<wbr>PPCSubtarget.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/Target/<wbr>PowerPC/PPCSubtarget.h?rev=<wbr>328617&r1=328616&r2=328617&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/Target/PowerPC/<wbr>PPCSubtarget.h (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/<wbr>PPCSubtarget.h Tue Mar 27 04:23:53 2018<br>
@@ -133,6 +133,7 @@ protected:<br>
bool HasFloat128;<br>
bool IsISA3_0;<br>
bool UseLongCalls;<br>
+ bool SecurePlt;<br>
<br>
POPCNTDKind HasPOPCNTD;<br>
<br>
@@ -255,6 +256,7 @@ public:<br>
bool hasOnlyMSYNC() const { return HasOnlyMSYNC; }<br>
bool isPPC4xx() const { return IsPPC4xx; }<br>
bool isPPC6xx() const { return IsPPC6xx; }<br>
+ bool isSecurePlt() const {return SecurePlt; }<br>
bool isE500() const { return IsE500; }<br>
bool isFeatureMFTB() const { return FeatureMFTB; }<br>
bool isDeprecatedDST() const { return DeprecatedDST; }<br>
<br>
Modified: llvm/trunk/test/CodeGen/<wbr>PowerPC/ppc32-pic-large.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/ppc32-pic-large.ll?rev=328617&r1=328616&r2=328617&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/PowerPC/ppc32-pic-<wbr>large.ll?rev=328617&r1=328616&<wbr>r2=328617&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>PowerPC/ppc32-pic-large.ll (original)<br>
+++ llvm/trunk/test/CodeGen/<wbr>PowerPC/ppc32-pic-large.ll Tue Mar 27 04:23:53 2018<br>
@@ -1,4 +1,5 @@<br>
; RUN: llc < %s -mtriple=powerpc-unknown-<wbr>linux-gnu -relocation-model=pic | FileCheck -check-prefix=LARGE-BSS %s<br>
+; RUN: llc < %s -mtriple=powerpc-unknown-<wbr>linux-gnu -mattr=+secure-plt -relocation-model=pic | FileCheck -check-prefix=LARGE-SECUREPLT %s<br>
@bar = common global i32 0, align 4<br>
<br>
declare i32 @call_foo(i32, ...)<br>
@@ -29,3 +30,6 @@ entry:<br>
; LARGE-BSS: [[VREF]]:<br>
; LARGE-BSS-NEXT: .p2align 2<br>
; LARGE-BSS-NEXT: .long bar<br>
+; LARGE-SECUREPLT: addis 30, 30, .LTOC-.L0$pb@ha<br>
+; LARGE-SECUREPLT: addi 30, 30, .LTOC-.L0$pb@l<br>
+; LARGE-SECUREPLT: bl call_foo@PLT+32768<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>