Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mu-impl-ref2
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
5
Issues
5
List
Boards
Labels
Milestones
Merge Requests
2
Merge Requests
2
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
mu
mu-impl-ref2
Commits
60d6faa0
Commit
60d6faa0
authored
Oct 30, 2015
by
Kunshan Wang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
WIP: Syntax for multiple returns.
parent
9c937dd9
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
142 additions
and
113 deletions
+142
-113
README.md
README.md
+12
-11
build.sbt
build.sbt
+7
-0
src/main/antlr4/UIR.g4
src/main/antlr4/UIR.g4
+25
-16
src/main/scala/uvm/Identified.scala
src/main/scala/uvm/Identified.scala
+8
-0
src/main/scala/uvm/controlFlow.scala
src/main/scala/uvm/controlFlow.scala
+5
-8
src/main/scala/uvm/ir/textinput/UIRTextReader.scala
src/main/scala/uvm/ir/textinput/UIRTextReader.scala
+41
-36
src/main/scala/uvm/ssavariables/ssavariables.scala
src/main/scala/uvm/ssavariables/ssavariables.scala
+39
-36
src/main/scala/uvm/types/types.scala
src/main/scala/uvm/types/types.scala
+5
-6
No files found.
README.md
View file @
60d6faa0
...
...
@@ -4,8 +4,9 @@ Mu Reference Implementation version 2
This project is the current reference implementation of Mu, the micro virtual
machine designed by
[
The Micro Virtual Machine Project
](
http://microvm.org
)
.
Version 2.1.x implements the latest revision of the
[
Mu Specification version
2
](
https://github.com/microvm/microvm-spec/wiki
)
.
Version 2.1.x implements the
[
goto-with-value form of the Mu
Specification
](
https://github.com/microvm/microvm-spec/tree/goto-with-values
)
,
which will eventually become the main line.
This project is based on the previous works of
[
simplest-microvm-project
](
https://github.com/microvm/simplest-microvm-project
)
.
...
...
@@ -33,9 +34,7 @@ git clone git@github.com:microvm/microvm-refimpl2.git
*
In the directory
`microvm-refimpl2`
, do the following:
```
bash
sbt update
sbt antlr4:antlr4Generate
sbt eclipse
sbt update genSrc eclipse
```
*
Open Scala IDE and import the generated project as "existing project into
...
...
@@ -51,14 +50,16 @@ yum, pacman, etc. for GNU/Linux distributions and Homebrew for Mac OS X).
To download all dependencies from the Maven central repository, invoke
`sbt
update`
.
To compile, invoke
`sbt compile`
or do this in your favourite IDE. This will
also generate the Mu IR parser from the Antlr grammar. The generated sources
will be in the
`target/scala-2.11/src_managed`
directory.
To generate the Mu IR parser from the Antlr grammar, invoke
`sbt genSrc`
. The
generated sources will be in the
`target/scala-2.11/src_managed`
directory.
To generate an Eclipse project, install the
[
sbt-eclipse
plugin
](
https://github.com/typesafehub/sbteclipse
)
and invoke
`sbt eclipse`
. By
default, it should automatically put the managed source directory to the source
paths, too.
plugin
](
https://github.com/typesafehub/sbteclipse
)
and invoke
`sbt eclipse`
.
Make sure you generate the parser before creating the Eclipse project, so that
the generated sources will be on the Eclipse build path.
To compile, invoke
`sbt compile`
. This will also generate the Mu IR parser using
Antlr.
IntelliJ IDEA has plugins for Scala and SBT. Make sure you don't commit
`.idea`
or generated project files into the repository.
...
...
build.sbt
View file @
60d6faa0
lazy
val
genSrc
=
taskKey
[
List
[
File
]](
"generate sources"
)
genSrc
<<=
(
sourceGenerators
in
Compile
)
{
_
.
join
.
map
(
_
.
flatten
.
toList
)
}
lazy
val
root
=
(
project
in
file
(
"."
)).
settings
(
organization
:=
"org.microvm"
,
...
...
@@ -30,3 +35,5 @@ lazy val root = (project in file(".")).settings(
antlr4GenVisitor
in
Antlr4
:=
false
)
src/main/antlr4/UIR.g4
View file @
60d6faa0
...
...
@@ -51,7 +51,7 @@ typeConstructor
| 'weakref' '<' ty=type '>' # TypeWeakRef
| 'struct' '<' fieldTys+=type+ '>' # TypeStruct
| 'array' '<' ty=type length=intLiteral '>' # TypeArray
| 'hybrid' '<' fi
xedTy=type varTy=type '>'
# TypeHybrid
| 'hybrid' '<' fi
eldTys+=type* varTy=type '>'
# TypeHybrid
| 'void' # TypeVoid
| 'funcref' '<' funcSig '>' # TypeFuncRef
| 'threadref' # TypeThreadRef
...
...
@@ -63,7 +63,7 @@ typeConstructor
;
funcSigConstructor
:
retTy=type '(' (paramTys+=type*)
')'
:
'(' paramTys+=type* ')' '->' '(' retTys+=type*
')'
;
constConstructor
...
...
@@ -103,23 +103,28 @@ label
;
bbParam
: '<' type '>' name
: '<' ty
=ty
pe '>' name
;
excParam
: '[' name ']'
;
instResults
: results+=name
| '(' results+=name* ')'
;
inst
: (
name '=
')? instBody
: (
instResults '=')? ('[' name ']
')? instBody
;
instBody
// Integer/FP Arithmetic
: binop '<' type '>' op1=value op2=value excClause # InstBinOp
: binop '<' ty
=ty
pe '>' op1=value op2=value excClause # InstBinOp
// Integer/FP Comparison
| cmpop '<' type '>' op1=value op2=value # InstCmp
| cmpop '<' ty
=ty
pe '>' op1=value op2=value # InstCmp
// Conversions
| convop '<' fromTy=type toTy=type '>' opnd=value # InstConversion
...
...
@@ -130,14 +135,14 @@ instBody
// Intra-function Control Flow
| 'BRANCH' dest=destClause # InstBranch
| 'BRANCH2' cond=value ifTrue=destClause ifFalse=destClause # InstBranch2
| 'SWITCH' '<' type '>' opnd=value defDest=destClause '{'
| 'SWITCH' '<' ty
=ty
pe '>' opnd=value defDest=destClause '{'
(caseVal+=value caseDest+=destClause )* '}' # InstSwitch
// Inter-function Control Flow
| 'CALL' funcCallBody excClause keepAliveClause # InstCall
| 'TAILCALL' funcCallBody # InstTailCall
| 'RET' retVal
=value
# InstRet
| 'RET' retVal
s
# InstRet
| 'THROW' exc=value # InstThrow
// Aggregate Operations
...
...
@@ -158,7 +163,6 @@ instBody
| 'GETFIELDIREF' (ptr='PTR'?) '<' refTy=type index=intLiteral '>' opnd=value # InstGetFieldIRef
| 'GETELEMIREF' (ptr='PTR'?) '<' refTy=type indTy=type '>' opnd=value index=value # InstGetElemIRef
| 'SHIFTIREF' (ptr='PTR'?) '<' refTy=type offTy=type '>' opnd=value offset=value # InstShiftIRef
| 'GETFIXEDPARTIREF' (ptr='PTR'?) '<' refTy=type '>' opnd=value # InstGetFixedPartIRef
| 'GETVARPARTIREF' (ptr='PTR'?) '<' refTy=type '>' opnd=value # InstGetVarPartIRef
| 'LOAD' (ptr='PTR'?) memord? '<' type '>' loc=value excClause # InstLoad
...
...
@@ -170,20 +174,25 @@ instBody
| 'FENCE' memord # InstFence
// Trap
| 'TRAP'
'<' type '>'
excClause keepAliveClause # InstTrap
| 'WATCHPOINT' wpid=intLiteral
'<' type '>'
| 'TRAP'
typeList
excClause keepAliveClause # InstTrap
| 'WATCHPOINT' wpid=intLiteral
typeList
dis=destClause ena=destClause ('WPEXC' '(' wpExc=destClause ')')? keepAliveClause # InstWatchPoint
// Foreign Function Interface
| 'CCALL' callConv=flag '<' funcTy=type funcSig '>' callee=value argList keepAliveClause # InstCCall
| 'CCALL' callConv=flag '<' funcTy=type funcSig '>' callee=value argList
excClause
keepAliveClause # InstCCall
// Thread and Stack Operations
| 'NEW
STACK' funcCallBody excClause # InstNewStack
| 'NEW
THREAD' stack=value newStackClause excClause # InstNewThread
| 'SWAPSTACK' swappee=value curStackClause newStackClause excClause keepAliveClause # InstSwapStack
// Common Instructions
| 'COMMINST' nam=GLOBAL_NAME flagList? typeList? funcSigList? argList? excClause keepAliveClause # InstCommInst
;
retVals
: '(' vals+=value* ')'
| vals+=value
;
destClause
: bb argList
...
...
@@ -226,12 +235,12 @@ argList
;
curStackClause
: 'RET_WITH'
'<' type '>'
# CurStackRetWith
| 'KILL_OLD' # CurStackKillOld
: 'RET_WITH'
typeList
# CurStackRetWith
| 'KILL_OLD'
# CurStackKillOld
;
newStackClause
: 'PASS_VALUE
' '<' type '>' value
# NewStackPassValue
: 'PASS_VALUE
S' typeList argList
# NewStackPassValue
| 'THROW_EXC' exc=value # NewStackThrowExc
;
...
...
src/main/scala/uvm/Identified.scala
View file @
60d6faa0
...
...
@@ -5,6 +5,14 @@ trait Identified {
def
name
:
Option
[
String
]
def
repr
:
String
=
"[%d:%s]"
.
format
(
id
,
name
.
getOrElse
(
"_"
))
// Identified objects should use reference equality rather than structural equality. (case classes use the latter)
override
def
hashCode
()
:
Int
=
if
(
id
!=
0
)
id
else
System
.
identityHashCode
(
this
)
override
def
equals
(
that
:
Any
)
:
Boolean
=
that
match
{
case
v
:
AnyRef
=>
this
eq
v
case
_
=>
false
}
override
def
toString
=
"%s%s"
.
format
(
this
.
getClass
.
getSimpleName
,
this
.
repr
)
}
trait
IdentifiedSettable
extends
Identified
{
...
...
src/main/scala/uvm/controlFlow.scala
View file @
60d6faa0
...
...
@@ -3,18 +3,15 @@ package uvm
import
uvm.types._
import
uvm.ssavariables._
case
class
FuncSig
(
var
retTy
:
Type
,
var
paramTy
:
Seq
[
Type
])
extends
IdentifiedSettable
{
case
class
FuncSig
(
var
paramTys
:
Seq
[
Type
],
var
retTys
:
Seq
[
Type
])
extends
IdentifiedSettable
{
override
final
def
toString
:
String
=
FuncSig
.
prettyPrint
(
this
)
override
def
hashCode
()
:
Int
=
System
.
identityHashCode
(
this
)
override
def
equals
(
that
:
Any
)
:
Boolean
=
that
match
{
case
v
:
AnyRef
=>
this
eq
v
case
_
=>
false
}
}
object
FuncSig
{
def
prettyPrint
(
sig
:
FuncSig
)
:
String
=
"%s (%s)"
.
format
(
sig
.
retTy
.
repr
,
sig
.
paramTy
.
map
(
_
.
repr
).
mkString
(
" "
))
def
prettyPrint
(
sig
:
FuncSig
)
:
String
=
{
def
mkReprList
(
is
:
Seq
[
Identified
])
:
String
=
is
.
map
(
_
.
repr
).
mkString
(
" "
)
"(%s) -> (%s)"
.
format
(
mkReprList
(
sig
.
paramTys
),
mkReprList
(
sig
.
retTys
))
}
}
class
Function
extends
GlobalVariable
{
...
...
src/main/scala/uvm/ir/textinput/UIRTextReader.scala
View file @
60d6faa0
...
...
@@ -241,7 +241,7 @@ class UIRTextReader(val idFactory: IDFactory) {
case
t
:
TypeWeakRefContext
=>
TypeWeakRef
(
null
).
later
(
phase1
)
{
_
.
ty
=
t
.
ty
}
case
t
:
TypeStructContext
=>
TypeStruct
(
null
).
later
(
phase1
)
{
_
.
fieldTys
=
t
.
fieldTys
.
map
(
resTy
)
}
case
t
:
TypeArrayContext
=>
TypeArray
(
null
,
t
.
length
.
longValue
()).
later
(
phase1
)
{
_
.
elemTy
=
t
.
ty
}
case
t
:
TypeHybridContext
=>
TypeHybrid
(
null
,
null
).
later
(
phase1
)
{
tt
=>
tt
.
fi
xedTy
=
t
.
fixedTy
;
tt
.
varTy
=
t
.
varTy
}
case
t
:
TypeHybridContext
=>
TypeHybrid
(
null
,
null
).
later
(
phase1
)
{
tt
=>
tt
.
fi
eldTys
=
t
.
fieldTys
.
map
(
resTy
)
;
tt
.
varTy
=
t
.
varTy
}
case
t
:
TypeVoidContext
=>
TypeVoid
()
case
t
:
TypeFuncRefContext
=>
TypeFuncRef
(
null
).
later
(
phase1
)
{
_
.
sig
=
t
.
funcSig
()
}
case
t
:
TypeThreadRefContext
=>
TypeThreadRef
()
...
...
@@ -257,8 +257,8 @@ class UIRTextReader(val idFactory: IDFactory) {
def
mkSig
(
fsc
:
FuncSigConstructorContext
)
:
FuncSig
=
{
val
sig
=
FuncSig
(
null
,
null
).
later
(
phase1
)
{
sig
=>
sig
.
retTy
=
resTy
(
fsc
.
retTy
)
sig
.
paramTy
=
for
(
t
<-
fsc
.
paramTys
)
yield
resTy
(
t
)
sig
.
retTy
s
=
for
(
t
<-
fsc
.
retTys
)
yield
resTy
(
t
)
sig
.
paramTy
s
=
for
(
t
<-
fsc
.
paramTys
)
yield
resTy
(
t
)
}
return
sig
}
...
...
@@ -285,19 +285,11 @@ class UIRTextReader(val idFactory: IDFactory) {
def
mkConst
(
t
:
Type
,
c
:
ConstConstructorContext
)
:
Constant
=
{
val
con
=
c
match
{
case
cc
:
CtorIntContext
=>
t
match
{
case
_:
TypeInt
=>
ConstInt
(
t
,
cc
.
intLiteral
)
case
_:
AbstractPointerType
=>
ConstPointer
(
t
,
cc
.
intLiteral
().
longValue
())
}
case
cc
:
CtorIntContext
=>
ConstInt
(
t
,
cc
.
intLiteral
)
case
cc
:
CtorFloatContext
=>
ConstFloat
(
t
,
cc
.
floatLiteral
)
case
cc
:
CtorDoubleContext
=>
ConstDouble
(
t
,
cc
.
doubleLiteral
)
case
cc
:
CtorListContext
=>
t
match
{
case
_:
TypeStruct
=>
ConstStruct
(
t
,
null
).
later
(
phase2
)
{
_
.
fields
=
for
(
gn
<-
cc
.
GLOBAL_NAME
())
yield
resGlobalVar
(
gn
)
}
case
_:
TypeArray
|
_
:
TypeVector
=>
ConstSeq
(
t
,
null
).
later
(
phase2
)
{
_
.
elems
=
for
(
gn
<-
cc
.
GLOBAL_NAME
())
yield
resGlobalVar
(
gn
)
}
case
cc
:
CtorListContext
=>
ConstSeq
(
t
,
null
).
later
(
phase2
)
{
_
.
elems
=
for
(
gn
<-
cc
.
GLOBAL_NAME
())
yield
resGlobalVar
(
gn
)
}
case
_:
CtorNullContext
=>
ConstNull
(
t
)
}
...
...
@@ -474,6 +466,20 @@ class UIRTextReader(val idFactory: IDFactory) {
Some
(
ExcClause
(
ec
.
nor
,
ec
.
exc
))
}
implicit
def
resNewStackClause
(
nsc
:
NewStackClauseContext
)
:
NewStackAction
=
{
nsc
match
{
case
a
:
NewStackPassValueContext
=>
PassValues
(
a
.
typeList
(),
a
.
argList
())
case
a
:
NewStackThrowExcContext
=>
ThrowExc
(
a
.
exc
)
}
}
implicit
def
resCurStackClause
(
csc
:
CurStackClauseContext
)
:
CurStackAction
=
{
csc
match
{
case
a
:
CurStackRetWithContext
=>
RetWith
(
a
.
typeList
())
case
a
:
CurStackKillOldContext
=>
KillOld
()
}
}
// Make instruction
def
mkInst
(
bb
:
BasicBlock
,
instDef
:
InstContext
)
:
Instruction
=
{
...
...
@@ -519,7 +525,7 @@ class UIRTextReader(val idFactory: IDFactory) {
}
case
ii
:
InstRetContext
=>
InstRet
(
ver
,
null
).
later
(
phase4
)
{
i
=>
i
.
retVal
=
ii
.
retVal
i
.
retVal
s
=
ii
.
retVals
.
vals
.
map
(
resVar
)
}
case
ii
:
InstThrowContext
=>
InstThrow
(
null
).
later
(
phase4
)
{
i
=>
...
...
@@ -577,10 +583,6 @@ class UIRTextReader(val idFactory: IDFactory) {
InstShiftIRef
(
ii
.
ptr
!=
null
,
ii
.
refTy
,
needInt
(
ii
.
offTy
),
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
opnd
=
ii
.
opnd
;
i
.
offset
=
ii
.
offset
}
case
ii
:
InstGetFixedPartIRefContext
=>
InstGetFixedPartIRef
(
ii
.
ptr
!=
null
,
needHybrid
(
ii
.
refTy
),
null
).
later
(
phase4
)
{
i
=>
i
.
opnd
=
ii
.
opnd
}
case
ii
:
InstGetVarPartIRefContext
=>
InstGetVarPartIRef
(
ii
.
ptr
!=
null
,
needHybrid
(
ii
.
refTy
),
null
).
later
(
phase4
)
{
i
=>
i
.
opnd
=
ii
.
opnd
...
...
@@ -608,33 +610,28 @@ class UIRTextReader(val idFactory: IDFactory) {
case
ii
:
InstFenceContext
=>
InstFence
(
ii
.
memord
)
case
ii
:
InstTrapContext
=>
InstTrap
(
ii
.
`type`
,
null
,
null
).
later
(
phase4
)
{
i
=>
InstTrap
(
ii
.
typeList
()
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
excClause
=
ii
.
excClause
;
i
.
keepAlives
=
ii
.
keepAliveClause
}
case
ii
:
InstWatchPointContext
=>
InstWatchPoint
(
ii
.
intLiteral
.
intValue
(),
ii
.
`type`
,
null
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
InstWatchPoint
(
ii
.
intLiteral
.
intValue
(),
ii
.
typeList
()
,
null
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
dis
=
ii
.
dis
;
i
.
ena
=
ii
.
ena
;
i
.
exc
=
Option
(
ii
.
wpExc
).
map
(
resDestClause
);
i
.
keepAlives
=
ii
.
keepAliveClause
}
case
ii
:
InstCCallContext
=>
InstCCall
(
ii
.
callConv
,
ii
.
funcTy
,
ii
.
funcSig
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
callee
=
ii
.
callee
;
i
.
argList
=
ii
.
argList
;
i
.
keepAlives
=
ii
.
keepAliveClause
InstCCall
(
ii
.
callConv
,
ii
.
funcTy
,
ii
.
funcSig
,
null
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
callee
=
ii
.
callee
;
i
.
argList
=
ii
.
argList
;
i
.
excClause
=
ii
.
excClause
;
i
.
keepAlives
=
ii
.
keepAliveClause
}
case
ii
:
InstNewStackContext
=>
InstNewStack
(
null
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
asgnFuncCallBody
(
i
,
ii
.
funcCallBody
)
case
ii
:
InstNewThreadContext
=>
InstNewThread
(
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
stack
=
ii
.
stack
i
.
newStackAction
=
ii
.
newStackClause
i
.
excClause
=
ii
.
excClause
}
case
ii
:
InstSwapStackContext
=>
InstSwapStack
(
null
,
null
,
null
,
null
,
null
).
later
(
phase4
)
{
i
=>
i
.
swappee
=
ii
.
swappee
;
i
.
curStackAction
=
ii
.
curStackClause
match
{
case
a
:
CurStackRetWithContext
=>
RetWith
(
a
.
`type`
)
case
a
:
CurStackKillOldContext
=>
KillOld
()
}
i
.
newStackAction
=
ii
.
newStackClause
match
{
case
a
:
NewStackPassValueContext
=>
PassValue
(
a
.
`type`
,
a
.
value
)
case
a
:
NewStackThrowExcContext
=>
ThrowExc
(
a
.
exc
)
}
i
.
swappee
=
ii
.
swappee
i
.
curStackAction
=
ii
.
curStackClause
i
.
newStackAction
=
ii
.
newStackClause
i
.
excClause
=
ii
.
excClause
;
i
.
keepAlives
=
ii
.
keepAliveClause
}
case
ii
:
InstCommInstContext
=>
...
...
@@ -649,7 +646,15 @@ class UIRTextReader(val idFactory: IDFactory) {
inst
.
id
=
idFactory
.
getID
()
inst
.
name
=
Option
(
instDef
.
name
).
map
(
n
=>
globalize
(
n
.
getText
,
bbName
))
bb
.
localVarNs
.
add
(
inst
)
for
((
instResDef
,
index
)
<-
instDef
.
instResults
().
results
.
zipWithIndex
)
{
val
resName
=
globalize
(
instResDef
.
getText
,
bbName
)
val
instRes
=
InstResult
(
inst
,
index
)
instRes
.
id
=
idFactory
.
getID
()
instRes
.
name
=
Some
(
resName
)
bb
.
localVarNs
.
add
(
instRes
)
}
return
inst
}
...
...
src/main/scala/uvm/ssavariables/ssavariables.scala
View file @
60d6faa0
...
...
@@ -4,14 +4,7 @@ import uvm._
import
uvm.comminsts._
import
uvm.types._
abstract
class
SSAVariable
extends
IdentifiedSettable
{
override
def
hashCode
()
:
Int
=
id
override
def
equals
(
that
:
Any
)
:
Boolean
=
that
match
{
case
v
:
AnyRef
=>
this
eq
v
case
_
=>
false
}
override
def
toString
=
"%s%s"
.
format
(
this
.
getClass
.
getSimpleName
,
this
.
repr
)
}
abstract
class
SSAVariable
extends
IdentifiedSettable
// Global variables: Constants, Global Cells and Functions (Function is defined in controlFlow.scala)
...
...
@@ -21,19 +14,18 @@ abstract class Constant extends GlobalVariable {
var
constTy
:
Type
}
/** For both int<n> and pointers. Convert to Long when needed. */
case
class
ConstInt
(
var
constTy
:
Type
,
var
num
:
BigInt
)
extends
Constant
case
class
ConstFloat
(
var
constTy
:
Type
,
var
num
:
Float
)
extends
Constant
case
class
ConstDouble
(
var
constTy
:
Type
,
var
num
:
Double
)
extends
Constant
case
class
ConstStruct
(
var
constTy
:
Type
,
var
fields
:
Seq
[
GlobalVariable
])
extends
Constant
case
class
ConstNull
(
var
constTy
:
Type
)
extends
Constant
/** For struct, array and vector. */
case
class
ConstSeq
(
var
constTy
:
Type
,
var
elems
:
Seq
[
GlobalVariable
])
extends
Constant
case
class
ConstPointer
(
var
constTy
:
Type
,
var
addr
:
Long
)
extends
Constant
/** For all NULL-able values. Note: null pointers are ConstInt(???, 0) */
case
class
ConstNull
(
var
constTy
:
Type
)
extends
Constant
case
class
GlobalCell
(
var
cellTy
:
Type
)
extends
GlobalVariable
...
...
@@ -47,9 +39,13 @@ abstract class Parameter extends LocalVariable
case
class
NorParam
(
ty
:
Type
)
extends
Parameter
case
class
ExcParam
()
extends
Parameter
case
class
InstResult
(
inst
:
Instruction
,
index
:
Int
)
extends
LocalVariable
// Instructions
abstract
class
Instruction
extends
LocalVariable
abstract
class
Instruction
extends
IdentifiedSettable
{
var
results
:
Seq
[
InstResult
]
=
Seq
()
}
/// enumerations
...
...
@@ -93,6 +89,11 @@ import uvm.ssavariables.AtomicRMWOptr.AtomicRMWOptr
/// Abstract instructions and traits
trait
MaybeTerminator
extends
Instruction
trait
Terminator
extends
MaybeTerminator
trait
OSRPoint
extends
Instruction
trait
HasTypeList
extends
Instruction
{
var
typeList
:
Seq
[
Type
]
}
...
...
@@ -110,7 +111,7 @@ case class DestClause(val bb: BasicBlock, val args: Seq[SSAVariable])
case
class
ExcClause
(
val
nor
:
DestClause
,
val
exc
:
DestClause
)
trait
HasExcClause
extends
Instruction
{
trait
HasExcClause
extends
Instruction
with
MaybeTerminator
{
var
excClause
:
Option
[
ExcClause
]
}
...
...
@@ -141,16 +142,16 @@ trait WorksWithPointer extends Instruction {
var
ptr
:
Boolean
}
abstract
class
AbstractTrap
extends
HasKeepAliveClause
{
var
retTy
:
Type
abstract
class
AbstractTrap
extends
HasKeepAliveClause
with
OSRPoint
{
var
retTy
s
:
Seq
[
Type
]
}
abstract
class
CurStackAction
case
class
RetWith
(
var
retTy
:
Type
)
extends
CurStackAction
case
class
RetWith
(
var
retTy
s
:
Seq
[
Type
]
)
extends
CurStackAction
case
class
KillOld
()
extends
CurStackAction
abstract
class
NewStackAction
case
class
PassValue
(
var
argTy
:
Type
,
var
arg
:
SSAVariable
)
extends
NewStackAction
case
class
PassValue
s
(
var
argTys
:
Seq
[
Type
],
var
args
:
Seq
[
SSAVariable
]
)
extends
NewStackAction
case
class
ThrowExc
(
var
exc
:
SSAVariable
)
extends
NewStackAction
/**
...
...
@@ -169,21 +170,22 @@ case class InstConv(var op: ConvOptr, var fromTy: Type, var toTy: Type, var opnd
case
class
InstSelect
(
var
condTy
:
Type
,
var
opndTy
:
Type
,
var
cond
:
SSAVariable
,
var
ifTrue
:
SSAVariable
,
var
ifFalse
:
SSAVariable
)
extends
Instruction
case
class
InstBranch
(
var
dest
:
DestClause
)
extends
Instruction
case
class
InstBranch
(
var
dest
:
DestClause
)
extends
Instruction
with
Terminator
case
class
InstBranch2
(
var
cond
:
SSAVariable
,
var
ifTrue
:
DestClause
,
var
ifFalse
:
DestClause
)
extends
Instruction
case
class
InstBranch2
(
var
cond
:
SSAVariable
,
var
ifTrue
:
DestClause
,
var
ifFalse
:
DestClause
)
extends
Instruction
with
Terminator
case
class
InstSwitch
(
var
opndTy
:
Type
,
var
opnd
:
SSAVariable
,
var
defDest
:
DestClause
,
var
cases
:
Seq
[(
SSAVariable
,
DestClause
)])
extends
Instruction
var
cases
:
Seq
[(
SSAVariable
,
DestClause
)])
extends
Instruction
with
Terminator
case
class
InstCall
(
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
],
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractCall
with
HasExcClause
with
HasKeepAliveClause
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractCall
with
HasExcClause
with
HasKeepAliveClause
with
OSRPoint
case
class
InstTailCall
(
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
])
extends
AbstractCall
case
class
InstTailCall
(
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
])
extends
AbstractCall
with
Terminator
case
class
InstRet
(
val
funcVer
:
FuncVer
,
var
retVal
:
SSAVariable
)
extends
AbstractRet
case
class
InstRet
(
val
funcVer
:
FuncVer
,
var
retVal
s
:
Seq
[
SSAVariable
])
extends
AbstractRet
with
Terminator
case
class
InstThrow
(
var
excVal
:
SSAVariable
)
extends
Instruction
case
class
InstThrow
(
var
excVal
:
SSAVariable
)
extends
Instruction
with
Terminator
case
class
InstExtractValue
(
var
strTy
:
TypeStruct
,
var
index
:
Int
,
var
opnd
:
SSAVariable
)
extends
Instruction
...
...
@@ -216,8 +218,6 @@ case class InstGetElemIRef(var ptr: Boolean, var referentTy: AbstractSeqType, va
case
class
InstShiftIRef
(
var
ptr
:
Boolean
,
var
referentTy
:
Type
,
var
offTy
:
TypeInt
,
var
opnd
:
SSAVariable
,
var
offset
:
SSAVariable
)
extends
WorksWithPointer
case
class
InstGetFixedPartIRef
(
var
ptr
:
Boolean
,
var
referentTy
:
TypeHybrid
,
var
opnd
:
SSAVariable
)
extends
WorksWithPointer
case
class
InstGetVarPartIRef
(
var
ptr
:
Boolean
,
var
referentTy
:
TypeHybrid
,
var
opnd
:
SSAVariable
)
extends
WorksWithPointer
case
class
InstLoad
(
var
ptr
:
Boolean
,
var
ord
:
MemoryOrder
,
var
referentTy
:
Type
,
var
loc
:
SSAVariable
,
var
excClause
:
Option
[
ExcClause
])
extends
WorksWithPointer
with
HasExcClause
...
...
@@ -232,20 +232,23 @@ case class InstAtomicRMW(var ptr: Boolean, var ord: MemoryOrder, var op: AtomicR
case
class
InstFence
(
var
ord
:
MemoryOrder
)
extends
Instruction
case
class
InstTrap
(
var
retTy
:
Type
,
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractTrap
with
HasExcClause
case
class
InstTrap
(
var
retTys
:
Seq
[
Type
],
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractTrap
with
HasExcClause
case
class
InstWatchPoint
(
var
wpID
:
Int
,
var
retTy
:
Type
,
case
class
InstWatchPoint
(
var
wpID
:
Int
,
var
retTy
s
:
Seq
[
Type
]
,
var
dis
:
DestClause
,
var
ena
:
DestClause
,
var
exc
:
Option
[
DestClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractTrap
var
keepAlives
:
Seq
[
LocalVariable
])
extends
AbstractTrap
with
Terminator
case
class
InstWPBranch
(
var
wpID
:
Int
,
var
dis
:
DestClause
,
var
ena
:
DestClause
)
extends
Instruction
with
Terminator
case
class
InstCCall
(
var
callConv
:
Flag
,
var
funcTy
:
Type
,
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
CallLike
with
HasKeepAliveClause
case
class
InstCCall
(
var
callConv
:
Flag
,
var
funcTy
:
Type
,
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
],
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
CallLike
with
HasExcClause
with
HasKeepAliveClause
with
OSRPoint
case
class
InstNewStack
(
var
sig
:
FuncSig
,
var
callee
:
SSAVariable
,
var
argList
:
Seq
[
SSAVariable
],
var
excClause
:
Option
[
ExcClause
])
extends
CallLike
with
HasExcClause
case
class
InstNewThread
(
var
stack
:
SSAVariable
,
var
newStackAction
:
NewStackAction
,
var
excClause
:
Option
[
ExcClause
])
extends
Instruction
with
HasExcClause
case
class
InstSwapStack
(
var
swappee
:
SSAVariable
,
var
curStackAction
:
CurStackAction
,
var
newStackAction
:
NewStackAction
,
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
HasExcClause
with
HasKeepAliveClause
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
extends
HasExcClause
with
HasKeepAliveClause
with
OSRPoint
case
class
InstCommInst
(
var
inst
:
CommInst
,
var
flagList
:
Seq
[
Flag
],
var
typeList
:
Seq
[
Type
],
var
funcSigList
:
Seq
[
FuncSig
],
var
argList
:
Seq
[
SSAVariable
],
var
excClause
:
Option
[
ExcClause
],
var
keepAlives
:
Seq
[
LocalVariable
])
...
...
src/main/scala/uvm/types/types.scala
View file @
60d6faa0
...
...
@@ -4,11 +4,6 @@ import uvm._
abstract
class
Type
extends
IdentifiedSettable
{
override
final
def
toString
:
String
=
Type
.
prettyPrint
(
this
)
override
def
hashCode
()
:
Int
=
System
.
identityHashCode
(
this
)
override
def
equals
(
that
:
Any
)
:
Boolean
=
that
match
{
case
v
:
AnyRef
=>
this
eq
v
case
_
=>
false
}
}
abstract
class
FPType
extends
Type
...
...
@@ -17,6 +12,10 @@ abstract class AbstractRefType extends Type {
def
ty
:
Type
}
abstract
class
AbstractStructType
extends
Type
{
def
fieldTys
:
Seq
[
Type
]
}
abstract
class
AbstractSeqType
extends
Type
{
def
elemTy
:
Type
def
len
:
Long
...
...
@@ -32,7 +31,7 @@ case class TypeIRef(var ty: Type) extends AbstractRefType
case
class
TypeWeakRef
(
var
ty
:
Type
)
extends
AbstractRefType
case
class
TypeStruct
(
var
fieldTys
:
Seq
[
Type
])
extends
Type
case
class
TypeArray
(
var
elemTy
:
Type
,
var
len
:
Long
)
extends
AbstractSeqType
case
class
TypeHybrid
(
var
fi
xedTy
:
Type
,
var
varTy
:
Type
)
extends
Type
case
class
TypeHybrid
(
var
fi
eldTys
:
Seq
[
Type
]
,
var
varTy
:
Type
)
extends
Type
case
class
TypeVoid
()
extends
Type
case
class
TypeFuncRef
(
var
sig
:
FuncSig
)
extends
Type
case
class
TypeThreadRef
()
extends
Type
...
...
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