Skip to content

Commit 78a2184

Browse files
committed
---
yaml --- r: 1874 b: refs/heads/master c: ee686da h: refs/heads/master v: v3
1 parent 87fcfa6 commit 78a2184

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 94c19a18ae8ddf70d0c6a21b296e0858dc154d2a
2+
refs/heads/master: ee686dacb8a2582309e6562d5c37b4cdc776482c

trunk/src/comp/middle/trans.rs

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -888,18 +888,35 @@ fn decl_native_glue(ModuleRef llmod, type_names tn,
888888
ret decl_fastcall_fn(llmod, s, T_fn(args, T_int()));
889889
}
890890

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 {
893894
if (externs.contains_key(name)) {
894895
ret externs.get(name);
895896
}
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);
899898
externs.insert(name, f);
900899
ret f;
901900
}
902901

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+
903920
fn trans_upcall(@block_ctxt cx, str name, vec[ValueRef] args) -> result {
904921
auto cxx = cx.fcx.ccx;
905922
auto lltaskptr = cx.build.PtrToInt(cx.fcx.lltaskptr, T_int());
@@ -914,7 +931,7 @@ fn trans_native(builder b, @glue_fns glues, ValueRef lltaskptr,
914931
type_names tn, ModuleRef llmod, str name,
915932
bool pass_task, vec[ValueRef] args) -> ValueRef {
916933
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);
918935
llnative = llvm.LLVMConstPointerCast(llnative, T_int());
919936

920937
let ValueRef llglue;

0 commit comments

Comments
 (0)