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 24 namespace llvm { 25 /// Streamer for LLVM remarks which has logic for dealing with DiagnosticInfo 26 /// objects. 27 class 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 34 public: LLVMRemarkStreamer(remarks::RemarkStreamer & RS)35 LLVMRemarkStreamer(remarks::RemarkStreamer &RS) : RS(RS) {} 36 /// Emit a diagnostic through the streamer. 37 void emit(const DiagnosticInfoOptimizationBase &Diag); 38 }; 39 40 template <typename ThisError> 41 struct LLVMRemarkSetupErrorInfo : public ErrorInfo<ThisError> { 42 std::string Msg; 43 std::error_code EC; 44 LLVMRemarkSetupErrorInfoLLVMRemarkSetupErrorInfo45 LLVMRemarkSetupErrorInfo(Error E) { 46 handleAllErrors(std::move(E), [&](const ErrorInfoBase &EIB) { 47 Msg = EIB.message(); 48 EC = EIB.convertToErrorCode(); 49 }); 50 } 51 logLLVMRemarkSetupErrorInfo52 void log(raw_ostream &OS) const override { OS << Msg; } convertToErrorCodeLLVMRemarkSetupErrorInfo53 std::error_code convertToErrorCode() const override { return EC; } 54 }; 55 56 struct LLVMRemarkSetupFileError 57 : LLVMRemarkSetupErrorInfo<LLVMRemarkSetupFileError> { 58 static char ID; 59 using LLVMRemarkSetupErrorInfo< 60 LLVMRemarkSetupFileError>::LLVMRemarkSetupErrorInfo; 61 }; 62 63 struct LLVMRemarkSetupPatternError 64 : LLVMRemarkSetupErrorInfo<LLVMRemarkSetupPatternError> { 65 static char ID; 66 using LLVMRemarkSetupErrorInfo< 67 LLVMRemarkSetupPatternError>::LLVMRemarkSetupErrorInfo; 68 }; 69 70 struct 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. 78 Expected<std::unique_ptr<ToolOutputFile>> 79 setupLLVMOptimizationRemarks(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. 87 Error 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