From 730400167ad2ce88bb48af3f36f3443ea4493d50 Mon Sep 17 00:00:00 2001 From: Robin Kruppe Date: Thu, 24 Nov 2016 17:33:47 +0100 Subject: [PATCH] Support LLVM 4.0 in OptimizationDiagnostic FFI - getMsg() changed to return std::string by-value. Fix: copy the data to a rust String during unpacking. - getPassName() changed to return StringRef --- src/librustc_llvm/diagnostic.rs | 35 +++++++++++++++++--------------- src/librustc_llvm/ffi.rs | 2 +- src/librustc_trans/back/write.rs | 2 +- src/rustllvm/RustWrapper.cpp | 9 ++++++-- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/librustc_llvm/diagnostic.rs b/src/librustc_llvm/diagnostic.rs index 8767f03b3e756..e11274f2064dd 100644 --- a/src/librustc_llvm/diagnostic.rs +++ b/src/librustc_llvm/diagnostic.rs @@ -48,29 +48,32 @@ pub struct OptimizationDiagnostic { pub pass_name: *const c_char, pub function: ValueRef, pub debug_loc: DebugLocRef, - pub message: TwineRef, + pub message: String, } impl OptimizationDiagnostic { unsafe fn unpack(kind: OptimizationDiagnosticKind, di: DiagnosticInfoRef) -> OptimizationDiagnostic { - - let mut opt = OptimizationDiagnostic { + let mut pass_name = ptr::null(); + let mut function = ptr::null_mut(); + let mut debug_loc = ptr::null_mut(); + + let message = super::build_string(|message| + super::LLVMRustUnpackOptimizationDiagnostic(di, + &mut pass_name, + &mut function, + &mut debug_loc, + message) + ); + + OptimizationDiagnostic { kind: kind, - pass_name: ptr::null(), - function: ptr::null_mut(), - debug_loc: ptr::null_mut(), - message: ptr::null_mut(), - }; - - super::LLVMRustUnpackOptimizationDiagnostic(di, - &mut opt.pass_name, - &mut opt.function, - &mut opt.debug_loc, - &mut opt.message); - - opt + pass_name: pass_name, + function: function, + debug_loc: debug_loc, + message: message.expect("got a non-UTF8 OptimizationDiagnostic message from LLVM") + } } } diff --git a/src/librustc_llvm/ffi.rs b/src/librustc_llvm/ffi.rs index 470e8d1fd4578..15bca0207c707 100644 --- a/src/librustc_llvm/ffi.rs +++ b/src/librustc_llvm/ffi.rs @@ -1823,7 +1823,7 @@ extern "C" { pass_name_out: *mut *const c_char, function_out: *mut ValueRef, debugloc_out: *mut DebugLocRef, - message_out: *mut TwineRef); + message_out: RustStringRef); pub fn LLVMRustUnpackInlineAsmDiagnostic(DI: DiagnosticInfoRef, cookie_out: *mut c_uint, message_out: *mut TwineRef, diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index 01eea08c50bc5..029930472586e 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -417,7 +417,7 @@ unsafe extern "C" fn diagnostic_handler(info: DiagnosticInfoRef, user: *mut c_vo opt.kind.describe(), pass_name, if loc.is_empty() { "[unknown]" } else { &*loc }, - llvm::twine_to_string(opt.message))); + opt.message)); } } diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index b035e134e37d5..7cde282444d50 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -871,16 +871,21 @@ LLVMRustUnpackOptimizationDiagnostic( const char **pass_name_out, LLVMValueRef *function_out, LLVMDebugLocRef *debugloc_out, - LLVMTwineRef *message_out) + RustStringRef message_out) { // Undefined to call this not on an optimization diagnostic! llvm::DiagnosticInfoOptimizationBase *opt = static_cast(unwrap(di)); +#if LLVM_VERSION_GE(4, 0) + *pass_name_out = opt->getPassName().data(); +#else *pass_name_out = opt->getPassName(); +#endif *function_out = wrap(&opt->getFunction()); *debugloc_out = wrap(&opt->getDebugLoc()); - *message_out = wrap(&opt->getMsg()); + raw_rust_string_ostream os(message_out); + os << opt->getMsg(); } extern "C" void