|
19 | 19 | #include "llvm/Support/CommandLine.h" |
20 | 20 | #include "llvm/Support/Debug.h" |
21 | 21 | #include "llvm/Support/LEB128.h" |
| 22 | +#include <memory> |
22 | 23 |
|
23 | 24 | #undef DEBUG_TYPE |
24 | 25 | #define DEBUG_TYPE "pseudo-probe-rewriter" |
@@ -72,23 +73,35 @@ class PseudoProbeRewriter final : public MetadataRewriter { |
72 | 73 | void parsePseudoProbe(); |
73 | 74 |
|
74 | 75 | /// PseudoProbe decoder |
75 | | - MCPseudoProbeDecoder ProbeDecoder; |
| 76 | + std::shared_ptr<MCPseudoProbeDecoder> ProbeDecoderPtr; |
76 | 77 |
|
77 | 78 | public: |
78 | 79 | PseudoProbeRewriter(BinaryContext &BC) |
79 | | - : MetadataRewriter("pseudo-probe-rewriter", BC) {} |
| 80 | + : MetadataRewriter("pseudo-probe-rewriter", BC), |
| 81 | + ProbeDecoderPtr(std::make_shared<MCPseudoProbeDecoder>()) { |
| 82 | + BC.setPseudoProbeDecoder(ProbeDecoderPtr); |
| 83 | + } |
80 | 84 |
|
| 85 | + Error preCFGInitializer() override; |
81 | 86 | Error postEmitFinalizer() override; |
| 87 | + |
| 88 | + ~PseudoProbeRewriter() override { ProbeDecoderPtr.reset(); } |
82 | 89 | }; |
83 | 90 |
|
84 | | -Error PseudoProbeRewriter::postEmitFinalizer() { |
| 91 | +Error PseudoProbeRewriter::preCFGInitializer() { |
85 | 92 | parsePseudoProbe(); |
| 93 | + |
| 94 | + return Error::success(); |
| 95 | +} |
| 96 | + |
| 97 | +Error PseudoProbeRewriter::postEmitFinalizer() { |
86 | 98 | updatePseudoProbes(); |
87 | 99 |
|
88 | 100 | return Error::success(); |
89 | 101 | } |
90 | 102 |
|
91 | 103 | void PseudoProbeRewriter::parsePseudoProbe() { |
| 104 | + MCPseudoProbeDecoder &ProbeDecoder(*ProbeDecoderPtr); |
92 | 105 | PseudoProbeDescSection = BC.getUniqueSectionByName(".pseudo_probe_desc"); |
93 | 106 | PseudoProbeSection = BC.getUniqueSectionByName(".pseudo_probe"); |
94 | 107 |
|
@@ -138,9 +151,18 @@ void PseudoProbeRewriter::parsePseudoProbe() { |
138 | 151 | ProbeDecoder.printGUID2FuncDescMap(outs()); |
139 | 152 | ProbeDecoder.printProbesForAllAddresses(outs()); |
140 | 153 | } |
| 154 | + |
| 155 | + for (const auto &[GUID, FuncDesc] : ProbeDecoder.getGUID2FuncDescMap()) { |
| 156 | + if (!FuncStartAddrs.contains(GUID)) |
| 157 | + continue; |
| 158 | + BinaryFunction *BF = BC.getBinaryFunctionAtAddress(FuncStartAddrs[GUID]); |
| 159 | + assert(BF); |
| 160 | + BF->setGUID(GUID); |
| 161 | + } |
141 | 162 | } |
142 | 163 |
|
143 | 164 | void PseudoProbeRewriter::updatePseudoProbes() { |
| 165 | + MCPseudoProbeDecoder &ProbeDecoder(*ProbeDecoderPtr); |
144 | 166 | // check if there is pseudo probe section decoded |
145 | 167 | if (ProbeDecoder.getAddress2ProbesMap().empty()) |
146 | 168 | return; |
@@ -241,6 +263,7 @@ void PseudoProbeRewriter::updatePseudoProbes() { |
241 | 263 | } |
242 | 264 |
|
243 | 265 | void PseudoProbeRewriter::encodePseudoProbes() { |
| 266 | + MCPseudoProbeDecoder &ProbeDecoder(*ProbeDecoderPtr); |
244 | 267 | // Buffer for new pseudo probes section |
245 | 268 | SmallString<8> Contents; |
246 | 269 | MCDecodedPseudoProbe *LastProbe = nullptr; |
|
0 commit comments