Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
ee686dac
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
ee686dac
编写于
3月 25, 2011
作者:
G
Graydon Hoare
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add get_extern_const, factor get_extern into get_extern_fn and get_simple_extern_fn.
上级
94c19a18
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
23 addition
and
6 deletion
+23
-6
src/comp/middle/trans.rs
src/comp/middle/trans.rs
+23
-6
未找到文件。
src/comp/middle/trans.rs
浏览文件 @
ee686dac
...
...
@@ -888,18 +888,35 @@ fn decl_native_glue(ModuleRef llmod, type_names tn,
ret
decl_fastcall_fn
(
llmod
,
s
,
T_fn
(
args
,
T_int
()));
}
fn
get_extern
(
&
hashmap
[
str
,
ValueRef
]
externs
,
ModuleRef
llmod
,
str
name
,
int
n_args
)
->
ValueRef
{
fn
get_extern_fn
(
&
hashmap
[
str
,
ValueRef
]
externs
,
ModuleRef
llmod
,
str
name
,
uint
cc
,
TypeRef
ty
)
->
ValueRef
{
if
(
externs
.contains_key
(
name
))
{
ret
externs
.get
(
name
);
}
auto
inputs
=
_
vec
.init_elt
[
TypeRef
](
T_int
(),
n_args
as
uint
);
auto
output
=
T_int
();
auto
f
=
decl_cdecl_fn
(
llmod
,
name
,
T_fn
(
inputs
,
output
));
auto
f
=
decl_fn
(
llmod
,
name
,
cc
,
ty
);
externs
.insert
(
name
,
f
);
ret
f
;
}
fn
get_extern_const
(
&
hashmap
[
str
,
ValueRef
]
externs
,
ModuleRef
llmod
,
str
name
,
TypeRef
ty
)
->
ValueRef
{
if
(
externs
.contains_key
(
name
))
{
ret
externs
.get
(
name
);
}
auto
c
=
llvm
.LLVMAddGlobal
(
llmod
,
ty
,
_
str
.buf
(
name
));
externs
.insert
(
name
,
c
);
ret
c
;
}
fn
get_simple_extern_fn
(
&
hashmap
[
str
,
ValueRef
]
externs
,
ModuleRef
llmod
,
str
name
,
int
n_args
)
->
ValueRef
{
auto
inputs
=
_
vec
.init_elt
[
TypeRef
](
T_int
(),
n_args
as
uint
);
auto
output
=
T_int
();
auto
t
=
T_fn
(
inputs
,
output
);
ret
get_extern_fn
(
externs
,
llmod
,
name
,
lib
.llvm.LLVMCCallConv
,
t
);
}
fn
trans_upcall
(
@
block_ctxt
cx
,
str
name
,
vec
[
ValueRef
]
args
)
->
result
{
auto
cxx
=
cx
.fcx.ccx
;
auto
lltaskptr
=
cx
.build
.PtrToInt
(
cx
.fcx.lltaskptr
,
T_int
());
...
...
@@ -914,7 +931,7 @@ fn trans_native(builder b, @glue_fns glues, ValueRef lltaskptr,
type_names
tn
,
ModuleRef
llmod
,
str
name
,
bool
pass_task
,
vec
[
ValueRef
]
args
)
->
ValueRef
{
let
int
n
=
(
_
vec
.len
[
ValueRef
](
args
)
as
int
);
let
ValueRef
llnative
=
get_
exter
n
(
externs
,
llmod
,
name
,
n
);
let
ValueRef
llnative
=
get_
simple_extern_f
n
(
externs
,
llmod
,
name
,
n
);
llnative
=
llvm
.LLVMConstPointerCast
(
llnative
,
T_int
());
let
ValueRef
llglue
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录