1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! LLVM diagnostic reports.
13 pub use self::OptimizationDiagnosticKind::*;
14 pub use self::Diagnostic::*;
19 use super::{DiagnosticInfo, Twine};
21 #[derive(Copy, Clone)]
22 pub enum OptimizationDiagnosticKind {
26 OptimizationAnalysisFPCommute,
27 OptimizationAnalysisAliasing,
29 OptimizationRemarkOther,
32 impl OptimizationDiagnosticKind {
33 pub fn describe(self) -> &'static str {
35 OptimizationRemark | OptimizationRemarkOther => "remark",
36 OptimizationMissed => "missed",
37 OptimizationAnalysis => "analysis",
38 OptimizationAnalysisFPCommute => "floating-point",
39 OptimizationAnalysisAliasing => "aliasing",
40 OptimizationFailure => "failure",
45 pub struct OptimizationDiagnostic<'ll> {
46 pub kind: OptimizationDiagnosticKind,
47 pub pass_name: String,
48 pub function: &'ll Value,
55 impl OptimizationDiagnostic<'ll> {
57 kind: OptimizationDiagnosticKind,
58 di: &'ll DiagnosticInfo,
60 let mut function = None;
64 let mut message = None;
65 let mut filename = None;
66 let pass_name = super::build_string(|pass_name|
67 message = super::build_string(|message|
68 filename = super::build_string(|filename|
69 super::LLVMRustUnpackOptimizationDiagnostic(di,
80 let mut filename = filename.unwrap_or(String::new());
81 if filename.is_empty() {
82 filename.push_str("<unknown file>");
85 OptimizationDiagnostic {
87 pass_name: pass_name.expect("got a non-UTF8 pass name from LLVM"),
88 function: function.unwrap(),
92 message: message.expect("got a non-UTF8 OptimizationDiagnostic message from LLVM")
97 #[derive(Copy, Clone)]
98 pub struct InlineAsmDiagnostic<'ll> {
100 pub message: &'ll Twine,
101 pub instruction: &'ll Value,
104 impl InlineAsmDiagnostic<'ll> {
105 unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
107 let mut message = None;
108 let mut instruction = None;
110 super::LLVMRustUnpackInlineAsmDiagnostic(
117 InlineAsmDiagnostic {
119 message: message.unwrap(),
120 instruction: instruction.unwrap(),
125 pub enum Diagnostic<'ll> {
126 Optimization(OptimizationDiagnostic<'ll>),
127 InlineAsm(InlineAsmDiagnostic<'ll>),
128 PGO(&'ll DiagnosticInfo),
129 Linker(&'ll DiagnosticInfo),
131 /// LLVM has other types that we do not wrap here.
132 UnknownDiagnostic(&'ll DiagnosticInfo),
135 impl Diagnostic<'ll> {
136 pub unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
137 use super::DiagnosticKind as Dk;
138 let kind = super::LLVMRustGetDiagInfoKind(di);
141 Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)),
143 Dk::OptimizationRemark => {
144 Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di))
146 Dk::OptimizationRemarkOther => {
147 Optimization(OptimizationDiagnostic::unpack(OptimizationRemarkOther, di))
149 Dk::OptimizationRemarkMissed => {
150 Optimization(OptimizationDiagnostic::unpack(OptimizationMissed, di))
153 Dk::OptimizationRemarkAnalysis => {
154 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysis, di))
157 Dk::OptimizationRemarkAnalysisFPCommute => {
158 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisFPCommute, di))
161 Dk::OptimizationRemarkAnalysisAliasing => {
162 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisAliasing, di))
165 Dk::OptimizationFailure => {
166 Optimization(OptimizationDiagnostic::unpack(OptimizationFailure, di))
176 _ => UnknownDiagnostic(di),