2014-09-12 08:17:58 -07:00
|
|
|
// 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 <LICENSE-APACHE or
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
|
// except according to those terms.
|
|
|
|
|
|
|
|
|
|
//! LLVM diagnostic reports.
|
|
|
|
|
|
2014-11-06 00:05:53 -08:00
|
|
|
pub use self::OptimizationDiagnosticKind::*;
|
|
|
|
|
pub use self::Diagnostic::*;
|
|
|
|
|
|
2016-11-28 15:15:51 +01:00
|
|
|
use libc::c_uint;
|
2018-07-10 13:28:39 +03:00
|
|
|
use value::Value;
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2018-07-13 13:59:41 +03:00
|
|
|
use super::{DiagnosticInfo, Twine};
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2015-03-30 09:38:44 -04:00
|
|
|
#[derive(Copy, Clone)]
|
2014-09-12 08:17:58 -07:00
|
|
|
pub enum OptimizationDiagnosticKind {
|
|
|
|
|
OptimizationRemark,
|
|
|
|
|
OptimizationMissed,
|
|
|
|
|
OptimizationAnalysis,
|
2016-08-02 02:35:09 +03:00
|
|
|
OptimizationAnalysisFPCommute,
|
|
|
|
|
OptimizationAnalysisAliasing,
|
2014-09-12 08:17:58 -07:00
|
|
|
OptimizationFailure,
|
2016-08-02 02:35:09 +03:00
|
|
|
OptimizationRemarkOther,
|
2014-09-12 08:17:58 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl OptimizationDiagnosticKind {
|
|
|
|
|
pub fn describe(self) -> &'static str {
|
|
|
|
|
match self {
|
2016-10-22 18:37:35 +05:30
|
|
|
OptimizationRemark | OptimizationRemarkOther => "remark",
|
2014-09-12 08:17:58 -07:00
|
|
|
OptimizationMissed => "missed",
|
|
|
|
|
OptimizationAnalysis => "analysis",
|
2016-08-02 02:35:09 +03:00
|
|
|
OptimizationAnalysisFPCommute => "floating-point",
|
|
|
|
|
OptimizationAnalysisAliasing => "aliasing",
|
2014-09-12 08:17:58 -07:00
|
|
|
OptimizationFailure => "failure",
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
pub struct OptimizationDiagnostic<'ll> {
|
2014-09-12 08:17:58 -07:00
|
|
|
pub kind: OptimizationDiagnosticKind,
|
2016-11-28 15:15:51 +01:00
|
|
|
pub pass_name: String,
|
2018-07-10 13:28:39 +03:00
|
|
|
pub function: &'ll Value,
|
2017-07-21 14:29:23 +02:00
|
|
|
pub line: c_uint,
|
|
|
|
|
pub column: c_uint,
|
|
|
|
|
pub filename: String,
|
2016-11-24 17:33:47 +01:00
|
|
|
pub message: String,
|
2014-09-12 08:17:58 -07:00
|
|
|
}
|
|
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
impl OptimizationDiagnostic<'ll> {
|
|
|
|
|
unsafe fn unpack(
|
|
|
|
|
kind: OptimizationDiagnosticKind,
|
2018-07-13 13:59:41 +03:00
|
|
|
di: &'ll DiagnosticInfo,
|
2018-07-10 13:28:39 +03:00
|
|
|
) -> Self {
|
|
|
|
|
let mut function = None;
|
2017-07-21 14:29:23 +02:00
|
|
|
let mut line = 0;
|
|
|
|
|
let mut column = 0;
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2016-11-28 15:15:51 +01:00
|
|
|
let mut message = None;
|
2017-07-21 14:29:23 +02:00
|
|
|
let mut filename = None;
|
2016-11-28 15:15:51 +01:00
|
|
|
let pass_name = super::build_string(|pass_name|
|
|
|
|
|
message = super::build_string(|message|
|
2017-07-21 14:29:23 +02:00
|
|
|
filename = super::build_string(|filename|
|
|
|
|
|
super::LLVMRustUnpackOptimizationDiagnostic(di,
|
|
|
|
|
pass_name,
|
|
|
|
|
&mut function,
|
|
|
|
|
&mut line,
|
|
|
|
|
&mut column,
|
|
|
|
|
filename,
|
|
|
|
|
message)
|
2018-07-13 14:43:12 +03:00
|
|
|
).ok()
|
|
|
|
|
).ok()
|
|
|
|
|
).ok();
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2017-07-21 14:29:23 +02:00
|
|
|
let mut filename = filename.unwrap_or(String::new());
|
|
|
|
|
if filename.is_empty() {
|
|
|
|
|
filename.push_str("<unknown file>");
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-24 17:33:47 +01:00
|
|
|
OptimizationDiagnostic {
|
2017-08-06 22:54:09 -07:00
|
|
|
kind,
|
2016-11-28 15:15:51 +01:00
|
|
|
pass_name: pass_name.expect("got a non-UTF8 pass name from LLVM"),
|
2018-07-10 13:28:39 +03:00
|
|
|
function: function.unwrap(),
|
2017-08-06 22:54:09 -07:00
|
|
|
line,
|
|
|
|
|
column,
|
|
|
|
|
filename,
|
2016-11-24 17:33:47 +01:00
|
|
|
message: message.expect("got a non-UTF8 OptimizationDiagnostic message from LLVM")
|
|
|
|
|
}
|
2014-09-12 08:17:58 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-30 09:38:44 -04:00
|
|
|
#[derive(Copy, Clone)]
|
2018-07-10 13:28:39 +03:00
|
|
|
pub struct InlineAsmDiagnostic<'ll> {
|
2015-01-22 19:43:39 +01:00
|
|
|
pub cookie: c_uint,
|
2018-07-13 13:59:41 +03:00
|
|
|
pub message: &'ll Twine,
|
2018-07-10 13:28:39 +03:00
|
|
|
pub instruction: &'ll Value,
|
2015-01-22 19:43:39 +01:00
|
|
|
}
|
|
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
impl InlineAsmDiagnostic<'ll> {
|
2018-07-13 13:59:41 +03:00
|
|
|
unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
|
2018-07-10 13:28:39 +03:00
|
|
|
let mut cookie = 0;
|
2018-07-13 13:59:41 +03:00
|
|
|
let mut message = None;
|
2018-07-10 13:28:39 +03:00
|
|
|
let mut instruction = None;
|
|
|
|
|
|
|
|
|
|
super::LLVMRustUnpackInlineAsmDiagnostic(
|
|
|
|
|
di,
|
|
|
|
|
&mut cookie,
|
|
|
|
|
&mut message,
|
|
|
|
|
&mut instruction,
|
|
|
|
|
);
|
2015-01-22 19:43:39 +01:00
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
InlineAsmDiagnostic {
|
|
|
|
|
cookie,
|
2018-07-13 13:59:41 +03:00
|
|
|
message: message.unwrap(),
|
2018-07-10 13:28:39 +03:00
|
|
|
instruction: instruction.unwrap(),
|
|
|
|
|
}
|
2015-01-22 19:43:39 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
pub enum Diagnostic<'ll> {
|
|
|
|
|
Optimization(OptimizationDiagnostic<'ll>),
|
|
|
|
|
InlineAsm(InlineAsmDiagnostic<'ll>),
|
2018-07-13 13:59:41 +03:00
|
|
|
PGO(&'ll DiagnosticInfo),
|
2018-07-17 16:20:51 -07:00
|
|
|
Linker(&'ll DiagnosticInfo),
|
2014-09-12 08:17:58 -07:00
|
|
|
|
|
|
|
|
/// LLVM has other types that we do not wrap here.
|
2018-07-13 13:59:41 +03:00
|
|
|
UnknownDiagnostic(&'ll DiagnosticInfo),
|
2014-09-12 08:17:58 -07:00
|
|
|
}
|
|
|
|
|
|
2018-07-10 13:28:39 +03:00
|
|
|
impl Diagnostic<'ll> {
|
2018-07-13 13:59:41 +03:00
|
|
|
pub unsafe fn unpack(di: &'ll DiagnosticInfo) -> Self {
|
2016-08-02 02:35:09 +03:00
|
|
|
use super::DiagnosticKind as Dk;
|
|
|
|
|
let kind = super::LLVMRustGetDiagInfoKind(di);
|
2014-09-12 08:17:58 -07:00
|
|
|
|
|
|
|
|
match kind {
|
2016-08-02 02:35:09 +03:00
|
|
|
Dk::InlineAsm => InlineAsm(InlineAsmDiagnostic::unpack(di)),
|
2015-01-22 19:43:39 +01:00
|
|
|
|
2016-08-02 02:35:09 +03:00
|
|
|
Dk::OptimizationRemark => {
|
2016-05-29 14:57:34 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationRemark, di))
|
|
|
|
|
}
|
2016-08-02 02:35:09 +03:00
|
|
|
Dk::OptimizationRemarkOther => {
|
|
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationRemarkOther, di))
|
|
|
|
|
}
|
|
|
|
|
Dk::OptimizationRemarkMissed => {
|
2016-05-29 14:57:34 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationMissed, di))
|
|
|
|
|
}
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2016-08-02 02:35:09 +03:00
|
|
|
Dk::OptimizationRemarkAnalysis => {
|
2016-05-29 14:57:34 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysis, di))
|
|
|
|
|
}
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2016-08-02 02:35:09 +03:00
|
|
|
Dk::OptimizationRemarkAnalysisFPCommute => {
|
2016-10-22 18:37:35 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisFPCommute, di))
|
2016-08-02 02:35:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dk::OptimizationRemarkAnalysisAliasing => {
|
2016-10-22 18:37:35 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationAnalysisAliasing, di))
|
2016-08-02 02:35:09 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dk::OptimizationFailure => {
|
2016-05-29 14:57:34 +05:30
|
|
|
Optimization(OptimizationDiagnostic::unpack(OptimizationFailure, di))
|
|
|
|
|
}
|
2014-09-12 08:17:58 -07:00
|
|
|
|
2018-03-12 18:11:59 +01:00
|
|
|
Dk::PGOProfile => {
|
|
|
|
|
PGO(di)
|
|
|
|
|
}
|
2018-07-17 16:20:51 -07:00
|
|
|
Dk::Linker => {
|
|
|
|
|
Linker(di)
|
|
|
|
|
}
|
2018-03-12 18:11:59 +01:00
|
|
|
|
2016-05-29 14:57:34 +05:30
|
|
|
_ => UnknownDiagnostic(di),
|
2014-09-12 08:17:58 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|