Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
1444cabc
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,发现更多精彩内容 >>
未验证
提交
1444cabc
编写于
7月 05, 2016
作者:
O
Oliver Schneider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
make the memory limit configurable
上级
756fbcce
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
36 addition
and
5 deletion
+36
-5
src/bin/miri.rs
src/bin/miri.rs
+32
-2
src/interpreter/mod.rs
src/interpreter/mod.rs
+4
-3
未找到文件。
src/bin/miri.rs
浏览文件 @
1444cabc
...
...
@@ -4,6 +4,7 @@
extern
crate
miri
;
extern
crate
rustc
;
extern
crate
rustc_driver
;
extern
crate
rustc_plugin
;
extern
crate
env_logger
;
extern
crate
log_settings
;
extern
crate
syntax
;
...
...
@@ -13,6 +14,7 @@
use
rustc
::
session
::
Session
;
use
rustc
::
mir
::
mir_map
::
MirMap
;
use
rustc_driver
::{
driver
,
CompilerCalls
,
Compilation
};
use
syntax
::
ast
::
MetaItemKind
;
struct
MiriCompilerCalls
;
...
...
@@ -23,7 +25,9 @@ fn build_controller(
_
:
&
getopts
::
Matches
)
->
driver
::
CompileController
<
'a
>
{
let
mut
control
=
driver
::
CompileController
::
basic
();
control
.after_hir_lowering.callback
=
Box
::
new
(|
state
|
{
state
.session.plugin_attributes
.borrow_mut
()
.push
((
"miri"
.to_owned
(),
syntax
::
feature_gate
::
AttributeType
::
Whitelisted
));
});
control
.after_analysis.stop
=
Compilation
::
Stop
;
control
.after_analysis.callback
=
Box
::
new
(|
state
|
{
state
.session
.abort_if_errors
();
...
...
@@ -33,9 +37,35 @@ fn build_controller(
let
(
node_id
,
_
)
=
state
.session.entry_fn
.borrow
()
.expect
(
"no main or start function found"
);
let
krate
=
state
.hir_crate
.as_ref
()
.unwrap
();
let
mut
memory_size
=
100
*
1024
*
1024
;
// 100MB
fn
extract_str
(
lit
:
&
syntax
::
ast
::
Lit
)
->
syntax
::
parse
::
token
::
InternedString
{
match
lit
.node
{
syntax
::
ast
::
LitKind
::
Str
(
ref
s
,
_
)
=>
s
.clone
(),
_
=>
panic!
(
"attribute values need to be strings"
),
}
}
for
attr
in
krate
.attrs
.iter
()
{
match
attr
.node.value.node
{
MetaItemKind
::
List
(
ref
name
,
_
)
if
name
!=
"miri"
=>
{}
MetaItemKind
::
List
(
_
,
ref
items
)
=>
for
item
in
items
{
match
item
.node
{
MetaItemKind
::
NameValue
(
ref
name
,
ref
value
)
=>
{
match
&**
name
{
"memory_size"
=>
memory_size
=
extract_str
(
value
)
.parse
::
<
u64
>
()
.expect
(
"not a number"
),
_
=>
state
.session
.span_err
(
item
.span
,
"unknown miri attribute"
),
}
}
_
=>
state
.session
.span_err
(
item
.span
,
"miri attributes need to be of key = value kind"
),
}
},
_
=>
{},
}
}
let
mut
mir_map
=
MirMap
{
map
:
mir_map
.map
.clone
()
};
run_mir_passes
(
tcx
,
&
mut
mir_map
);
eval_main
(
tcx
,
&
mir_map
,
node_id
);
eval_main
(
tcx
,
&
mir_map
,
node_id
,
memory_size
);
state
.session
.abort_if_errors
();
});
...
...
src/interpreter/mod.rs
浏览文件 @
1444cabc
...
...
@@ -133,12 +133,12 @@ enum ConstantKind {
}
impl
<
'a
,
'tcx
>
EvalContext
<
'a
,
'tcx
>
{
pub
fn
new
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
mir_map
:
&
'a
MirMap
<
'tcx
>
)
->
Self
{
pub
fn
new
(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
mir_map
:
&
'a
MirMap
<
'tcx
>
,
memory_size
:
u64
)
->
Self
{
EvalContext
{
tcx
:
tcx
,
mir_map
:
mir_map
,
mir_cache
:
RefCell
::
new
(
DefIdMap
()),
memory
:
Memory
::
new
(
&
tcx
.data_layout
,
100
*
1024
*
1024
/* 100MB */
),
memory
:
Memory
::
new
(
&
tcx
.data_layout
,
memory_size
),
statics
:
HashMap
::
new
(),
stack
:
Vec
::
new
(),
}
...
...
@@ -928,10 +928,11 @@ pub fn eval_main<'a, 'tcx: 'a>(
tcx
:
TyCtxt
<
'a
,
'tcx
,
'tcx
>
,
mir_map
:
&
'a
MirMap
<
'tcx
>
,
node_id
:
ast
::
NodeId
,
memory_size
:
u64
,
)
{
let
mir
=
mir_map
.map
.get
(
&
node_id
)
.expect
(
"no mir for main function"
);
let
def_id
=
tcx
.map
.local_def_id
(
node_id
);
let
mut
ecx
=
EvalContext
::
new
(
tcx
,
mir_map
);
let
mut
ecx
=
EvalContext
::
new
(
tcx
,
mir_map
,
memory_size
);
let
substs
=
tcx
.mk_substs
(
subst
::
Substs
::
empty
());
let
return_ptr
=
ecx
.alloc_ret_ptr
(
mir
.return_ty
,
substs
)
.expect
(
"should at least be able to allocate space for the main function's return value"
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录