LLVM 22.0.0git
RemarkLinker.h
Go to the documentation of this file.
1//===-- llvm/Remarks/RemarkLinker.h -----------------------------*- 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// This file provides an interface to link together multiple remark files.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_REMARKS_REMARKLINKER_H
14#define LLVM_REMARKS_REMARKLINKER_H
15
16#include "llvm/Remarks/Remark.h"
20#include "llvm/Support/Error.h"
21#include <memory>
22#include <optional>
23#include <set>
24
25namespace llvm {
26
27namespace object {
28class ObjectFile;
29}
30
31namespace remarks {
32
34private:
35 /// Compare through the pointers.
36 struct RemarkPtrCompare {
37 bool operator()(const std::unique_ptr<Remark> &LHS,
38 const std::unique_ptr<Remark> &RHS) const {
39 assert(LHS && RHS && "Invalid pointers to compare.");
40 return *LHS < *RHS;
41 };
42 };
43
44 /// The main string table for the remarks.
45 /// Note: all remarks should use the strings from this string table to avoid
46 /// dangling references.
47 StringTable StrTab;
48
49 /// A set holding unique remarks.
50 /// FIXME: std::set is probably not the most appropriate data structure here.
51 /// Due to the limitation of having a move-only key, there isn't another
52 /// obvious choice for now.
53 std::set<std::unique_ptr<Remark>, RemarkPtrCompare> Remarks;
54
55 /// A path to append before the external file path found in remark metadata.
56 std::optional<std::string> PrependPath;
57
58 /// If true, keep all remarks, otherwise only keep remarks with valid debug
59 /// locations.
60 bool KeepAllRemarks = true;
61
62 /// Keep this remark. If it's already in the set, discard it.
63 Remark &keep(std::unique_ptr<Remark> Remark);
64
65 /// Returns true if \p R should be kept. If KeepAllRemarks is false, only
66 /// return true if \p R has a valid debug location.
67 bool shouldKeepRemark(const Remark &R) {
68 return KeepAllRemarks ? true : R.Loc.has_value();
69 }
70
71public:
72 /// Set a path to prepend to the external file path.
74
75 /// Set KeepAllRemarks to \p B.
76 void setKeepAllRemarks(bool B) { KeepAllRemarks = B; }
77
78 /// Link the remarks found in \p Buffer.
79 /// If \p RemarkFormat is not provided, try to deduce it from the metadata in
80 /// \p Buffer.
81 /// \p Buffer can be either a standalone remark container or just
82 /// metadata. This takes care of uniquing and merging the remarks.
83 LLVM_ABI Error link(StringRef Buffer, Format RemarkFormat = Format::Auto);
84
85 /// Link the remarks found in \p Obj by looking for the right section and
86 /// calling the method above.
88 Format RemarkFormat = Format::Auto);
89
90 /// Serialize the linked remarks to the stream \p OS, using the format \p
91 /// RemarkFormat.
92 /// This clears internal state such as the string table.
93 /// Note: this implies that the serialization mode is standalone.
95
96 /// Check whether there are any remarks linked.
97 bool empty() const { return Remarks.empty(); }
98
99 /// Return a collection of the linked unique remarks to iterate on.
100 /// Ex:
101 /// for (const Remark &R : RL.remarks() { [...] }
102 using iterator = pointee_iterator<decltype(Remarks)::const_iterator>;
103
105 return {Remarks.begin(), Remarks.end()};
106 }
107};
108
109/// Returns a buffer with the contents of the remarks section depending on the
110/// format of the file. If the section doesn't exist, this returns an empty
111/// optional.
114
115} // end namespace remarks
116} // end namespace llvm
117
118#endif // LLVM_REMARKS_REMARKLINKER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
Value * RHS
Value * LHS
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Tagged union holding either a T or a Error.
Definition Error.h:485
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
A range adaptor for a pair of iterators.
This class is the base class for all object file types.
Definition ObjectFile.h:231
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
Format
The format used for serializing/deserializing remarks.
LLVM_ABI Expected< std::optional< StringRef > > getRemarksSectionContents(const object::ObjectFile &Obj)
Returns a buffer with the contents of the remarks section depending on the format of the file.
This is an optimization pass for GlobalISel generic memory operations.
cl::opt< std::string > RemarksFormat("lto-pass-remarks-format", cl::desc("The format used for serializing remarks (default: YAML)"), cl::value_desc("format"), cl::init("yaml"))
An iterator type that allows iterating over the pointees via some other iterator.
Definition iterator.h:324
LLVM_ABI Error link(StringRef Buffer, Format RemarkFormat=Format::Auto)
Link the remarks found in Buffer.
LLVM_ABI void setExternalFilePrependPath(StringRef PrependPath)
Set a path to prepend to the external file path.
pointee_iterator< decltype(Remarks)::const_iterator > iterator
Return a collection of the linked unique remarks to iterate on.
LLVM_ABI Error serialize(raw_ostream &OS, Format RemarksFormat) const
Serialize the linked remarks to the stream OS, using the format RemarkFormat.
bool empty() const
Check whether there are any remarks linked.
void setKeepAllRemarks(bool B)
Set KeepAllRemarks to B.
iterator_range< iterator > remarks() const
A remark type used for both emission and parsing.
Definition Remark.h:98
The string table used for serializing remarks.