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