]> git.lizzy.rs Git - rust.git/commitdiff
switch over sqrt from llvm to c-stack-cdecl, exposing a bug in
authorNiko Matsakis <niko@alum.mit.edu>
Mon, 24 Oct 2011 19:33:08 +0000 (12:33 -0700)
committerBrian Anderson <banderson@mozilla.com>
Mon, 24 Oct 2011 23:06:18 +0000 (16:06 -0700)
the supported return types of upcall_c_stack

src/comp/back/upcall.rs
src/comp/middle/trans.rs
src/rt/arch/i386/ccall.S
src/rt/rustrt.def.in
src/test/bench/shootout-nbody.rs

index 2589247e2cdad04bd609106e30636c64b0d51eb5..04bdebb04a171984e4a44139e86502d82a2fc7a6 100644 (file)
@@ -5,7 +5,7 @@
 import middle::trans_common::{T_f32, T_f64, T_fn, T_bool, T_i1, T_i8, T_i32,
                               T_int, T_vec, T_nil, T_opaque_chan_ptr,
                               T_opaque_vec, T_opaque_port_ptr, T_ptr,
-                              T_size_t, T_void};
+                              T_size_t, T_void, T_float};
 import lib::llvm::type_names;
 import lib::llvm::llvm::ModuleRef;
 import lib::llvm::llvm::ValueRef;
@@ -28,6 +28,7 @@
      dynastack_free: ValueRef,
      alloc_c_stack: ValueRef,
      call_c_stack: ValueRef,
+     call_c_stack_float: ValueRef,
      rust_personality: ValueRef};
 
 fn declare_upcalls(_tn: type_names, tydesc_type: TypeRef,
@@ -77,6 +78,9 @@ fn decl(llmod: ModuleRef, name: str, tys: [TypeRef], rv: TypeRef) ->
           call_c_stack: d("call_c_stack",
                           [T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
                           T_int()),
+          call_c_stack_float: d("call_c_stack_float",
+                                [T_ptr(T_fn([], T_int())), T_ptr(T_i8())],
+                                T_float()),
           rust_personality: d("rust_personality", [], T_i32())
          };
 }
index 8391f40df47e1bd50be08a9d20ae677c4527717b..c655d7d4b5dc1129e0c9f81121eee9b24a7dcdd1 100644 (file)
@@ -3864,20 +3864,33 @@ fn trans_c_stack_native_call(bcx: @block_ctxt, f: @ast::expr,
         i += 1u;
     }
 
-    // Call.
-    // TODO: Invoke instead.
-    let llrawretval = Call(bcx, ccx.upcalls.call_c_stack,
-                           [llfn, llrawargbundle]);
-
-    // Cast return type.
+    // Determine return type.
     let ret_ty = ty::ty_fn_ret(bcx_tcx(bcx), fn_ty);
     check type_has_static_size(ccx, ret_ty);
     let llretty = type_of(ccx, f.span, ret_ty);
 
+    // Determine which upcall fn to use based on the return type.
+    let upcall_fn = alt lib::llvm::llvm::LLVMGetTypeKind(llretty) {
+      1 | 2 | 3 | 4 | 5 {
+        // LLVMFloatTypeKind, LLVMDoubleTypeKind,
+        // LLVMX86_FP80TypeKind, LLVMFP128TypeKind
+        // LLVMPPC_FP128TypeKind
+        ccx.upcalls.call_c_stack_float
+      }
+
+      _ { ccx.upcalls.call_c_stack }
+    };
+
+    // Call and cast the return type.
+    // TODO: Invoke instead.
+    let llrawretval = Call(bcx, upcall_fn,
+                           [llfn, llrawargbundle]);
     let llretval;
     if lib::llvm::llvm::LLVMGetTypeKind(llretty) as int == 11 { // pointer
         llretval = IntToPtr(bcx, llrawretval, llretty);
     } else {
+        log_err("TruncOrBitCast(", val_str(ccx.tn, llrawretval), ", ",
+                ty_str(ccx.tn, llretty), ")");
         llretval = TruncOrBitCast(bcx, llrawretval, llretty);
     }
 
index 44d0c2177360623863afdf82325e40536d820da8..378ea5e0b67eb8517ff8ccceed96067d212fd0f7 100644 (file)
@@ -6,10 +6,14 @@
 // slower.
 #if defined(__APPLE__) || defined(_WIN32)
 .globl _upcall_call_c_stack
+.globl _upcall_call_c_stack_float
 _upcall_call_c_stack:
+_upcall_call_c_stack_float:
 #else
 .globl upcall_call_c_stack
+.globl upcall_call_c_stack_float
 upcall_call_c_stack:
+upcall_call_c_stack_float:
 #endif
     pushl %ebp
     movl %esp,%ebp          // save esp
index 3430f77c8927d5cc756294312f6d6e9ab162023c..6b70e283957207ca2af5f4d1f5a27c7ba91bf0ed 100644 (file)
@@ -65,6 +65,7 @@ task_join
 unsupervise
 upcall_alloc_c_stack
 upcall_call_c_stack
+upcall_call_c_stack_float
 upcall_cmp_type
 upcall_dynastack_alloc
 upcall_dynastack_alloc_2
index 61122d8e6b48f28e990145344b073b7e51838536..e6f196f2869c520e07fa6032731a1c5b62062598 100644 (file)
@@ -1,8 +1,8 @@
 // based on:
 // http://shootout.alioth.debian.org/u32/benchmark.php?test=nbody&lang=java
 
-native "llvm" mod llvm {
-    fn sqrt(n: float) -> float = "sqrt.f64";
+native "c-stack-cdecl" mod llvm = "" {
+    fn sqrt(n: float) -> float;
 }
 
 fn main() {