Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- PseudoProbe.h - Pseudo Probe IR Helpers ------------------*- C++ -*-===// |
| 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 | // Pseudo probe IR intrinsic and dwarf discriminator manipulation routines. |
||
| 10 | // |
||
| 11 | //===----------------------------------------------------------------------===// |
||
| 12 | |||
| 13 | #ifndef LLVM_IR_PSEUDOPROBE_H |
||
| 14 | #define LLVM_IR_PSEUDOPROBE_H |
||
| 15 | |||
| 16 | #include <cassert> |
||
| 17 | #include <cstdint> |
||
| 18 | #include <limits> |
||
| 19 | #include <optional> |
||
| 20 | |||
| 21 | namespace llvm { |
||
| 22 | |||
| 23 | class Instruction; |
||
| 24 | |||
| 25 | constexpr const char *PseudoProbeDescMetadataName = "llvm.pseudo_probe_desc"; |
||
| 26 | |||
| 27 | enum class PseudoProbeReservedId { Invalid = 0, Last = Invalid }; |
||
| 28 | |||
| 29 | enum class PseudoProbeType { Block = 0, IndirectCall, DirectCall }; |
||
| 30 | |||
| 31 | enum class PseudoProbeAttributes { |
||
| 32 | Reserved = 0x1, |
||
| 33 | Sentinel = 0x2, // A place holder for split function entry address. |
||
| 34 | }; |
||
| 35 | |||
| 36 | // The saturated distrution factor representing 100% for block probes. |
||
| 37 | constexpr static uint64_t PseudoProbeFullDistributionFactor = |
||
| 38 | std::numeric_limits<uint64_t>::max(); |
||
| 39 | |||
| 40 | struct PseudoProbeDwarfDiscriminator { |
||
| 41 | public: |
||
| 42 | // The following APIs encodes/decodes per-probe information to/from a |
||
| 43 | // 32-bit integer which is organized as: |
||
| 44 | // [2:0] - 0x7, this is reserved for regular discriminator, |
||
| 45 | // see DWARF discriminator encoding rule |
||
| 46 | // [18:3] - probe id |
||
| 47 | // [25:19] - probe distribution factor |
||
| 48 | // [28:26] - probe type, see PseudoProbeType |
||
| 49 | // [31:29] - reserved for probe attributes |
||
| 50 | static uint32_t packProbeData(uint32_t Index, uint32_t Type, uint32_t Flags, |
||
| 51 | uint32_t Factor) { |
||
| 52 | assert(Index <= 0xFFFF && "Probe index too big to encode, exceeding 2^16"); |
||
| 53 | assert(Type <= 0x7 && "Probe type too big to encode, exceeding 7"); |
||
| 54 | assert(Flags <= 0x7); |
||
| 55 | assert(Factor <= 100 && |
||
| 56 | "Probe distribution factor too big to encode, exceeding 100"); |
||
| 57 | return (Index << 3) | (Factor << 19) | (Type << 26) | 0x7; |
||
| 58 | } |
||
| 59 | |||
| 60 | static uint32_t extractProbeIndex(uint32_t Value) { |
||
| 61 | return (Value >> 3) & 0xFFFF; |
||
| 62 | } |
||
| 63 | |||
| 64 | static uint32_t extractProbeType(uint32_t Value) { |
||
| 65 | return (Value >> 26) & 0x7; |
||
| 66 | } |
||
| 67 | |||
| 68 | static uint32_t extractProbeAttributes(uint32_t Value) { |
||
| 69 | return (Value >> 29) & 0x7; |
||
| 70 | } |
||
| 71 | |||
| 72 | static uint32_t extractProbeFactor(uint32_t Value) { |
||
| 73 | return (Value >> 19) & 0x7F; |
||
| 74 | } |
||
| 75 | |||
| 76 | // The saturated distrution factor representing 100% for callsites. |
||
| 77 | constexpr static uint8_t FullDistributionFactor = 100; |
||
| 78 | }; |
||
| 79 | |||
| 80 | struct PseudoProbe { |
||
| 81 | uint32_t Id; |
||
| 82 | uint32_t Type; |
||
| 83 | uint32_t Attr; |
||
| 84 | // Distribution factor that estimates the portion of the real execution count. |
||
| 85 | // A saturated distribution factor stands for 1.0 or 100%. A pesudo probe has |
||
| 86 | // a factor with the value ranged from 0.0 to 1.0. |
||
| 87 | float Factor; |
||
| 88 | }; |
||
| 89 | |||
| 90 | static inline bool isSentinelProbe(uint32_t Flags) { |
||
| 91 | return Flags & (uint32_t)PseudoProbeAttributes::Sentinel; |
||
| 92 | } |
||
| 93 | |||
| 94 | std::optional<PseudoProbe> extractProbe(const Instruction &Inst); |
||
| 95 | |||
| 96 | void setProbeDistributionFactor(Instruction &Inst, float Factor); |
||
| 97 | } // end namespace llvm |
||
| 98 | |||
| 99 | #endif // LLVM_IR_PSEUDOPROBE_H |