[llvm] r235483 - [patchpoint] Add support for symbolic patchpoint targets to SelectionDAG and the
Hal Finkel
hfinkel at anl.gov
Sat Jul 11 21:18:53 PDT 2015
----- Original Message -----
> From: "Lang Hames" <lhames at gmail.com>
> To: llvm-commits at cs.uiuc.edu
> Sent: Wednesday, April 22, 2015 1:02:32 AM
> Subject: [llvm] r235483 - [patchpoint] Add support for symbolic patchpoint targets to SelectionDAG and the
>
> Author: lhames
> Date: Wed Apr 22 01:02:31 2015
> New Revision: 235483
>
> URL: http://llvm.org/viewvc/llvm-project?rev=235483&view=rev
> Log:
> [patchpoint] Add support for symbolic patchpoint targets to
> SelectionDAG and the
> X86 backend.
>
> The code generated for symbolic targets is identical to the code
> generated for
> constant targets, except that a relocation is emitted to fix up the
> actual
> target address at link-time. This allows IR and object files
> containing
> patchpoints to be cached across JIT-invocations where the target
> address may
> change.
>
>
> Modified:
> llvm/trunk/include/llvm/MC/MCInstBuilder.h
> llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> llvm/trunk/lib/Target/X86/X86AsmPrinter.h
> llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> llvm/trunk/test/CodeGen/X86/patchpoint.ll
>
> Modified: llvm/trunk/include/llvm/MC/MCInstBuilder.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCInstBuilder.h?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/MC/MCInstBuilder.h (original)
> +++ llvm/trunk/include/llvm/MC/MCInstBuilder.h Wed Apr 22 01:02:31
> 2015
> @@ -58,6 +58,12 @@ public:
> return *this;
> }
>
> + /// \brief Add an operand.
> + MCInstBuilder &addOperand(const MCOperand &Op) {
> + Inst.addOperand(Op);
> + return *this;
> + }
> +
> operator MCInst&() {
> return Inst;
> }
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/FastISel.cpp Wed Apr 22
> 01:02:31 2015
> @@ -711,7 +711,7 @@ bool FastISel::selectPatchpoint(const Ca
> CallingConv::ID CC = I->getCallingConv();
> bool IsAnyRegCC = CC == CallingConv::AnyReg;
> bool HasDef = !I->getType()->isVoidTy();
> - Value *Callee = I->getOperand(PatchPointOpers::TargetPos);
> + Value *Callee =
> I->getOperand(PatchPointOpers::TargetPos)->stripPointerCasts();
>
> // Get the real number of arguments participating in the call
> <numArgs>
> assert(isa<ConstantInt>(I->getOperand(PatchPointOpers::NArgPos))
> &&
> @@ -757,23 +757,25 @@ bool FastISel::selectPatchpoint(const Ca
> cast<ConstantInt>(I->getOperand(PatchPointOpers::NBytesPos));
> Ops.push_back(MachineOperand::CreateImm(NumBytes->getZExtValue()));
>
> - // Assume that the callee is a constant address or null pointer.
> - // FIXME: handle function symbols in the future.
> - uint64_t CalleeAddr;
> - if (const auto *C = dyn_cast<IntToPtrInst>(Callee))
> - CalleeAddr =
> cast<ConstantInt>(C->getOperand(0))->getZExtValue();
> - else if (const auto *C = dyn_cast<ConstantExpr>(Callee)) {
> - if (C->getOpcode() == Instruction::IntToPtr)
> - CalleeAddr =
> cast<ConstantInt>(C->getOperand(0))->getZExtValue();
> - else
> + // Add the call target.
> + if (const auto *C = dyn_cast<IntToPtrInst>(Callee)) {
> + uint64_t CalleeConstAddr =
> + cast<ConstantInt>(C->getOperand(0))->getZExtValue();
> + Ops.push_back(MachineOperand::CreateImm(CalleeConstAddr));
> + } else if (const auto *C = dyn_cast<ConstantExpr>(Callee)) {
> + if (C->getOpcode() == Instruction::IntToPtr) {
> + uint64_t CalleeConstAddr =
> + cast<ConstantInt>(C->getOperand(0))->getZExtValue();
> + Ops.push_back(MachineOperand::CreateImm(CalleeConstAddr));
> + } else
> llvm_unreachable("Unsupported ConstantExpr.");
> + } else if (const auto *GV = dyn_cast<GlobalValue>(Callee)) {
> + Ops.push_back(MachineOperand::CreateGA(GV, 0));
> } else if (isa<ConstantPointerNull>(Callee))
> - CalleeAddr = 0;
> + Ops.push_back(MachineOperand::CreateImm(0));
> else
> llvm_unreachable("Unsupported callee address.");
>
> - Ops.push_back(MachineOperand::CreateImm(CalleeAddr));
> -
> // Adjust <numArgs> to account for any arguments that have been
> passed on
> // the stack instead.
> unsigned NumCallRegArgs = IsAnyRegCC ? NumArgs :
> CLI.OutRegs.size();
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
> (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp Wed
> Apr 22 01:02:31 2015
> @@ -7001,7 +7001,16 @@ void SelectionDAGBuilder::visitPatchpoin
> CallingConv::ID CC = CS.getCallingConv();
> bool IsAnyRegCC = CC == CallingConv::AnyReg;
> bool HasDef = !CS->getType()->isVoidTy();
> - SDValue Callee = getValue(CS->getOperand(2)); // <target>
> + SDValue Callee =
> getValue(CS->getOperand(PatchPointOpers::TargetPos));
> +
> + // Handle immediate and symbolic callees.
> + if (auto* ConstCallee = dyn_cast<ConstantSDNode>(Callee))
> + Callee = DAG.getIntPtrConstant(ConstCallee->getZExtValue(),
> + /*isTarget=*/true);
> + else if (auto* SymbolicCallee =
> dyn_cast<GlobalAddressSDNode>(Callee))
> + Callee =
> DAG.getTargetGlobalAddress(SymbolicCallee->getGlobal(),
> + SDLoc(SymbolicCallee),
> +
> SymbolicCallee->getValueType(0));
>
> // Get the real number of arguments participating in the call
> <numArgs>
> SDValue NArgVal =
> getValue(CS.getArgument(PatchPointOpers::NArgPos));
> @@ -7041,11 +7050,8 @@ void SelectionDAGBuilder::visitPatchpoin
> Ops.push_back(DAG.getTargetConstant(
> cast<ConstantSDNode>(NBytesVal)->getZExtValue(),
> MVT::i32));
>
> - // Assume that the Callee is a constant address.
> - // FIXME: handle function symbols in the future.
> - Ops.push_back(
> -
> DAG.getIntPtrConstant(cast<ConstantSDNode>(Callee)->getZExtValue(),
> - /*isTarget=*/true));
> + // Add the callee.
> + Ops.push_back(Callee);
>
> // Adjust <numArgs> to account for any arguments that have been
> passed on the
> // stack instead.
>
> Modified: llvm/trunk/lib/Target/X86/X86AsmPrinter.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86AsmPrinter.h?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86AsmPrinter.h (original)
> +++ llvm/trunk/lib/Target/X86/X86AsmPrinter.h Wed Apr 22 01:02:31
> 2015
> @@ -81,7 +81,7 @@ class LLVM_LIBRARY_VISIBILITY X86AsmPrin
>
> void InsertStackMapShadows(MachineFunction &MF);
> void LowerSTACKMAP(const MachineInstr &MI);
> - void LowerPATCHPOINT(const MachineInstr &MI);
> + void LowerPATCHPOINT(const MachineInstr &MI, X86MCInstLower
> &MCIL);
>
> void LowerTlsAddr(X86MCInstLower &MCInstLowering, const
> MachineInstr &MI);
>
>
> Modified: llvm/trunk/lib/Target/X86/X86MCInstLower.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86MCInstLower.cpp?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86MCInstLower.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86MCInstLower.cpp Wed Apr 22 01:02:31
> 2015
> @@ -867,7 +867,8 @@ void X86AsmPrinter::LowerSTACKMAP(const
>
> // Lower a patchpoint of the form:
> // [<def>], <id>, <numBytes>, <target>, <numArgs>, <cc>, ...
> -void X86AsmPrinter::LowerPATCHPOINT(const MachineInstr &MI) {
> +void X86AsmPrinter::LowerPATCHPOINT(const MachineInstr &MI,
> + X86MCInstLower &MCIL) {
> assert(Subtarget->is64Bit() && "Patchpoint currently only supports
> X86-64");
>
> SMShadowTracker.emitShadowPadding(OutStreamer,
> getSubtargetInfo());
> @@ -877,8 +878,29 @@ void X86AsmPrinter::LowerPATCHPOINT(cons
> PatchPointOpers opers(&MI);
> unsigned ScratchIdx = opers.getNextScratchIdx();
> unsigned EncodedBytes = 0;
> - int64_t CallTarget =
> opers.getMetaOper(PatchPointOpers::TargetPos).getImm();
> - if (CallTarget) {
> + const MachineOperand &CalleeMO =
> + opers.getMetaOper(PatchPointOpers::TargetPos);
> +
> + // Check for null target. If target is non-null (i.e. is non-zero
> or is
> + // symbolic) then emit a call.
> + if (!(CalleeMO.isImm() && !CalleeMO.getImm())) {
> + MCOperand CalleeMCOp;
> + switch (CalleeMO.getType()) {
> + default:
> + /// FIXME: Add a verifier check for bad callee types.
> + llvm_unreachable("Unrecognized callee operand type.");
> + case MachineOperand::MO_Immediate:
> + if (CalleeMO.getImm())
> + CalleeMCOp = MCOperand::CreateImm(CalleeMO.getImm());
> + break;
> + case MachineOperand::MO_ExternalSymbol:
> + case MachineOperand::MO_GlobalAddress:
> + CalleeMCOp =
> + MCIL.LowerSymbolOperand(CalleeMO,
> +
> MCIL.GetSymbolFromOperand(CalleeMO));
> + break;
> + }
> +
> // Emit MOV to materialize the target address and the CALL to
> target.
> // This is encoded with 12-13 bytes, depending on which register
> is used.
> unsigned ScratchReg = MI.getOperand(ScratchIdx).getReg();
> @@ -886,10 +908,12 @@ void X86AsmPrinter::LowerPATCHPOINT(cons
> EncodedBytes = 13;
> else
> EncodedBytes = 12;
> -
> EmitAndCountInstruction(MCInstBuilder(X86::MOV64ri).addReg(ScratchReg)
> -
> .addImm(CallTarget));
> +
> + EmitAndCountInstruction(
> +
> MCInstBuilder(X86::MOV64ri).addReg(ScratchReg).addOperand(CalleeMCOp));
> EmitAndCountInstruction(MCInstBuilder(X86::CALL64r).addReg(ScratchReg));
> }
> +
> // Emit padding.
> unsigned NumBytes =
> opers.getMetaOper(PatchPointOpers::NBytesPos).getImm();
> assert(NumBytes >= EncodedBytes &&
> @@ -1091,7 +1115,7 @@ void X86AsmPrinter::EmitInstruction(cons
> return LowerSTACKMAP(*MI);
>
> case TargetOpcode::PATCHPOINT:
> - return LowerPATCHPOINT(*MI);
> + return LowerPATCHPOINT(*MI, MCInstLowering);
>
> case X86::MORESTACK_RET:
> EmitAndCountInstruction(MCInstBuilder(getRetOpcode(*Subtarget)));
>
> Modified: llvm/trunk/test/CodeGen/X86/patchpoint.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/patchpoint.ll?rev=235483&r1=235482&r2=235483&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/patchpoint.ll (original)
> +++ llvm/trunk/test/CodeGen/X86/patchpoint.ll Wed Apr 22 01:02:31
> 2015
> @@ -21,6 +21,22 @@ entry:
> ret i64 %result
> }
>
> +; Trivial symbolic patchpoint codegen.
> +;
> +
> +declare i64 @foo(i64 %p1, i64 %p2)
> +define i64 @trivial_symbolic_patchpoint_codegen(i64 %p1, i64 %p2) {
> +entry:
> +; CHECK-LABEL: trivial_symbolic_patchpoint_codegen:
> +; CHECK: movabsq $_foo, %r11
> +; CHECK-NEXT: callq *%r11
Wouldn't it be better just to emit:
callq _foo
instead of the move and then the indirect call?
-Hal
> +; CHECK-NEXT: xchgw %ax, %ax
> +; CHECK: retq
> + %result = tail call i64 (i64, i32, i8*, i32, ...)
> @llvm.experimental.patchpoint.i64(i64 9, i32 15, i8* bitcast (i64
> (i64, i64)* @foo to i8*), i32 2, i64 %p1, i64 %p2)
> + ret i64 %result
> +}
> +
> +
> ; Caller frame metadata with stackmaps. This should not be optimized
> ; as a leaf function.
> ;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list