@@ -888,18 +888,35 @@ fn decl_native_glue(ModuleRef llmod, type_names tn,
888
888
ret decl_fastcall_fn ( llmod, s, T_fn ( args, T_int ( ) ) ) ;
889
889
}
890
890
891
- fn get_extern ( & hashmap[ str, ValueRef ] externs ,
892
- ModuleRef llmod, str name , int n_args ) -> ValueRef {
891
+ fn get_extern_fn ( & hashmap[ str, ValueRef ] externs ,
892
+ ModuleRef llmod, str name ,
893
+ uint cc, TypeRef ty) -> ValueRef {
893
894
if ( externs. contains_key ( name) ) {
894
895
ret externs. get ( name) ;
895
896
}
896
- auto inputs = _vec. init_elt [ TypeRef ] ( T_int ( ) , n_args as uint ) ;
897
- auto output = T_int ( ) ;
898
- auto f = decl_cdecl_fn ( llmod, name, T_fn ( inputs, output) ) ;
897
+ auto f = decl_fn ( llmod, name, cc, ty) ;
899
898
externs. insert ( name, f) ;
900
899
ret f;
901
900
}
902
901
902
+ fn get_extern_const ( & hashmap[ str, ValueRef ] externs ,
903
+ ModuleRef llmod, str name , TypeRef ty) -> ValueRef {
904
+ if ( externs. contains_key ( name) ) {
905
+ ret externs. get ( name) ;
906
+ }
907
+ auto c = llvm. LLVMAddGlobal ( llmod, ty, _str. buf ( name) ) ;
908
+ externs. insert ( name, c) ;
909
+ ret c;
910
+ }
911
+
912
+ fn get_simple_extern_fn ( & hashmap[ str, ValueRef ] externs ,
913
+ ModuleRef llmod, str name , int n_args ) -> ValueRef {
914
+ auto inputs = _vec. init_elt [ TypeRef ] ( T_int ( ) , n_args as uint ) ;
915
+ auto output = T_int ( ) ;
916
+ auto t = T_fn ( inputs, output) ;
917
+ ret get_extern_fn ( externs, llmod, name, lib. llvm . LLVMCCallConv , t) ;
918
+ }
919
+
903
920
fn trans_upcall ( @block_ctxt cx , str name , vec[ ValueRef ] args ) -> result {
904
921
auto cxx = cx. fcx . ccx ;
905
922
auto lltaskptr = cx. build . PtrToInt ( cx. fcx . lltaskptr , T_int ( ) ) ;
@@ -914,7 +931,7 @@ fn trans_native(builder b, @glue_fns glues, ValueRef lltaskptr,
914
931
type_names tn, ModuleRef llmod, str name ,
915
932
bool pass_task , vec[ ValueRef ] args ) -> ValueRef {
916
933
let int n = ( _vec. len [ ValueRef ] ( args) as int ) ;
917
- let ValueRef llnative = get_extern ( externs, llmod, name, n) ;
934
+ let ValueRef llnative = get_simple_extern_fn ( externs, llmod, name, n) ;
918
935
llnative = llvm. LLVMConstPointerCast ( llnative, T_int ( ) ) ;
919
936
920
937
let ValueRef llglue;
0 commit comments