<div dir="ltr"><div><pre style="font-family:"courier new",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout"><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/835">http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux/builds/835</a><br></span></pre><pre style="font-family:"courier new",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout">/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1139:22: warning: missing terminating " character [enabled by default]
     llvm_unreachable("Tail call is handled in the normal case. See comments
                      ^
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1140:41: warning: missing terminating " character [enabled by default]
                      around this assert.");
                                         ^
/mnt/b/sanitizer-buildbot1/sanitizer-x86_64-linux/build/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1566:0: error: unterminated argument list invoking macro "llvm_unreachable"
 }
 ^</span></pre><pre style="font-family:"courier new",courier,monotype,monospace;font-size:medium"><span class="inbox-inbox-stdout"><br></span></pre></div><br></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Feb 10, 2017 at 1:14 PM Tim Shen via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: timshen<br class="gmail_msg">
Date: Fri Feb 10 15:03:24 2017<br class="gmail_msg">
New Revision: 294781<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=294781&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=294781&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[XRay] Implement powerpc64le xray.<br class="gmail_msg">
<br class="gmail_msg">
Summary:<br class="gmail_msg">
powerpc64 big-endian is not supported, but I believe that most logic can<br class="gmail_msg">
be shared, except for xray_powerpc64.cc.<br class="gmail_msg">
<br class="gmail_msg">
Also add a function InvalidateInstructionCache to xray_util.h, which is<br class="gmail_msg">
copied from llvm/Support/Memory.cpp. I'm not sure if I need to add a unittest,<br class="gmail_msg">
and I don't know how.<br class="gmail_msg">
<br class="gmail_msg">
Reviewers: dberris, echristo, iteratee, kbarton, hfinkel<br class="gmail_msg">
<br class="gmail_msg">
Subscribers: mehdi_amini, nemanjai, mgorny, llvm-commits<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D29742" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D29742</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h<br class="gmail_msg">
    llvm/trunk/lib/XRay/InstrumentationMap.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp?rev=294781&r1=294780&r2=294781&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp?rev=294781&r1=294780&r2=294781&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/CodeGen/XRayInstrumentation.cpp Fri Feb 10 15:03:24 2017<br class="gmail_msg">
@@ -157,6 +157,7 @@ bool XRayInstrumentation::runOnMachineFu<br class="gmail_msg">
   case Triple::ArchType::arm:<br class="gmail_msg">
   case Triple::ArchType::thumb:<br class="gmail_msg">
   case Triple::ArchType::aarch64:<br class="gmail_msg">
+  case Triple::ArchType::ppc64le:<br class="gmail_msg">
     // For the architectures which don't have a single return instruction<br class="gmail_msg">
     prependRetWithPatchableExit(MF, TII);<br class="gmail_msg">
     break;<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=294781&r1=294780&r2=294781&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=294781&r1=294780&r2=294781&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Fri Feb 10 15:03:24 2017<br class="gmail_msg">
@@ -112,7 +112,9 @@ public:<br class="gmail_msg">
     void EmitTlsCall(const MachineInstr *MI, MCSymbolRefExpr::VariantKind VK);<br class="gmail_msg">
     bool runOnMachineFunction(MachineFunction &MF) override {<br class="gmail_msg">
       Subtarget = &MF.getSubtarget<PPCSubtarget>();<br class="gmail_msg">
-      return AsmPrinter::runOnMachineFunction(MF);<br class="gmail_msg">
+      bool Changed = AsmPrinter::runOnMachineFunction(MF);<br class="gmail_msg">
+      emitXRayTable();<br class="gmail_msg">
+      return Changed;<br class="gmail_msg">
     }<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
@@ -134,6 +136,7 @@ public:<br class="gmail_msg">
<br class="gmail_msg">
     void EmitFunctionBodyStart() override;<br class="gmail_msg">
     void EmitFunctionBodyEnd() override;<br class="gmail_msg">
+    void EmitInstruction(const MachineInstr *MI) override;<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
   /// PPCDarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac<br class="gmail_msg">
@@ -1046,6 +1049,98 @@ void PPCAsmPrinter::EmitInstruction(cons<br class="gmail_msg">
   EmitToStreamer(*OutStreamer, TmpInst);<br class="gmail_msg">
 }<br class="gmail_msg">
