about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-10-03 13:59:38 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-10-03 13:59:38 -0700
commit968b66ad40c3925aaf34bf90740dfb3377c8d786 (patch)
tree9518f777a21495a828e48e9aa4c788d9038f754b
parent9be0dc1250aaf657d9c50d4f98aacb73a9aa832c (diff)
downloadrust-968b66ad40c3925aaf34bf90740dfb3377c8d786.tar.gz
rust-968b66ad40c3925aaf34bf90740dfb3377c8d786.zip
rustc: Implement C stack stdcall
-rw-r--r--src/comp/metadata/creader.rs3
-rw-r--r--src/comp/metadata/tydecode.rs1
-rw-r--r--src/comp/metadata/tyencode.rs1
-rw-r--r--src/comp/middle/trans.rs10
-rw-r--r--src/comp/syntax/ast.rs1
-rw-r--r--src/comp/syntax/parse/parser.rs2
-rw-r--r--src/comp/syntax/print/pprust.rs3
7 files changed, 19 insertions, 2 deletions
diff --git a/src/comp/metadata/creader.rs b/src/comp/metadata/creader.rs
index 8424ac48ccb..460bccb3087 100644
--- a/src/comp/metadata/creader.rs
+++ b/src/comp/metadata/creader.rs
@@ -54,7 +54,8 @@ fn visit_item(e: env, i: @ast::item) {
     alt i.node {
       ast::item_native_mod(m) {
         if m.abi != ast::native_abi_rust && m.abi != ast::native_abi_cdecl &&
-                m.abi != ast::native_abi_c_stack_cdecl {
+                m.abi != ast::native_abi_c_stack_cdecl &&
+                m.abi != ast::native_abi_c_stack_stdcall {
             ret;
         }
         let cstore = e.sess.get_cstore();
diff --git a/src/comp/metadata/tydecode.rs b/src/comp/metadata/tydecode.rs
index 710fcc363d8..3158b623439 100644
--- a/src/comp/metadata/tydecode.rs
+++ b/src/comp/metadata/tydecode.rs
@@ -264,6 +264,7 @@ fn parse_ty(st: @pstate, sd: str_def) -> ty::t {
           'l' { abi = ast::native_abi_llvm; }
           's' { abi = ast::native_abi_x86stdcall; }
           'C' { abi = ast::native_abi_c_stack_cdecl; }
+          'S' { abi = ast::native_abi_c_stack_stdcall; }
         }
         let func = parse_ty_fn(st, sd);
         ret ty::mk_native_fn(st.tcx, abi, func.args, func.ty);
diff --git a/src/comp/metadata/tyencode.rs b/src/comp/metadata/tyencode.rs
index 6f6da15a2c6..55c3b2bc5b7 100644
--- a/src/comp/metadata/tyencode.rs
+++ b/src/comp/metadata/tyencode.rs
@@ -148,6 +148,7 @@ fn enc_sty(w: io::writer, cx: @ctxt, st: ty::sty) {
           native_abi_llvm. { w.write_char('l'); }
           native_abi_x86stdcall. { w.write_char('s'); }
           native_abi_c_stack_cdecl. { w.write_char('C'); }
+          native_abi_c_stack_stdcall. { w.write_char('S'); }
         }
         enc_ty_fn(w, cx, args, out, return_val, []);
       }
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index ae5d3ca25d1..eaa38712dab 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -5741,7 +5741,8 @@ pure fn native_abi_requires_pair(abi: ast::native_abi) -> bool {
         ast::native_abi_rust. | ast::native_abi_cdecl. |
         ast::native_abi_llvm. | ast::native_abi_rust_intrinsic. |
         ast::native_abi_x86stdcall. { ret true; }
-        ast::native_abi_c_stack_cdecl. { ret false; }
+        ast::native_abi_c_stack_cdecl. |
+        ast::native_abi_c_stack_stdcall. { ret false; }
     }
 }
 
@@ -5809,6 +5810,13 @@ fn register_native_fn(ccx: @crate_ctxt, sp: span, path: [str], name: str,
         ccx.item_symbols.insert(id, name);
         ret;
       }
+      ast::native_abi_c_stack_stdcall. {
+        let llfn = decl_fn(ccx.llmod, name, lib::llvm::LLVMX86StdcallCallConv,
+                           T_fn([], T_int()));
+        ccx.item_ids.insert(id, llfn);
+        ccx.item_symbols.insert(id, name);
+        ret;
+      }
     }
 
     let path = path;
diff --git a/src/comp/syntax/ast.rs b/src/comp/syntax/ast.rs
index 87d417d5701..52aa6cb31d9 100644
--- a/src/comp/syntax/ast.rs
+++ b/src/comp/syntax/ast.rs
@@ -420,6 +420,7 @@ tag native_abi {
     native_abi_rust_intrinsic;
     native_abi_x86stdcall;
     native_abi_c_stack_cdecl;
+    native_abi_c_stack_stdcall;
 }
 
 type native_mod =
diff --git a/src/comp/syntax/parse/parser.rs b/src/comp/syntax/parse/parser.rs
index 8fa705d6418..5e9d49d833c 100644
--- a/src/comp/syntax/parse/parser.rs
+++ b/src/comp/syntax/parse/parser.rs
@@ -2014,6 +2014,8 @@ fn parse_item_native_mod(p: parser, attrs: [ast::attribute]) -> @ast::item {
             abi = ast::native_abi_x86stdcall;
         } else if str::eq(t, "c-stack-cdecl") {
             abi = ast::native_abi_c_stack_cdecl;
+        } else if str::eq(t, "c-stack-stdcall") {
+            abi = ast::native_abi_c_stack_stdcall;
         } else {
             p.fatal("unsupported abi: " + t);
         }
diff --git a/src/comp/syntax/print/pprust.rs b/src/comp/syntax/print/pprust.rs
index 2b0bff104cd..555cd7fddee 100644
--- a/src/comp/syntax/print/pprust.rs
+++ b/src/comp/syntax/print/pprust.rs
@@ -411,6 +411,9 @@ fn print_item(s: ps, item: @ast::item) {
           ast::native_abi_c_stack_cdecl. {
             word_nbsp(s, "\"c-stack-cdecl\"");
           }
+          ast::native_abi_c_stack_stdcall. {
+            word_nbsp(s, "\"c-stack-stdcall\"");
+          }
         }
         word_nbsp(s, "mod");
         word_nbsp(s, item.ident);