// Copyright 2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! LLVM diagnostic reports. pub use self::OptimizationDiagnosticKind::*; pub use self::Diagnostic::*; use libc::{c_char, c_uint}; use std::ptr; use {ValueRef, TwineRef, DebugLocRef, DiagnosticInfoRef}; #[derive(Copy, Clone)] pub enum OptimizationDiagnosticKind { OptimizationRemark, OptimizationMissed, OptimizationAnalysis, OptimizationFailure, } impl OptimizationDiagnosticKind { pub fn describe(self) -> &'static str { match self { OptimizationRemark => "remark", OptimizationMissed => "missed", OptimizationAnalysis => "analysis", OptimizationFailure => "failure", } } } pub struct OptimizationDiagnostic { pub kind: OptimizationDiagnosticKind, pub pass_name: *const c_char, pub function: ValueRef, pub debug_loc: DebugLocRef, pub message: TwineRef, } impl OptimizationDiagnostic { unsafe fn unpack(kind: OptimizationDiagnosticKind, di: DiagnosticInfoRef) -> OptimizationDiagnostic { let mut opt = OptimizationDiagnostic { kind: kind, pass_name: ptr::null(), function: ptr::null_mut(), debug_loc: ptr::null_mut(), message: ptr::null_mut(), }; super::LLVMUnpackOptimizationDiagnostic(di, &mut opt.pass_name, &mut opt.function, &mut opt.debug_loc, &mut opt.message); opt } } #[derive(Copy, Clone)] pub struct InlineAsmDiagnostic { pub cookie: c_uint, pub message: TwineRef, pub instruction: ValueRef, } impl InlineAsmDiagnostic { unsafe fn unpack(di: DiagnosticInfoRef) -> InlineAsmDiagnostic { let mut opt = InlineAsmDiagnostic { cookie: 0, message: ptr::null_mut(), instruction: ptr::null_mut(), }; super::LLVMUnpackInlineAsmDiagnostic(di, &mut opt.cookie, &mut opt.message, &mut opt.instruction); opt } } pub enum Diagnostic { Optimization(OptimizationDiagnostic), InlineAsm(InlineAsmDiagnostic), /// LLVM has other types that we do not wrap here. UnknownDiagnostic(DiagnosticInfoRef), } impl Diagnostic { pub unsafe fn unpack(di: DiagnosticInfoRef) -> Diagnostic { let kind = super::LLVMGetDiagInfoKind(di); match kind { super::DK_InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)), super::DK_OptimizationRemark => Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di)), super::DK_OptimizationRemarkMissed => Optimization(OptimizationDiagnostic::unpack(OptimizationMissed, di)), super::DK_OptimizationRemarkAnalysis => Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysis, di)), super::DK_OptimizationFailure => Optimization(OptimizationDiagnostic::unpack(OptimizationFailure, di)), _ => UnknownDiagnostic(di) } } }