diff options
| author | Michael Woerister <michaelwoerister@posteo> | 2014-06-12 18:06:14 +0200 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo> | 2014-06-12 18:48:14 +0200 |
| commit | c7426cf05a166fca8aa76a690bad17111ea0dea4 (patch) | |
| tree | a078303743bcb3c35d54a6e323687aaaa7d1e7aa | |
| parent | 0a98a4e422bd2d80ee7910b00c0286f1eefde9c5 (diff) | |
| download | rust-c7426cf05a166fca8aa76a690bad17111ea0dea4.tar.gz rust-c7426cf05a166fca8aa76a690bad17111ea0dea4.zip | |
debuginfo: Fix issue with unique type IDs not being passed to LLVM for LLVM 3.4
| -rw-r--r-- | src/librustc/lib/llvm.rs | 1 | ||||
| -rw-r--r-- | src/librustc/middle/trans/debuginfo.rs | 20 | ||||
| -rw-r--r-- | src/rustllvm/RustWrapper.cpp | 9 |
3 files changed, 24 insertions, 6 deletions
diff --git a/src/librustc/lib/llvm.rs b/src/librustc/lib/llvm.rs index 75445a317ec..ac9cec84715 100644 --- a/src/librustc/lib/llvm.rs +++ b/src/librustc/lib/llvm.rs @@ -1809,6 +1809,7 @@ pub mod llvm { pub fn LLVMRustDestroyArchive(AR: ArchiveRef); pub fn LLVMRustSetDLLExportStorageClass(V: ValueRef); + pub fn LLVMVersionMajor() -> c_int; pub fn LLVMVersionMinor() -> c_int; pub fn LLVMRustGetSectionName(SI: SectionIteratorRef, diff --git a/src/librustc/middle/trans/debuginfo.rs b/src/librustc/middle/trans/debuginfo.rs index 33a6068fcca..0b10db56cc4 100644 --- a/src/librustc/middle/trans/debuginfo.rs +++ b/src/librustc/middle/trans/debuginfo.rs @@ -179,7 +179,6 @@ use std::collections::HashSet; use std::gc::Gc; use std::ptr; use std::rc::{Rc, Weak}; -use std::sync::atomics; use syntax::util::interner::Interner; use syntax::codemap::{Span, Pos}; use syntax::{abi, ast, codemap, ast_util, ast_map}; @@ -2356,9 +2355,22 @@ fn set_members_of_composite_type(cx: &CrateContext, let mut composite_types_completed = debug_context(cx).composite_types_completed.borrow_mut(); if composite_types_completed.contains(&composite_type_metadata) { - cx.sess().span_bug(definition_span, "debuginfo::set_members_of_composite_type() - \ - Already completed forward declaration \ - re-encountered."); + let (llvm_version_major, llvm_version_minor) = unsafe { + (llvm::LLVMVersionMajor(), llvm::LLVMVersionMinor()) + }; + + let actual_llvm_version = llvm_version_major * 1000000 + llvm_version_minor * 1000; + let min_supported_llvm_version = 3 * 1000000 + 4 * 1000; + + if actual_llvm_version < min_supported_llvm_version { + cx.sess().warn(format!("This version of rustc was built with LLVM {}.{}. \ + Rustc just ran into a known debuginfo corruption problem that \ + often occurs with LLVM versions below 3.4. Please use a rustc built with a \ + newer version of LLVM.", llvm_version_major, llvm_version_minor).as_slice()); + } else { + cx.sess().bug("debuginfo::set_members_of_composite_type() - \ + Already completed forward declaration re-encountered."); + } } else { composite_types_completed.insert(composite_type_metadata); } diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp index 2157aecf376..f42844b9f19 100644 --- a/src/rustllvm/RustWrapper.cpp +++ b/src/rustllvm/RustWrapper.cpp @@ -318,7 +318,7 @@ extern "C" LLVMValueRef LLVMDIBuilderCreateStructType( unwrapDI<DIArray>(Elements), RunTimeLang, unwrapDI<DIType>(VTableHolder) -#if LLVM_VERSION_MINOR >= 5 +#if LLVM_VERSION_MINOR >= 4 ,UniqueId #endif )); @@ -510,7 +510,7 @@ extern "C" LLVMValueRef LLVMDIBuilderCreateUnionType( Flags, unwrapDI<DIArray>(Elements), RunTimeLang -#if LLVM_VERSION_MINOR >= 5 +#if LLVM_VERSION_MINOR >= 4 ,UniqueId #endif )); @@ -734,6 +734,11 @@ LLVMVersionMinor() { return LLVM_VERSION_MINOR; } +extern "C" int +LLVMVersionMajor() { + return LLVM_VERSION_MAJOR; +} + // Note that the two following functions look quite similar to the // LLVMGetSectionName function. Sadly, it appears that this function only // returns a char* pointer, which isn't guaranteed to be null-terminated. The |
