1//===- llvm/IR/LLVMRemarkStreamer.h - Streamer for LLVM remarks--*- 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 implements the conversion between IR Diagnostics and
10// serializable remarks::Remark objects.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_LLVMREMARKSTREAMER_H
15#define LLVM_IR_LLVMREMARKSTREAMER_H
16
17#include "llvm/IR/DiagnosticInfo.h"
18#include "llvm/Remarks/RemarkStreamer.h"
19#include "llvm/Support/Error.h"
20#include "llvm/Support/ToolOutputFile.h"
21#include <memory>
22#include <string>
23
24namespace llvm {
25/// Streamer for LLVM remarks which has logic for dealing with DiagnosticInfo
26/// objects.
27class LLVMRemarkStreamer {
28 remarks::RemarkStreamer &RS;
29 /// Convert diagnostics into remark objects.
30 /// The lifetime of the members of the result is bound to the lifetime of
31 /// the LLVM diagnostics.
32 remarks::Remark toRemark(const DiagnosticInfoOptimizationBase &Diag) const;
33
34public:
35 LLVMRemarkStreamer(remarks::RemarkStreamer &RS) : RS(RS) {}
36 /// Emit a diagnostic through the streamer.
37 void emit(const DiagnosticInfoOptimizationBase &Diag);
38};
39
40template <typename ThisError>
41struct LLVMRemarkSetupErrorInfo : public ErrorInfo<ThisError> {
42 std::string Msg;
43 std::error_code EC;
44
45 LLVMRemarkSetupErrorInfo(Error E) {
46 handleAllErrors(std::move(E), [&](const ErrorInfoBase &EIB) {
47 Msg = EIB.message();
48 EC = EIB.convertToErrorCode();
49 });
50 }
51
52 void log(raw_ostream &OS) const override { OS << Msg; }
53 std::error_code convertToErrorCode() const override { return EC; }
54};
55
56struct LLVMRemarkSetupFileError
57 : LLVMRemarkSetupErrorInfo<LLVMRemarkSetupFileError> {
58 static char ID;
59 using LLVMRemarkSetupErrorInfo<
60 LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo;
61};
62
63struct LLVMRemarkSetupPatternError
64 : LLVMRemarkSetupErrorInfo<LLVMRemarkSetupPatternError> {
65 static char ID;
66 using LLVMRemarkSetupErrorInfo<
67 LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo;
68};
69
70struct LLVMRemarkSetupFormatError
71 : LLVMRemarkSetupErrorInfo<LLVMRemarkSetupFormatError> {
72 static char ID;
73 using LLVMRemarkSetupErrorInfo<
74 LLVMRemarkSetupFormatError>::LLVMRemarkSetupErrorInfo;
75};
76
77/// Setup optimization remarks that output to a file.
78Expected<std::unique_ptr<ToolOutputFile>>
79setupLLVMOptimizationRemarks(LLVMContext &Context, StringRef RemarksFilename,
80 StringRef RemarksPasses, StringRef RemarksFormat,
81 bool RemarksWithHotness,
82 Optional<uint64_t> RemarksHotnessThreshold = 0);
83
84/// Setup optimization remarks that output directly to a raw_ostream.
85/// \p OS is managed by the caller and should be open for writing as long as \p
86/// Context is streaming remarks to it.
87Error setupLLVMOptimizationRemarks(
88 LLVMContext &Context, raw_ostream &OS, StringRef RemarksPasses,
89 StringRef RemarksFormat, bool RemarksWithHotness,
90 Optional<uint64_t> RemarksHotnessThreshold = 0);
91
92} // end namespace llvm
93
94#endif // LLVM_IR_LLVMREMARKSTREAMER_H
95