From 502be66e5178073aaa16ae04388fa6984bded5f0 Mon Sep 17 00:00:00 2001 From: David Stenberg Date: Mon, 19 Aug 2019 12:41:22 +0000 Subject: [PATCH] [DebugInfo] Allow bundled calls in the MIR's call site info Summary: Extend the MIR parser and writer so that the call site information can refer to calls that are bundled. Reviewers: aprantl, asowda, NikolaPrica, djtodoro, ivanbaev, vsk Reviewed By: aprantl Subscribers: arsenm, hiraditya, llvm-commits Tags: #debug-info, #llvm Differential Revision: https://reviews.llvm.org/D66145 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369256 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MIRParser/MIRParser.cpp | 4 +- lib/CodeGen/MIRPrinter.cpp | 5 +- .../MIR/Hexagon/bundled-call-site-info.mir | 47 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir diff --git a/lib/CodeGen/MIRParser/MIRParser.cpp b/lib/CodeGen/MIRParser/MIRParser.cpp index f3dcb9c1214..48ec0b2d6cf 100644 --- a/lib/CodeGen/MIRParser/MIRParser.cpp +++ b/lib/CodeGen/MIRParser/MIRParser.cpp @@ -357,8 +357,8 @@ bool MIRParserImpl::initializeCallSiteInfo( Twine(" call instruction offset out of range.") + "Unable to reference instruction at bb: " + Twine(MILoc.BlockNum) + " at offset:" + Twine(MILoc.Offset)); - auto CallI = std::next(CallB->begin(), MILoc.Offset); - if (!CallI->isCall()) + auto CallI = std::next(CallB->instr_begin(), MILoc.Offset); + if (!CallI->isCall(MachineInstr::IgnoreBundle)) return error(Twine(MF.getName()) + Twine(" call site info should reference call " "instruction. Instruction at bb:") + diff --git a/lib/CodeGen/MIRPrinter.cpp b/lib/CodeGen/MIRPrinter.cpp index 539aa863e22..7febb11dcb8 100644 --- a/lib/CodeGen/MIRPrinter.cpp +++ b/lib/CodeGen/MIRPrinter.cpp @@ -473,10 +473,11 @@ void MIRPrinter::convertCallSiteObjects(yaml::MachineFunction &YMF, yaml::CallSiteInfo::MachineInstrLoc CallLocation; // Prepare instruction position. - MachineBasicBlock::const_iterator CallI = CSInfo.first->getIterator(); + MachineBasicBlock::const_instr_iterator CallI = CSInfo.first->getIterator(); CallLocation.BlockNum = CallI->getParent()->getNumber(); // Get call instruction offset from the beginning of block. - CallLocation.Offset = std::distance(CallI->getParent()->begin(), CallI); + CallLocation.Offset = + std::distance(CallI->getParent()->instr_begin(), CallI); YmlCS.CallLocation = CallLocation; // Construct call arguments and theirs forwarding register info. for (auto ArgReg : CSInfo.second) { diff --git a/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir b/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir new file mode 100644 index 00000000000..5ffa0293a2e --- /dev/null +++ b/test/CodeGen/MIR/Hexagon/bundled-call-site-info.mir @@ -0,0 +1,47 @@ +# RUN: llc -debug-entry-values -run-pass=none -verify-machineinstrs -o - %s | FileCheck %s + +# Verify that it is possible to read and write MIR where a callSites entry +# points to a call residing in a bundle. The offset should point to the call +# instruction, rather than the bundle head. + +# CHECK: name: caller +# CHECK: callSites: +# CHECK-NEXT: bb: 0, offset: 3, fwdArgRegs: +# CHECK-NEXT: arg: 0, reg: '$r0' + +# XXX: Please note that at the time of creating this test the Hexagon target +# did not support call site information, so the "callSites" array has been +# manually added. + +--- | + target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048" + target triple = "hexagon" + + define i32 @caller() { + entry: + tail call void @callee(i32 12345) + ret i32 0 + } + + declare void @callee(i32) + +... +--- +name: caller +tracksRegLiveness: true +callSites: + - { bb: 0, offset: 3, fwdArgRegs: + - { arg: 0, reg: '$r0' } } +body: | + bb.0.entry: + BUNDLE implicit-def $r29, implicit-def $r30, implicit-def dead $r0, implicit-def dead $pc, implicit-def dead $r31, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31 { + $r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31 :: (store 4 into stack) + $r0 = A2_tfrsi 12345 + J2_call @callee, hexagoncsr, implicit-def dead $pc, implicit-def dead $r31, implicit internal killed $r29, implicit internal killed $r0, implicit-def $r29 + } + BUNDLE implicit-def dead $r0, implicit-def $d15, implicit-def $r30, implicit-def $r31, implicit-def $pc, implicit-def $r29, implicit killed $r30, implicit killed $framekey { + $r0 = A2_tfrsi 0 + $d15 = L4_return killed $r30, implicit-def $pc, implicit-def $r29, implicit killed $framekey, implicit-def dead $pc, implicit internal killed $r0 + } + +... -- 2.40.0