[llvm] r294781 - [XRay] Implement powerpc64le xray.
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 10 14:00:19 PST 2017
fixed by r294783
On Fri, Feb 10, 2017 at 1:59 PM Vitaly Buka <vitalybuka at google.com> wrote:
> 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/6ac19850/attachment.html>
More information about the llvm-commits
mailing list