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,
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};
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);
}
unwrapDI<DIArray>(Elements),
RunTimeLang,
unwrapDI<DIType>(VTableHolder)
-#if LLVM_VERSION_MINOR >= 5
+#if LLVM_VERSION_MINOR >= 4
,UniqueId
#endif
));
Flags,
unwrapDI<DIArray>(Elements),
RunTimeLang
-#if LLVM_VERSION_MINOR >= 5
+#if LLVM_VERSION_MINOR >= 4
,UniqueId
#endif
));
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