X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc_llvm%2Fdiagnostic.rs;h=aca4d265bc963d12ec40d18a2c072c9fd9efac9f;hb=52c74e63dacd49017b19330e0cbecbac0a3fe62e;hp=464f9f98e7ffccae02061d41c445edf02cdac77c;hpb=8e83af6e879535c33fd83d247d16619e39e0b951;p=rust.git diff --git a/src/librustc_llvm/diagnostic.rs b/src/librustc_llvm/diagnostic.rs index 464f9f98e7f..aca4d265bc9 100644 --- a/src/librustc_llvm/diagnostic.rs +++ b/src/librustc_llvm/diagnostic.rs @@ -13,7 +13,8 @@ pub use self::OptimizationDiagnosticKind::*; pub use self::Diagnostic::*; -use libc::c_char; +use libc::{c_char, c_uint}; +use std::ptr; use {ValueRef, TwineRef, DebugLocRef, DiagnosticInfoRef}; @@ -36,6 +37,8 @@ pub fn describe(self) -> &'static str { } } +#[allow(raw_pointer_derive)] +#[derive(Copy)] pub struct OptimizationDiagnostic { pub kind: OptimizationDiagnosticKind, pub pass_name: *const c_char, @@ -44,18 +47,16 @@ pub struct OptimizationDiagnostic { pub message: TwineRef, } -impl Copy for OptimizationDiagnostic {} - impl OptimizationDiagnostic { unsafe fn unpack(kind: OptimizationDiagnosticKind, di: DiagnosticInfoRef) -> OptimizationDiagnostic { let mut opt = OptimizationDiagnostic { kind: kind, - pass_name: 0 as *const c_char, - function: 0 as ValueRef, - debug_loc: 0 as DebugLocRef, - message: 0 as TwineRef, + pass_name: ptr::null(), + function: ptr::null_mut(), + debug_loc: ptr::null_mut(), + message: ptr::null_mut(), }; super::LLVMUnpackOptimizationDiagnostic(di, @@ -68,9 +69,37 @@ unsafe fn unpack(kind: OptimizationDiagnosticKind, di: DiagnosticInfoRef) } } +pub struct InlineAsmDiagnostic { + pub cookie: c_uint, + pub message: TwineRef, + pub instruction: ValueRef, +} + +impl Copy for InlineAsmDiagnostic {} + +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 + } +} + #[derive(Copy)] pub enum Diagnostic { Optimization(OptimizationDiagnostic), + InlineAsm(InlineAsmDiagnostic), /// LLVM has other types that we do not wrap here. UnknownDiagnostic(DiagnosticInfoRef), @@ -81,6 +110,9 @@ 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)),