<br class="gmail_msg">
+void PPCLinuxAsmPrinter::EmitInstruction(const MachineInstr *MI) {<br class="gmail_msg">
+  if (!Subtarget->isPPC64())<br class="gmail_msg">
+    return PPCAsmPrinter::EmitInstruction(MI);<br class="gmail_msg">
+<br class="gmail_msg">
+  switch (MI->getOpcode()) {<br class="gmail_msg">
+  default:<br class="gmail_msg">
+    return PPCAsmPrinter::EmitInstruction(MI);<br class="gmail_msg">
+  case TargetOpcode::PATCHABLE_FUNCTION_ENTER: {<br class="gmail_msg">
+    // .begin:<br class="gmail_msg">
+    //   b .end # lis 0, FuncId[16..32]<br class="gmail_msg">
+    //   nop    # li  0, FuncId[0..15]<br class="gmail_msg">
+    //   std 0, -8(1)<br class="gmail_msg">
+    //   mflr 0<br class="gmail_msg">
+    //   bl __xray_FunctionEntry<br class="gmail_msg">
+    //   mtlr 0<br class="gmail_msg">
+    // .end:<br class="gmail_msg">
+    //<br class="gmail_msg">
+    // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number<br class="gmail_msg">
+    // of instructions change.<br class="gmail_msg">
+    MCSymbol *BeginOfSled = OutContext.createTempSymbol();<br class="gmail_msg">
+    MCSymbol *EndOfSled = OutContext.createTempSymbol();<br class="gmail_msg">
+    OutStreamer->EmitLabel(BeginOfSled);<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer,<br class="gmail_msg">
+                   MCInstBuilder(PPC::B).addExpr(<br class="gmail_msg">
+                       MCSymbolRefExpr::create(EndOfSled, OutContext)));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));<br class="gmail_msg">
+    EmitToStreamer(<br class="gmail_msg">
+        *OutStreamer,<br class="gmail_msg">
+        MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer,<br class="gmail_msg">
+                   MCInstBuilder(PPC::BL8_NOP)<br class="gmail_msg">
+                       .addExpr(MCSymbolRefExpr::create(<br class="gmail_msg">
+                           OutContext.getOrCreateSymbol("__xray_FunctionEntry"),<br class="gmail_msg">
+                           OutContext)));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));<br class="gmail_msg">
+    OutStreamer->EmitLabel(EndOfSled);<br class="gmail_msg">
+    recordSled(BeginOfSled, *MI, SledKind::FUNCTION_ENTER);<br class="gmail_msg">
+    break;<br class="gmail_msg">
+  }<br class="gmail_msg">
+  case TargetOpcode::PATCHABLE_FUNCTION_EXIT: {<br class="gmail_msg">
+    // .p2align 3<br class="gmail_msg">
+    // .begin:<br class="gmail_msg">
+    //   b(lr)? # lis 0, FuncId[16..32]<br class="gmail_msg">
+    //   nop    # li  0, FuncId[0..15]<br class="gmail_msg">
+    //   std 0, -8(1)<br class="gmail_msg">
+    //   mflr 0<br class="gmail_msg">
+    //   bl __xray_FunctionExit<br class="gmail_msg">
+    //   mtlr 0<br class="gmail_msg">
+    // .end:<br class="gmail_msg">
+    //   b(lr)?<br class="gmail_msg">
+    //<br class="gmail_msg">
+    // Update compiler-rt/lib/xray/xray_powerpc64.cc accordingly when number<br class="gmail_msg">
+    // of instructions change.<br class="gmail_msg">
+    const MachineInstr *Next = [&] {<br class="gmail_msg">
+      MachineBasicBlock::const_iterator It(MI);<br class="gmail_msg">
+      const MachineBasicBlock *MBB = MI->getParent();<br class="gmail_msg">
+      assert(It != MBB->end());<br class="gmail_msg">
+      ++It;<br class="gmail_msg">
+      assert(It->isReturn());<br class="gmail_msg">
+      return &*It;<br class="gmail_msg">
+    }();<br class="gmail_msg">
+    OutStreamer->EmitCodeAlignment(8);<br class="gmail_msg">
+    MCSymbol *BeginOfSled = OutContext.createTempSymbol();<br class="gmail_msg">
+    OutStreamer->EmitLabel(BeginOfSled);<br class="gmail_msg">
+    MCInst TmpInst;<br class="gmail_msg">
+    LowerPPCMachineInstrToMCInst(Next, TmpInst, *this, false);<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, TmpInst);<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::NOP));<br class="gmail_msg">
+    EmitToStreamer(<br class="gmail_msg">
+        *OutStreamer,<br class="gmail_msg">
+        MCInstBuilder(PPC::STD).addReg(PPC::X0).addImm(-8).addReg(PPC::X1));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MFLR8).addReg(PPC::X0));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer,<br class="gmail_msg">
+                   MCInstBuilder(PPC::BL8_NOP)<br class="gmail_msg">
+                       .addExpr(MCSymbolRefExpr::create(<br class="gmail_msg">
+                           OutContext.getOrCreateSymbol("__xray_FunctionExit"),<br class="gmail_msg">
+                           OutContext)));<br class="gmail_msg">
+    EmitToStreamer(*OutStreamer, MCInstBuilder(PPC::MTLR8).addReg(PPC::X0));<br class="gmail_msg">
+    recordSled(BeginOfSled, *MI, SledKind::FUNCTION_EXIT);<br class="gmail_msg">
+    break;<br class="gmail_msg">
+  }<br class="gmail_msg">
+  case TargetOpcode::PATCHABLE_TAIL_CALL:<br class="gmail_msg">
+  case TargetOpcode::PATCHABLE_RET:<br class="gmail_msg">
+    // PPC's tail call instruction, e.g. PPC::TCRETURNdi8, doesn't really<br class="gmail_msg">
+    // lower to a PPC::B instruction. The PPC::B instruction is generated<br class="gmail_msg">
+    // before it, and handled by the normal case.<br class="gmail_msg">
+    llvm_unreachable("Tail call is handled in the normal case. See comments<br class="gmail_msg">
+                     around this assert.");<br class="gmail_msg">
+  }<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
 void PPCLinuxAsmPrinter::EmitStartOfAsmFile(Module &M) {<br class="gmail_msg">
   if (static_cast<const PPCTargetMachine &>(TM).isELFv2ABI()) {<br class="gmail_msg">
     PPCTargetStreamer *TS =<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp?rev=294781&r1=294780&r2=294781&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp?rev=294781&r1=294780&r2=294781&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.cpp Fri Feb 10 15:03:24 2017<br class="gmail_msg">
@@ -65,7 +65,9 @@ UseOldLatencyCalc("ppc-old-latency-calc"<br class="gmail_msg">
 void PPCInstrInfo::anchor() {}<br class="gmail_msg">
<br class="gmail_msg">
 PPCInstrInfo::PPCInstrInfo(PPCSubtarget &STI)<br class="gmail_msg">
-    : PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),<br class="gmail_msg">
+    : PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP,<br class="gmail_msg">
+                      /* CatchRetOpcode */ -1,<br class="gmail_msg">
+                      STI.isPPC64() ? PPC::BLR8 : PPC::BLR),<br class="gmail_msg">
       Subtarget(STI), RI(STI.getTargetMachine()) {}<br class="gmail_msg">
<br class="gmail_msg">
 /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h?rev=294781&r1=294780&r2=294781&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h?rev=294781&r1=294780&r2=294781&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/PowerPC/PPCSubtarget.h Fri Feb 10 15:03:24 2017<br class="gmail_msg">
@@ -318,6 +318,8 @@ public:<br class="gmail_msg">
   /// classifyGlobalReference - Classify a global variable reference for the<br class="gmail_msg">
   /// current subtarget accourding to how we should reference it.<br class="gmail_msg">
   unsigned char classifyGlobalReference(const GlobalValue *GV) const;<br class="gmail_msg">
+<br class="gmail_msg">
+  bool isXRaySupported() const override { return IsPPC64 && IsLittleEndian; }<br class="gmail_msg">
 };<br class="gmail_msg">
 } // End llvm namespace<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/XRay/InstrumentationMap.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/XRay/InstrumentationMap.cpp?rev=294781&r1=294780&r2=294781&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/XRay/InstrumentationMap.cpp?rev=294781&r1=294780&r2=294781&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/XRay/InstrumentationMap.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/XRay/InstrumentationMap.cpp Fri Feb 10 15:03:24 2017<br class="gmail_msg">
@@ -55,7 +55,8 @@ loadELF64(StringRef Filename, object::Ow<br class="gmail_msg">
<br class="gmail_msg">
   // Find the section named "xray_instr_map".<br class="gmail_msg">
   if (!ObjFile.getBinary()->isELF() ||<br class="gmail_msg">
-      ObjFile.getBinary()->getArch() != Triple::x86_64)<br class="gmail_msg">
+      !(ObjFile.getBinary()->getArch() == Triple::x86_64 ||<br class="gmail_msg">
+        ObjFile.getBinary()->getArch() == Triple::ppc64le))<br class="gmail_msg">
     return make_error<StringError>(<br class="gmail_msg">
         "File format not supported (only does ELF little endian 64-bit).",<br class="gmail_msg">
         std::make_error_code(std::errc::not_supported));<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>