about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHaitao Li <lihaitao@gmail.com>2011-12-05 14:56:11 +0800
committerHaitao Li <lihaitao@gmail.com>2011-12-05 17:21:20 +0800
commit47ea57feadb6d05241fad064434c28c48e31b7fc (patch)
tree88bf76125ea5c20b1536ce024f5b15b69497bb6e
parent52d7dc5e0a218f1495da2057ac064811853a4c9c (diff)
rustc: Add suffix ".rc" to LLVM module identifier
LLVM code generator emits the ".file filename" directive for ELF
backends. Value of the "filename" is set as the LLVM module identifier.
Due to a LLVM MC bug[1], LLVM crashes if the module identifer is same as
other symbols such as a function name in the module.

This patch adds a ".rc" suffix (means crates) to LLVM module identifier
to workaround the bug.

Fixes issue #1251.

1. http://llvm.org/bugs/show_bug.cgi?id=11479
-rw-r--r--src/comp/middle/trans.rs13
-rw-r--r--src/test/run-pass/issue-1251.rs7
2 files changed, 19 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 7d52316d9a8..3ea355d2cb9 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -6059,7 +6059,18 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
     -> ModuleRef {
     let sha = std::sha1::mk_sha1();
     let link_meta = link::build_link_meta(sess, *crate, output, sha);
-    let llmod = str::as_buf(link_meta.name, {|buf|
+
+    // Append ".rc" to crate name as LLVM module identifier.
+    //
+    // LLVM code generator emits a ".file filename" directive
+    // for ELF backends. Value of the "filename" is set as the
+    // LLVM module identifier.  Due to a LLVM MC bug[1], LLVM
+    // crashes if the module identifer is same as other symbols
+    // such as a function name in the module. 
+    // 1. http://llvm.org/bugs/show_bug.cgi?id=11479
+    let llmod_id = link_meta.name + ".rc";
+
+    let llmod = str::as_buf(llmod_id, {|buf|
         llvm::LLVMModuleCreateWithNameInContext
             (buf, llvm::LLVMGetGlobalContext())
     });
diff --git a/src/test/run-pass/issue-1251.rs b/src/test/run-pass/issue-1251.rs
new file mode 100644
index 00000000000..69e54f4a95d
--- /dev/null
+++ b/src/test/run-pass/issue-1251.rs
@@ -0,0 +1,7 @@
+#[link(name = "unsupervise")];
+
+native mod rustrt {
+      fn unsupervise();
+}
+
+fn main() { }