xref: /freebsd-src/contrib/llvm-project/llvm/lib/IR/PseudoProbe.cpp (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
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