1 //===- PseudoProbe.cpp - Pseudo Probe Helpers -----------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file implements the helpers to manipulate pseudo probe IR intrinsic 10 // calls. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/IR/PseudoProbe.h" 15 #include "llvm/IR/DebugInfoMetadata.h" 16 #include "llvm/IR/IRBuilder.h" 17 #include "llvm/IR/Instruction.h" 18 19 using namespace llvm; 20 21 namespace llvm { 22 23 Optional<PseudoProbe> extractProbeFromDiscriminator(const Instruction &Inst) { 24 assert(isa<CallBase>(&Inst) && !isa<IntrinsicInst>(&Inst) && 25 "Only call instructions should have pseudo probe encodes as their " 26 "Dwarf discriminators"); 27 if (const DebugLoc &DLoc = Inst.getDebugLoc()) { 28 const DILocation *DIL = DLoc; 29 auto Discriminator = DIL->getDiscriminator(); 30 if (DILocation::isPseudoProbeDiscriminator(Discriminator)) { 31 PseudoProbe Probe; 32 Probe.Id = 33 PseudoProbeDwarfDiscriminator::extractProbeIndex(Discriminator); 34 Probe.Type = 35 PseudoProbeDwarfDiscriminator::extractProbeType(Discriminator); 36 Probe.Attr = 37 PseudoProbeDwarfDiscriminator::extractProbeAttributes(Discriminator); 38 return Probe; 39 } 40 } 41 return None; 42 } 43 44 Optional<PseudoProbe> extractProbe(const Instruction &Inst) { 45 if (const auto *II = dyn_cast<PseudoProbeInst>(&Inst)) { 46 PseudoProbe Probe; 47 Probe.Id = II->getIndex()->getZExtValue(); 48 Probe.Type = (uint32_t)PseudoProbeType::Block; 49 Probe.Attr = II->getAttributes()->getZExtValue(); 50 return Probe; 51 } 52 53 if (isa<CallBase>(&Inst) && !isa<IntrinsicInst>(&Inst)) 54 return extractProbeFromDiscriminator(Inst); 55 56 return None; 57 } 58 } // namespace llvm 59