Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mu-impl-fast
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
40
Issues
40
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
mu
mu-impl-fast
Commits
50b5f20f
Commit
50b5f20f
authored
Nov 11, 2016
by
Kunshan Wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
IRBuilder: fixed Struct, Hybrid and GetFieldIRef
parent
d9912d25
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
57 deletions
+134
-57
src/ast/src/types.rs
src/ast/src/types.rs
+4
-4
src/vm/api/api_impl/muirbuilder.rs
src/vm/api/api_impl/muirbuilder.rs
+57
-48
tests/test_ir/test_builder_api.rs
tests/test_ir/test_builder_api.rs
+73
-5
No files found.
src/ast/src/types.rs
View file @
50b5f20f
...
...
@@ -264,10 +264,10 @@ impl MuType_ {
MuType_
::
Struct
(
tag
)
}
pub
fn
mustruct_put
(
tag
:
MuName
,
mut
list
:
Vec
<
P
<
MuType
>>
)
{
pub
fn
mustruct_put
(
tag
:
&
MuName
,
mut
list
:
Vec
<
P
<
MuType
>>
)
{
let
mut
map_guard
=
STRUCT_TAG_MAP
.write
()
.unwrap
();
match
map_guard
.get_mut
(
&
tag
)
{
match
map_guard
.get_mut
(
tag
)
{
Some
(
struct_ty_
)
=>
{
struct_ty_
.tys
.clear
();
struct_ty_
.tys
.append
(
&
mut
list
);
...
...
@@ -303,10 +303,10 @@ impl MuType_ {
MuType_
::
Hybrid
(
tag
)
}
pub
fn
hybrid_put
(
tag
:
HybridTag
,
mut
fix_tys
:
Vec
<
P
<
MuType
>>
,
var_ty
:
P
<
MuType
>
)
{
pub
fn
hybrid_put
(
tag
:
&
HybridTag
,
mut
fix_tys
:
Vec
<
P
<
MuType
>>
,
var_ty
:
P
<
MuType
>
)
{
let
mut
map_guard
=
HYBRID_TAG_MAP
.write
()
.unwrap
();
match
map_guard
.get_mut
(
&
tag
)
{
match
map_guard
.get_mut
(
tag
)
{
Some
(
hybrid_ty_
)
=>
{
hybrid_ty_
.fix_tys
.clear
();
hybrid_ty_
.fix_tys
.append
(
&
mut
fix_tys
);
...
...
src/vm/api/api_impl/muirbuilder.rs
View file @
50b5f20f
...
...
@@ -544,7 +544,7 @@ struct BundleLoader<'lb, 'lvm> {
built_globals
:
IdPMap
<
Value
>
,
built_funcs
:
IdBMap
<
MuFunction
>
,
built_funcvers
:
IdBMap
<
MuFunctionVersion
>
,
struct_id_tags
:
Vec
<
(
MuID
,
MuName
)
>
,
struct_
hybrid_
id_tags
:
Vec
<
(
MuID
,
MuName
)
>
,
built_refi64
:
Option
<
P
<
MuType
>>
,
built_i1
:
Option
<
P
<
MuType
>>
,
built_i64
:
Option
<
P
<
MuType
>>
,
...
...
@@ -570,7 +570,7 @@ fn load_bundle(b: &mut MuIRBuilder) {
built_globals
:
Default
::
default
(),
built_funcs
:
Default
::
default
(),
built_funcvers
:
Default
::
default
(),
struct_id_tags
:
Default
::
default
(),
struct_
hybrid_
id_tags
:
Default
::
default
(),
built_refi64
:
Default
::
default
(),
built_i1
:
Default
::
default
(),
built_i64
:
Default
::
default
(),
...
...
@@ -778,13 +778,16 @@ impl<'lb, 'lvm> BundleLoader<'lb, 'lvm> {
}
fn
ensure_names
(
&
mut
self
)
{
// Make sure structs
have names because struct
names are used to resolve cyclic
// Make sure structs
and hybrids have names because
names are used to resolve cyclic
// dependencies.
for
(
id
,
ty
)
in
&
self
.b.bundle.types
{
match
**
ty
{
NodeType
::
TypeStruct
{
id
:
_
,
fieldtys
:
_
}
=>
{
self
.ensure_name
(
*
id
,
"struct"
);
},
NodeType
::
TypeHybrid
{
id
:
_
,
fixedtys
:
_
,
varty
:
_
}
=>
{
self
.ensure_name
(
*
id
,
"struct"
);
},
_
=>
{}
}
}
...
...
@@ -820,9 +823,9 @@ impl<'lb, 'lvm> BundleLoader<'lb, 'lvm> {
}
}
let
struct_
id_tags
=
self
.struct
_id_tags
.drain
(
..
)
.collect
::
<
Vec
<
_
>>
();
for
(
id
,
ref
tag
)
in
struct_id_tags
{
self
.fill_struct
(
id
,
tag
)
let
struct_
hybrid_id_tags
=
self
.struct_hybrid
_id_tags
.drain
(
..
)
.collect
::
<
Vec
<
_
>>
();
for
(
id
,
ref
tag
)
in
struct_
hybrid_
id_tags
{
self
.fill_struct
_hybrid
(
id
,
tag
)
}
for
id
in
self
.b.bundle.sigs
.keys
()
{
...
...
@@ -877,11 +880,14 @@ impl<'lb, 'lvm> BundleLoader<'lb, 'lvm> {
},
NodeType
::
TypeStruct
{
id
:
_
,
fieldtys
:
_
}
=>
{
let
tag
=
self
.get_name
(
id
);
self
.struct_id_tags
.push
((
id
,
tag
.clone
()));
MuType_
::
Struct
(
tag
)
self
.struct_hybrid_id_tags
.push
((
id
,
tag
.clone
()));
MuType_
::
mustruct_empty
(
tag
)
// MuType_::Struct(tag)
},
NodeType
::
TypeHybrid
{
id
:
_
,
ref
fixedtys
,
varty
}
=>
{
unimplemented!
()
NodeType
::
TypeHybrid
{
id
:
_
,
fixedtys
:
_
,
varty
:
_
}
=>
{
let
tag
=
self
.get_name
(
id
);
self
.struct_hybrid_id_tags
.push
((
id
,
tag
.clone
()));
MuType_
::
hybrid_empty
(
tag
)
// let impl_fixedtys = fixedtys.iter().map(|t| self.ensure_type_rec(*t)).collect::<Vec<_>>();
// let impl_varty = self.ensure_type_rec(varty);
// MuType_::Hybrid(impl_fixedtys, impl_varty)
...
...
@@ -955,34 +961,35 @@ impl<'lb, 'lvm> BundleLoader<'lb, 'lvm> {
}
}
fn
fill_struct
(
&
mut
self
,
id
:
MuID
,
tag
:
&
MuName
)
{
fn
fill_struct
_hybrid
(
&
mut
self
,
id
:
MuID
,
tag
:
&
MuName
)
{
let
ty
=
self
.b.bundle.types
.get
(
&
id
)
.unwrap
();
trace!
(
"Filling struct {} {:?}"
,
id
,
ty
);
trace!
(
"Filling struct
or hybrid
{} {:?}"
,
id
,
ty
);
match
**
ty
{
NodeType
::
TypeStruct
{
id
:
_
,
ref
fieldtys
}
=>
{
NodeType
::
TypeStruct
{
id
:
_
,
ref
fieldtys
}
=>
{
let
fieldtys_impl
=
fieldtys
.iter
()
.map
(|
fid
|
{
self
.ensure_type_rec
(
*
fid
)
})
.collect
::
<
Vec
<
_
>>
();
let
struct_ty_
=
StructType_
::
new
(
fieldtys_impl
);
match
STRUCT_TAG_MAP
.read
()
.unwrap
()
.get
(
tag
)
{
Some
(
old_struct_ty_
)
=>
{
if
struct_ty_
!=
*
old_struct_ty_
{
panic!
(
"trying to insert {:?} as {}, while the old struct is defined as {:?}"
,
struct_ty_
,
tag
,
old_struct_ty_
)
}
},
None
=>
{}
}
STRUCT_TAG_MAP
.write
()
.unwrap
()
.insert
(
tag
.clone
(),
struct_ty_
);
MuType_
::
mustruct_put
(
tag
,
fieldtys_impl
);
trace!
(
"Struct {} filled: {:?}"
,
id
,
STRUCT_TAG_MAP
.read
()
.unwrap
()
.get
(
tag
));
},
ref
t
=>
panic!
(
"{} {:?} should be a Struct type"
,
id
,
ty
),
NodeType
::
TypeHybrid
{
id
:
_
,
ref
fixedtys
,
varty
}
=>
{
let
fixedtys_impl
=
fixedtys
.iter
()
.map
(|
fid
|
{
self
.ensure_type_rec
(
*
fid
)
})
.collect
::
<
Vec
<
_
>>
();
let
varty_impl
=
self
.ensure_type_rec
(
varty
);
MuType_
::
hybrid_put
(
tag
,
fixedtys_impl
,
varty_impl
);
trace!
(
"Hybrid {} filled: {:?}"
,
id
,
HYBRID_TAG_MAP
.read
()
.unwrap
()
.get
(
tag
));
},
ref
t
=>
panic!
(
"{} {:?} should be a Struct or Hybrid type"
,
id
,
ty
),
}
}
...
...
@@ -1530,28 +1537,30 @@ impl<'lb, 'lvm> BundleLoader<'lb, 'lvm> {
}
},
NodeInst
::
NodeGetFieldIRef
{
id
:
_
,
result_id
,
is_ptr
,
refty
,
index
,
opnd
}
=>
{
unimplemented!
()
// let impl_opnd = self.get_treenode(fcb, opnd);
// let impl_index = self.ensure_constint_of(index as u64);
// let refty_node = self.b.bundle.types.get(&refty).unwrap();
// let field_ty_id = match **refty_node {
// NodeType::TypeStruct { id: _, ref fieldtys } => {
// fieldtys[index as usize]
// },
// ref t => panic!("GETFIELDIREF {}: Expected struct type. actual: {:?}", id, t)
// };
// let impl_rvtype = self.ensure_iref_or_uptr(field_ty_id, is_ptr);
// let impl_rv = self.new_ssa(fcb, result_id, impl_rvtype).clone_value();
// Instruction {
// hdr: hdr,
// value: Some(vec![impl_rv]),
// ops: RwLock::new(vec![impl_opnd, impl_index]),
// v: Instruction_::GetFieldIRef {
// is_ptr: is_ptr,
// base: 0,
// index: 1,
// },
// }
let
impl_opnd
=
self
.get_treenode
(
fcb
,
opnd
);
let
index
=
index
as
usize
;
let
refty_node
=
self
.b.bundle.types
.get
(
&
refty
)
.unwrap
();
let
field_ty_id
=
match
**
refty_node
{
NodeType
::
TypeStruct
{
id
:
_
,
ref
fieldtys
}
=>
{
fieldtys
[
index
]
},
NodeType
::
TypeHybrid
{
id
:
_
,
ref
fixedtys
,
varty
:
_
}
=>
{
fixedtys
[
index
]
},
ref
t
=>
panic!
(
"GETFIELDIREF {}: Expected struct or hybrid type. actual: {:?}"
,
id
,
t
)
};
let
impl_rvtype
=
self
.ensure_iref_or_uptr
(
field_ty_id
,
is_ptr
);
let
impl_rv
=
self
.new_ssa
(
fcb
,
result_id
,
impl_rvtype
)
.clone_value
();
Instruction
{
hdr
:
hdr
,
value
:
Some
(
vec!
[
impl_rv
]),
ops
:
RwLock
::
new
(
vec!
[
impl_opnd
]),
v
:
Instruction_
::
GetFieldIRef
{
is_ptr
:
is_ptr
,
base
:
0
,
index
:
index
,
},
}
},
NodeInst
::
NodeGetElemIRef
{
id
:
_
,
result_id
,
is_ptr
,
refty
,
indty
:
_
,
opnd
,
index
}
=>
{
let
impl_opnd
=
self
.get_treenode
(
fcb
,
opnd
);
...
...
tests/test_ir/test_builder_api.rs
View file @
50b5f20f
...
...
@@ -110,6 +110,13 @@ fn test_types_sigs_loading() {
ptys
.as_mut_ptr
(),
ptys
.len
(),
rtys
.as_mut_ptr
(),
rtys
.len
());
((
*
b
)
.new_type_ufuncptr
)(
b
,
id9
,
id8
);
let
id10
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@hyb1"
));
let
id11
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@rhyb1"
));
let
mut
fixeds
=
vec!
[
id2
,
id2
];
((
*
b
)
.new_type_hybrid
)(
b
,
id10
,
fixeds
.as_mut_ptr
(),
fixeds
.len
(),
id1
);
((
*
b
)
.new_type_ref
)(
b
,
id11
,
id10
);
((
*
b
)
.load
)(
b
);
((
*
ctx
)
.close_context
)(
ctx
);
...
...
@@ -530,11 +537,28 @@ fn test_insts_new() {
let
b
=
((
*
ctx
)
.new_ir_builder
)(
ctx
);
let
id_float
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@float"
));
let
id_i8
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@i8"
));
let
id_i32
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@i32"
));
let
id_i64
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@i64"
));
let
id_s
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@s"
));
let
id_a
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@a"
));
let
id_h
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@h"
));
let
id_sig
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@sig"
));
let
id_func
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func"
));
((
*
b
)
.new_type_float
)(
b
,
id_float
);
((
*
b
)
.new_type_int
)(
b
,
id_i8
,
8
);
((
*
b
)
.new_type_int
)(
b
,
id_i32
,
32
);
((
*
b
)
.new_type_int
)(
b
,
id_i64
,
64
);
{
let
mut
fields
=
vec!
[
id_i32
,
id_a
,
id_i64
];
((
*
b
)
.new_type_struct
)(
b
,
id_s
,
fields
.as_mut_ptr
(),
fields
.len
());
((
*
b
)
.new_type_hybrid
)(
b
,
id_h
,
fields
.as_mut_ptr
(),
fields
.len
(),
id_i8
);
}
((
*
b
)
.new_type_array
)(
b
,
id_a
,
id_float
,
4
);
let
mut
ptys
=
vec!
[];
let
mut
rtys
=
vec!
[];
...
...
@@ -542,6 +566,11 @@ fn test_insts_new() {
ptys
.as_mut_ptr
(),
ptys
.len
(),
rtys
.as_mut_ptr
(),
rtys
.len
());
let
id_consti64_3
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@CONSTI64_3"
));
((
*
b
)
.new_const_int
)(
b
,
id_consti64_3
,
id_i64
,
3
);
let
id_consti64_4
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@CONSTI64_4"
));
((
*
b
)
.new_const_int
)(
b
,
id_consti64_4
,
id_i64
,
4
);
((
*
b
)
.new_func
)(
b
,
id_func
,
id_sig
);
let
id_funcver
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1"
));
...
...
@@ -557,18 +586,57 @@ fn test_insts_new() {
let
mut
args
=
vec!
[];
let
mut
argtys
=
vec!
[];
let
id_new
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.new"
));
let
id_ret
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.ret"
));
let
mut
insts
=
vec!
[
id_new
,
id_ret
];
let
id_new
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.new"
));
let
id_newhybrid
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.newhybrid"
));
let
id_getiref1
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getiref1"
));
let
id_getiref2
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getiref2"
));
let
id_getfieldiref1
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getfieldiref1"
));
let
id_getfieldiref2
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getfieldiref2"
));
let
id_getelemiref
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getelemiref"
));
let
id_getvarpartiref
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.getvarpartiref"
));
let
id_shiftiref
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.shiftiref"
));
let
id_ret
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.ret"
));
let
mut
insts
=
vec!
[
id_new
,
id_newhybrid
,
id_getiref1
,
id_getiref2
,
id_getfieldiref1
,
id_getfieldiref2
,
id_getelemiref
,
id_getvarpartiref
,
id_shiftiref
,
id_ret
,
];
((
*
b
)
.new_bb
)(
b
,
id_entry
,
args
.as_mut_ptr
(),
argtys
.as_mut_ptr
(),
args
.len
(),
0
,
insts
.as_mut_ptr
(),
insts
.len
());
let
id_x
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.x"
));
let
id_v_r1
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.r1"
));
let
id_v_r2
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.r2"
));
let
id_v_i1
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.i1"
));
let
id_v_i2
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.i2"
));
let
id_v_f1
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.f1"
));
let
id_v_f2
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.f2"
));
let
id_v_e
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.e"
));
let
id_v_v
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.v"
));
let
id_v_s
=
((
*
b
)
.gen_sym
)(
b
,
csp
.get
(
"@func.v1.entry.s"
));
((
*
b
)
.new_new
)(
b
,
id_new
,
id_v_r1
,
id_s
,
0
);
((
*
b
)
.new_newhybrid
)(
b
,
id_newhybrid
,
id_v_r2
,
id_h
,
id_i64
,
id_consti64_4
,
0
);
((
*
b
)
.new_getiref
)(
b
,
id_getiref1
,
id_v_i1
,
id_s
,
id_v_r1
);
((
*
b
)
.new_getiref
)(
b
,
id_getiref2
,
id_v_i2
,
id_h
,
id_v_r2
);
((
*
b
)
.new_getfieldiref
)(
b
,
id_getfieldiref1
,
id_v_f1
,
0
,
id_s
,
1
,
id_v_i1
);
((
*
b
)
.new_getfieldiref
)(
b
,
id_getfieldiref2
,
id_v_f2
,
0
,
id_h
,
2
,
id_v_i2
);
((
*
b
)
.new_getelemiref
)(
b
,
id_getelemiref
,
id_v_e
,
0
,
id_a
,
id_i64
,
id_v_f1
,
id_consti64_3
);
((
*
b
)
.new_new
)(
b
,
id_new
,
id_x
,
id_i32
,
0
);
((
*
b
)
.new_getvarpartiref
)(
b
,
id_getvarpartiref
,
id_v_v
,
0
,
id_h
,
id_v_i2
);
((
*
b
)
.new_shiftiref
)(
b
,
id_shiftiref
,
id_v_s
,
0
,
id_i8
,
id_i64
,
id_v_v
,
id_consti64_3
);
{
let
mut
args
=
vec!
[];
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment