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 {DiagnosticInfoRef, TwineRef, ValueRef};
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 {
46 pub kind: OptimizationDiagnosticKind,
47 pub pass_name: String,
48 pub function: ValueRef,
55 impl OptimizationDiagnostic {
56 unsafe fn unpack(kind: OptimizationDiagnosticKind,
57 di: DiagnosticInfoRef)
58 -> OptimizationDiagnostic {
59 let mut function = ptr::null_mut();
63 let mut message = None;
64 let mut filename = None;
65 let pass_name = super::build_string(|pass_name|
66 message = super::build_string(|message|
67 filename = super::build_string(|filename|
68 super::LLVMRustUnpackOptimizationDiagnostic(di,
79 let mut filename = filename.unwrap_or(String::new());
80 if filename.is_empty() {
81 filename.push_str("<unknown file>");
84 OptimizationDiagnostic {
86 pass_name: pass_name.expect("got a non-UTF8 pass name from LLVM"),
91 message: message.expect("got a non-UTF8 OptimizationDiagnostic message from LLVM")
96 #[derive(Copy, Clone)]
97 pub struct InlineAsmDiagnostic {
99 pub message: TwineRef,
100 pub instruction: ValueRef,
103 impl InlineAsmDiagnostic {
104 unsafe fn unpack(di: DiagnosticInfoRef) -> InlineAsmDiagnostic {
106 let mut opt = InlineAsmDiagnostic {
108 message: ptr::null_mut(),
109 instruction: ptr::null_mut(),
112 super::LLVMRustUnpackInlineAsmDiagnostic(di,
115 &mut opt.instruction);
121 pub enum Diagnostic {
122 Optimization(OptimizationDiagnostic),
123 InlineAsm(InlineAsmDiagnostic),
125 /// LLVM has other types that we do not wrap here.
126 UnknownDiagnostic(DiagnosticInfoRef),
130 pub unsafe fn unpack(di: DiagnosticInfoRef) -> Diagnostic {
131 use super::DiagnosticKind as Dk;
132 let kind = super::LLVMRustGetDiagInfoKind(di);
135 Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)),
137 Dk::OptimizationRemark => {
138 Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di))
140 Dk::OptimizationRemarkOther => {
141 Optimization(OptimizationDiagnostic::unpack(OptimizationRemarkOther, di))
143 Dk::OptimizationRemarkMissed => {
144 Optimization(OptimizationDiagnostic::unpack(OptimizationMissed, di))
147 Dk::OptimizationRemarkAnalysis => {
148 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysis, di))
151 Dk::OptimizationRemarkAnalysisFPCommute => {
152 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisFPCommute, di))
155 Dk::OptimizationRemarkAnalysisAliasing => {
156 Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisAliasing, di))
159 Dk::OptimizationFailure => {
160 Optimization(OptimizationDiagnostic::unpack(OptimizationFailure, di))
163 _ => UnknownDiagnostic(di),