Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
61e8b44f
R
Rust
项目概览
int
/
Rust
12 个月 前同步成功
通知
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,发现更多精彩内容 >>
提交
61e8b44f
编写于
12月 11, 2011
作者:
J
Josh Matthews
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add support for vectors.
上级
30d019d5
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
72 addition
and
63 deletion
+72
-63
src/comp/middle/debuginfo.rs
src/comp/middle/debuginfo.rs
+72
-63
未找到文件。
src/comp/middle/debuginfo.rs
浏览文件 @
61e8b44f
...
...
@@ -25,6 +25,8 @@
const
PointerTypeTag
:
int
=
15
;
const
StructureTypeTag
:
int
=
19
;
const
MemberTag
:
int
=
13
;
const
ArrayTypeTag
:
int
=
1
;
const
SubrangeTag
:
int
=
33
;
const
DW_ATE_boolean
:
int
=
0x02
;
const
DW_ATE_float
:
int
=
0x04
;
...
...
@@ -342,21 +344,9 @@ fn get_pointer_type_metadata(cx: @crate_ctxt, t: ty::t, span: codemap::span,
};
fn
finish_structure
(
cx
:
@
struct_ctxt
)
->
ValueRef
{
let
lldata
=
[
lltag
(
StructureTypeTag
),
cx
.file
,
llstr
(
cx
.name
),
// type name
cx
.file
,
// source file definition
lli32
(
cx
.line
),
// source line definition
lli64
(
cx
.total_size
),
// size of members
lli64
(
cx
.align
),
// align
lli64
(
0
),
// offset
lli32
(
0
),
// flags
llnull
(),
// derived from
llmdnode
(
cx
.members
),
// members
lli32
(
0
),
// runtime language
llnull
()
];
ret
llmdnode
(
lldata
);
ret
create_composite_type
(
StructureTypeTag
,
cx
.name
,
cx
.file
,
cx
.line
,
cx
.total_size
,
cx
.align
,
0
,
option
::
none
,
option
::
some
(
cx
.members
));
}
fn
create_structure
(
file
:
@
metadata
<
file_md
>
,
name
:
str
,
line
:
int
)
...
...
@@ -396,7 +386,6 @@ fn get_record_metadata(cx: @crate_ctxt, t: ty::t, fields: [ast::ty_field],
line_from_span
(
cx
.sess
.get_codemap
(),
span
)
as
int
);
for
field
in
fields
{
//let field_t = option::get(ccx_tcx(cx).ast_ty_to_ty_cache.get(field.node.mt.ty));
let
field_t
=
ty
::
get_field
(
ccx_tcx
(
cx
),
t
,
field
.node.ident
)
.mt.ty
;
let
ty_md
=
get_ty_metadata
(
cx
,
field_t
,
field
.node.mt.ty
);
let
(
size
,
align
)
=
member_size_and_align
(
field
.node.mt.ty
);
...
...
@@ -418,7 +407,6 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
option::some(md) { ret md; }
option::none. {}
}*/
let
(
size
,
align
)
=
size_and_align_of
::
<@
int
>
();
let
fname
=
filename_from_span
(
cx
,
span
);
let
file_node
=
get_file_metadata
(
cx
,
fname
);
//let cu_node = get_compile_unit_metadata(cx, fname);
...
...
@@ -426,52 +414,13 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
let
uint_t
=
ty
::
mk_uint
(
tcx
);
let
uint_ty
=
@
{
node
:
ast
::
ty_uint
(
ast
::
ty_u
),
span
:
span
};
let
refcount_type
=
get_basic_type_metadata
(
cx
,
uint_t
,
uint_ty
);
/*let refcount_ptr_type = get_pointer_type_metadata(cx,
ty::mk_imm_uniq(tcx, uint_t),
span, refcount_type);*/
/*let boxed_ptr_type = get_pointer_type_metadata(cx, ty::mk_imm_uniq(tcx, inner),
span, boxed);*/
//let ptr_size = sys::size_of::<ctypes::intptr_t>() as int;
//let ptr_align = sys::align_of::<ctypes::intptr_t>() as int;
let
size
=
sys
::
size_of
::
<
uint
>
()
as
int
*
8
;
let
total_size
=
size
;
let
refcount
=
[
lltag
(
MemberTag
),
file_node
.node
,
llstr
(
"refcnt"
),
file_node
.node
,
lli32
(
0
),
lli64
(
size
),
lli64
(
sys
::
align_of
::
<
uint
>
()
as
int
*
8
),
lli64
(
0
),
lli32
(
0
),
refcount_type
.node
];
let
size
=
64
;
//XXX member_size_and_align(???)
let
boxed_member
=
[
lltag
(
MemberTag
),
file_node
.node
,
llstr
(
"boxed"
),
file_node
.node
,
lli32
(
0
),
lli64
(
size
),
lli64
(
64
),
//XXX align of inner
lli64
(
total_size
),
lli32
(
0
),
boxed
.node
];
total_size
+=
size
;
let
members
=
[
llmdnode
(
refcount
),
llmdnode
(
boxed_member
)];
let
lldata
=
[
lltag
(
tg
),
file_node
.node
,
llstr
(
ty_to_str
(
ccx_tcx
(
cx
),
outer
)),
file_node
.node
,
lli32
(
0
),
//XXX source line
lli64
(
total_size
),
// size in bits
lli64
(
align
*
8
),
// alignment in bits
lli64
(
0
),
//XXX offset?
lli32
(
0
),
//XXX flags
llnull
(),
// derived from
llmdnode
(
members
),
// members
lli32
(
0
)
// runtime language
];
let
llnode
=
llmdnode
(
lldata
);
let
scx
=
create_structure
(
file_node
,
ty_to_str
(
ccx_tcx
(
cx
),
outer
),
0
);
add_member
(
scx
,
"refcnt"
,
0
,
sys
::
size_of
::
<
uint
>
()
as
int
,
sys
::
align_of
::
<
uint
>
()
as
int
,
refcount_type
.node
);
add_member
(
scx
,
"boxed"
,
0
,
8
,
//XXX member_size_and_align(??)
8
,
//XXX just a guess
boxed
.node
);
let
llnode
=
finish_structure
(
scx
);
let
mdval
=
@
{
node
:
llnode
,
data
:
{
hash
:
outer
}};
//update_cache(cache, tg, tydesc_metadata(mdval));
llvm
::
LLVMAddNamedMetadataOperand
(
cx
.llmod
,
as_buf
(
"llvm.dbg.ty"
),
...
...
@@ -480,6 +429,56 @@ fn get_boxed_type_metadata(cx: @crate_ctxt, outer: ty::t, inner: ty::t,
ret
mdval
;
}
fn
create_composite_type
(
type_tag
:
int
,
name
:
str
,
file
:
ValueRef
,
line
:
int
,
size
:
int
,
align
:
int
,
offset
:
int
,
derived
:
option
::
t
<
ValueRef
>
,
members
:
option
::
t
<
[
ValueRef
]
>
)
->
ValueRef
{
let
lldata
=
[
lltag
(
type_tag
),
file
,
llstr
(
name
),
// type name
file
,
// source file definition
lli32
(
line
),
// source line definition
lli64
(
size
),
// size of members
lli64
(
align
),
// align
lli64
(
offset
),
// offset
lli32
(
0
),
// flags
option
::
is_none
(
derived
)
?
llnull
()
:
// derived from
option
::
get
(
derived
),
option
::
is_none
(
members
)
?
llnull
()
:
// members
llmdnode
(
option
::
get
(
members
)),
lli32
(
0
),
// runtime language
llnull
()
];
ret
llmdnode
(
lldata
);
}
fn
get_vec_metadata
(
cx
:
@
crate_ctxt
,
vec_t
:
ty
::
t
,
elem_t
:
ty
::
t
,
vec_ty
:
@
ast
::
ty
)
->
@
metadata
<
tydesc_md
>
{
let
fname
=
filename_from_span
(
cx
,
vec_ty
.span
);
let
file_node
=
get_file_metadata
(
cx
,
fname
);
let
elem_ty
=
alt
vec_ty
.node
{
ast
::
ty_vec
(
mt
)
{
mt
.ty
}
};
let
elem_ty_md
=
get_ty_metadata
(
cx
,
elem_t
,
elem_ty
);
let
tcx
=
ccx_tcx
(
cx
);
let
scx
=
create_structure
(
file_node
,
ty_to_str
(
tcx
,
vec_t
),
0
);
let
uint_ty
=
@
{
node
:
ast
::
ty_uint
(
ast
::
ty_u
),
span
:
vec_ty
.span
};
let
size_t_type
=
get_basic_type_metadata
(
cx
,
ty
::
mk_uint
(
tcx
),
uint_ty
);
add_member
(
scx
,
"fill"
,
0
,
sys
::
size_of
::
<
ctypes
::
size_t
>
()
as
int
,
sys
::
align_of
::
<
ctypes
::
size_t
>
()
as
int
,
size_t_type
.node
);
add_member
(
scx
,
"alloc"
,
0
,
sys
::
size_of
::
<
ctypes
::
size_t
>
()
as
int
,
sys
::
align_of
::
<
ctypes
::
size_t
>
()
as
int
,
size_t_type
.node
);
let
subrange
=
llmdnode
([
lltag
(
SubrangeTag
),
lli64
(
0
),
lli64
(
0
)]);
let
(
arr_size
,
arr_align
)
=
member_size_and_align
(
elem_ty
);
let
data_ptr
=
create_composite_type
(
ArrayTypeTag
,
""
,
file_node
.node
,
0
,
arr_size
,
arr_align
,
0
,
option
::
some
(
elem_ty_md
.node
),
option
::
some
([
subrange
]));
add_member
(
scx
,
"data"
,
0
,
0
,
// according to an equivalent clang dump, the size should be 0
sys
::
align_of
::
<
u8
>
()
as
int
,
data_ptr
);
let
llnode
=
finish_structure
(
scx
);
ret
@
{
node
:
llnode
,
data
:
{
hash
:
vec_t
}};
}
fn
member_size_and_align
(
ty
:
@
ast
::
ty
)
->
(
int
,
int
)
{
alt
ty
.node
{
ast
::
ty_bool
.
{
size_and_align_of
::
<
bool
>
()
}
...
...
@@ -512,6 +511,9 @@ fn member_size_and_align(ty: @ast::ty) -> (int, int) {
}
(
total_size
,
64
)
//XXX different align for other arches?
}
ast
::
ty_vec
(
_
)
{
size_and_align_of
::
<
ctypes
::
uintptr_t
>
()
}
}
}
...
...
@@ -545,6 +547,8 @@ fn t_to_ty(cx: @crate_ctxt, t: ty::t, span: codemap::span) -> @ast::ty {
}
ast
::
ty_rec
(
fs
)
}
ty
::
ty_vec
(
mt
)
{
ast
::
ty_vec
({
ty
:
t_to_ty
(
cx
,
mt
.ty
,
span
),
mut
:
mt
.mut
})
}
};
ret
@
{
node
:
ty
,
span
:
span
};
}
...
...
@@ -572,6 +576,11 @@ fn t_to_ty(cx: @crate_ctxt, t: ty::t, span: codemap::span) -> @ast::ty {
ast
::
ty_rec
(
fields
)
{
ret
get_record_metadata
(
cx
,
t
,
fields
,
ty
.span
);
}
ast
::
ty_vec
(
mt
)
{
let
inner_t
=
ty
::
sequence_element_type
(
ccx_tcx
(
cx
),
t
);
let
v
=
get_vec_metadata
(
cx
,
t
,
inner_t
,
ty
);
ret
get_pointer_type_metadata
(
cx
,
t
,
ty
.span
,
v
);
}
_
{
ret
get_basic_type_metadata
(
cx
,
t
,
ty
);
}
};
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录