1 //! LLVM diagnostic reports.
3 pub use self::Diagnostic::*;
4 pub use self::OptimizationDiagnosticKind::*;
6 use crate::value::Value;
9 use super::{DiagnosticInfo, Twine};
11 #[derive(Copy, Clone)]
12 pub enum OptimizationDiagnosticKind {
16 OptimizationAnalysisFPCommute,
17 OptimizationAnalysisAliasing,
19 OptimizationRemarkOther,
22 impl OptimizationDiagnosticKind {
23 pub fn describe(self) -> &'static str {
25 OptimizationRemark | OptimizationRemarkOther => "remark",
26 OptimizationMissed => "missed",
27 OptimizationAnalysis => "analysis",
28 OptimizationAnalysisFPCommute => "floating-point",
29 OptimizationAnalysisAliasing => "aliasing",
30 OptimizationFailure => "failure",
35 pub struct OptimizationDiagnostic<'ll> {
36 pub kind: OptimizationDiagnosticKind,
37 pub pass_name: String,
38 pub function: &'ll Value,
45 impl OptimizationDiagnostic<'ll> {
46 unsafe fn unpack(kind: OptimizationDiagnosticKind, di: &'ll DiagnosticInfo) -> Self {
47 let mut function = None;
51 let mut message = None;
52 let mut filename = None;
53 let pass_name = super::build_string(|pass_name| {
54 message = super::build_string(|message| {
55 filename = super::build_string(|filename| {
56 super::LLVMRustUnpackOptimizationDiagnostic(
72 let mut filename = filename.unwrap_or_default();
73 if filename.is_empty() {
74 filename.push_str("<unknown file>");
77 OptimizationDiagnostic {
79 pass_name: pass_name.expect("got a non-UTF8 pass name from LLVM"),
80 function: function.unwrap(),
84 message: message.expect("got a non-UTF8 OptimizationDiagnostic message from LLVM"),
89 #[derive(Copy, Clone)]
90 pub struct InlineAsmDiagnostic<'ll> {
92 pub message: &'ll Twine,
93 pub instruction: Option<&'ll Value>,
96 impl InlineAsmDiagnostic<'ll> {
97 unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
99 let mut message = None;
100 let mut instruction = None;
102 super::LLVMRustUnpackInlineAsmDiagnostic(di, &mut cookie, &mut message, &mut instruction);
104 InlineAsmDiagnostic { cookie, message: message.unwrap(), instruction }
108 pub enum Diagnostic<'ll> {
109 Optimization(OptimizationDiagnostic<'ll>),
110 InlineAsm(InlineAsmDiagnostic<'ll>),
111 PGO(&'ll DiagnosticInfo),
112 Linker(&'ll DiagnosticInfo),
114 /// LLVM has other types that we do not wrap here.
115 UnknownDiagnostic(&'ll DiagnosticInfo),
118 impl Diagnostic<'ll> {
119 pub unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
120 use super::DiagnosticKind as Dk;
121 let kind = super::LLVMRustGetDiagInfoKind(di);
124 Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)),
126 Dk::OptimizationRemark => {
127 Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di))
129 Dk::OptimizationRemarkOther => {
130 Optimization(OptimizationDiagnostic::unpack(OptimizationRemarkOther, di))
132 Dk::OptimizationRemarkMissed => {
133 Optimization(OptimizationDiagnostic::unpack(OptimizationMissed, di))
136 Dk::OptimizationRemarkAnalysis => {
137 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysis, di))
140 Dk::OptimizationRemarkAnalysisFPCommute => {
141 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisFPCommute, di))
144 Dk::OptimizationRemarkAnalysisAliasing => {
145 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisAliasing, di))
148 Dk::OptimizationFailure => {
149 Optimization(OptimizationDiagnostic::unpack(OptimizationFailure, di))
152 Dk::PGOProfile => PGO(di),
153 Dk::Linker => Linker(di),
155 _ => UnknownDiagnostic(di),