@@ -751,7 +751,8 @@ fn trans_native_call(&builder b, @glue_fns glues, ValueRef lltaskptr,
751
751
ModuleRef llmod, & str name , bool pass_task ,
752
752
& ValueRef [ ] args) -> ValueRef {
753
753
let int n = std: : ivec:: len[ ValueRef ] ( args) as int;
754
- let ValueRef llnative = get_simple_extern_fn( externs, llmod, name, n) ;
754
+ let ValueRef llnative = get_simple_extern_fn( externs, llmod,
755
+ name, n) ;
755
756
let ValueRef [ ] call_args = ~[ ] ;
756
757
for ( ValueRef a in args) { call_args += ~[ b. ZExtOrBitCast ( a, T_int ( ) ) ] ; }
757
758
ret b. Call ( llnative, call_args) ;
@@ -8142,6 +8143,11 @@ fn decl_native_fn_and_pair(&@crate_ctxt ccx, &span sp, &str[] path, str name,
8142
8143
uses_retptr = false;
8143
8144
cast_to_i32 = false;
8144
8145
}
8146
+ case ( ast:: native_abi_x86stdcall) {
8147
+ pass_task = false;
8148
+ uses_retptr = false;
8149
+ cast_to_i32 = true;
8150
+ }
8145
8151
}
8146
8152
8147
8153
auto lltaskptr;
@@ -8185,7 +8191,7 @@ fn decl_native_fn_and_pair(&@crate_ctxt ccx, &span sp, &str[] path, str name,
8185
8191
fn trans_simple_native_abi( & @block_ctxt bcx, str name,
8186
8192
& mutable ValueRef [ ] call_args,
8187
8193
ty:: t fn_type, uint first_arg_n,
8188
- bool uses_retptr) ->
8194
+ bool uses_retptr, uint cc ) ->
8189
8195
tup( ValueRef , ValueRef ) {
8190
8196
let TypeRef [ ] call_arg_tys = ~[ ] ;
8191
8197
for ( ValueRef arg in call_args) { call_arg_tys += ~[ val_ty( arg) ] ; }
@@ -8202,8 +8208,12 @@ fn decl_native_fn_and_pair(&@crate_ctxt ccx, &span sp, &str[] path, str name,
8202
8208
8203
8209
auto llnativefn =
8204
8210
get_extern_fn( bcx. fcx. lcx. ccx. externs, bcx. fcx. lcx. ccx. llmod,
8205
- name, lib:: llvm:: LLVMCCallConv , llnativefnty) ;
8206
- auto r = bcx. build. Call ( llnativefn, call_args) ;
8211
+ name, cc, llnativefnty) ;
8212
+ auto r = if ( cc == lib:: llvm:: LLVMCCallConv ) {
8213
+ bcx. build. Call ( llnativefn, call_args)
8214
+ } else {
8215
+ bcx. build. CallWithConv ( llnativefn, call_args, cc)
8216
+ } ;
8207
8217
auto rptr = bcx. fcx. llretptr;
8208
8218
ret tup( r, rptr) ;
8209
8219
}
@@ -8231,15 +8241,25 @@ fn decl_native_fn_and_pair(&@crate_ctxt ccx, &span sp, &str[] path, str name,
8231
8241
case ( ast:: native_abi_llvm) {
8232
8242
auto result =
8233
8243
trans_simple_native_abi( bcx, name, call_args, fn_type, arg_n,
8234
- uses_retptr) ;
8244
+ uses_retptr,
8245
+ lib:: llvm:: LLVMCCallConv ) ;
8235
8246
r = result. _0;
8236
8247
rptr = result. _1;
8237
8248
}
8238
8249
case ( ast:: native_abi_rust_intrinsic) {
8239
8250
auto external_name = "rust_intrinsic_" + name;
8240
8251
auto result =
8241
8252
trans_simple_native_abi( bcx, external_name, call_args,
8242
- fn_type, arg_n, uses_retptr) ;
8253
+ fn_type, arg_n, uses_retptr,
8254
+ lib:: llvm:: LLVMCCallConv ) ;
8255
+ r = result. _0;
8256
+ rptr = result. _1;
8257
+ }
8258
+ case ( ast:: native_abi_x86stdcall) {
8259
+ auto result =
8260
+ trans_simple_native_abi( bcx, name, call_args, fn_type, arg_n,
8261
+ uses_retptr,
8262
+ lib:: llvm:: LLVMX86StdcallCallConv ) ;
8243
8263
r = result. _0;
8244
8264
rptr = result. _1;
8245
8265
}
0 commit comments