about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-02-21 17:42:23 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-02-21 17:42:23 -0800
commit60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2 (patch)
treea177daef976b93c4e0c0c54a08c5f1310ccada71 /src
parentcbe8d222a82c14485cf416c4b85fd5e58363c0e0 (diff)
downloadrust-60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2.tar.gz
rust-60f97aa9cc73ee4e0b57abc07dc543c8fa823ee2.zip
Find main functions buried within modules. Un-XFAIL import.rs.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile1
-rw-r--r--src/comp/middle/trans.rs27
2 files changed, 26 insertions, 2 deletions
diff --git a/src/Makefile b/src/Makefile
index 71c9807bc79..872ced9896d 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -492,6 +492,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
                         int.rs \
                         i32-sub.rs \
                         i8-incr.rs \
+                        import.rs \
                         import2.rs \
                         import3.rs \
                         import4.rs \
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index efa3a41dc6a..35fefc104be 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -4602,6 +4602,30 @@ fn create_crate_constant(@crate_ctxt cx) {
     llvm.LLVMSetInitializer(cx.crate_ptr, crate_val);
 }
 
+fn find_main_fn(@crate_ctxt cx) -> ValueRef {
+    auto e = sep() + "main";
+    let ValueRef v = C_nil();
+    let uint n = 0u;
+    for each (tup(str,ValueRef) i in cx.item_names.items()) {
+        if (_str.ends_with(i._0, e)) {
+            n += 1u;
+            v = i._1;
+        }
+    }
+    alt (n) {
+        case (0u) {
+            cx.sess.err("main fn not found");
+        }
+        case (1u) {
+            ret v;
+        }
+        case (_) {
+            cx.sess.err("multiple main fns found");
+        }
+    }
+    fail;
+}
+
 fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
     auto T_main_args = vec(T_int(), T_int());
     auto T_rust_start_args = vec(T_int(), T_int(), T_int(), T_int());
@@ -4621,8 +4645,7 @@ fn trans_main_fn(@crate_ctxt cx, ValueRef llcrate) {
 
     auto llargc = llvm.LLVMGetParam(llmain, 0u);
     auto llargv = llvm.LLVMGetParam(llmain, 1u);
-    check (cx.item_names.contains_key("_rust" + sep() + "main"));
-    auto llrust_main = cx.item_names.get("_rust"  + sep() + "main");
+    auto llrust_main = find_main_fn(cx);
 
     //
     // Emit the moral equivalent of: