about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRobin Kruppe <robin.kruppe@gmail.com>2016-11-24 17:33:47 +0100
committerRobin Kruppe <robin.kruppe@gmail.com>2016-11-24 17:33:47 +0100
commit730400167ad2ce88bb48af3f36f3443ea4493d50 (patch)
tree79c1a845d9ddb60c09089798e35391629c2a52c6
parent29abe6f9e86829d55ba180a5957f203a64a96b65 (diff)
downloadrust-730400167ad2ce88bb48af3f36f3443ea4493d50.tar.gz
rust-730400167ad2ce88bb48af3f36f3443ea4493d50.zip
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
-rw-r--r--src/librustc_llvm/diagnostic.rs35
-rw-r--r--src/librustc_llvm/ffi.rs2
-rw-r--r--src/librustc_trans/back/write.rs2
-rw-r--r--src/rustllvm/RustWrapper.cpp9
4 files changed, 28 insertions, 20 deletions
diff --git a/src/librustc_llvm/diagnostic.rs b/src/librustc_llvm/diagnostic.rs
index 8767f03b3e7..e11274f2064 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 470e8d1fd45..15bca0207c7 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 01eea08c50b..02993047258 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 b035e134e37..7cde282444d 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<llvm::DiagnosticInfoOptimizationBase*>(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