Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
Pyston
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Boxiang Sun
Pyston
Commits
21ac70f4
Commit
21ac70f4
authored
Oct 06, 2016
by
Marius Wachtler
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rename ConstantVRegInfo to CodeConstants
parent
ff6ca0d4
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
80 additions
and
81 deletions
+80
-81
src/analysis/type_analysis.cpp
src/analysis/type_analysis.cpp
+16
-16
src/analysis/type_analysis.h
src/analysis/type_analysis.h
+3
-3
src/codegen/ast_interpreter.cpp
src/codegen/ast_interpreter.cpp
+5
-5
src/codegen/irgen.cpp
src/codegen/irgen.cpp
+3
-3
src/codegen/irgen/irgenerator.cpp
src/codegen/irgen/irgenerator.cpp
+3
-3
src/core/bst.cpp
src/core/bst.cpp
+3
-3
src/core/bst.h
src/core/bst.h
+5
-5
src/core/cfg.cpp
src/core/cfg.cpp
+30
-30
src/core/cfg.h
src/core/cfg.h
+3
-3
src/runtime/code.cpp
src/runtime/code.cpp
+2
-2
src/runtime/types.h
src/runtime/types.h
+6
-7
src/runtime/util.cpp
src/runtime/util.cpp
+1
-1
No files found.
src/analysis/type_analysis.cpp
View file @
21ac70f4
...
...
@@ -89,17 +89,17 @@ private:
ExprTypeMap
&
expr_types
;
TypeSpeculations
&
type_speculations
;
TypeAnalysis
::
SpeculationLevel
speculation
;
const
Co
nstantVRegInfo
&
constant_vreg
s
;
const
Co
deConstants
&
code_constant
s
;
BasicBlockTypePropagator
(
CFGBlock
*
block
,
TypeMap
&
initial
,
ExprTypeMap
&
expr_types
,
TypeSpeculations
&
type_speculations
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
const
Co
deConstants
&
code_constant
s
)
:
block
(
block
),
sym_table
(
initial
),
expr_types
(
expr_types
),
type_speculations
(
type_speculations
),
speculation
(
speculation
),
co
nstant_vregs
(
constant_vreg
s
)
{}
co
de_constants
(
code_constant
s
)
{}
void
run
()
{
for
(
int
i
=
0
;
i
<
block
->
body
.
size
();
i
++
)
{
...
...
@@ -118,7 +118,7 @@ private:
printf
(
"in propagator, speculating that %s would actually be %s, at "
,
old_type
->
debugName
().
c_str
(),
speculated_type
->
debugName
().
c_str
());
fflush
(
stdout
);
print_bst
(
node
,
co
nstant_vreg
s
);
print_bst
(
node
,
co
de_constant
s
);
llvm
::
outs
().
flush
();
printf
(
"
\n
"
);
}
...
...
@@ -131,7 +131,7 @@ private:
}
CompilerType
*
getConstantType
(
int
vreg
)
{
Box
*
o
=
co
nstant_vreg
s
.
getConstant
(
vreg
);
Box
*
o
=
co
de_constant
s
.
getConstant
(
vreg
);
if
(
o
->
cls
==
int_cls
)
return
INT
;
else
if
(
o
->
cls
==
float_cls
)
...
...
@@ -284,7 +284,7 @@ private:
if
(
VERBOSITY
()
>=
2
&&
func
==
UNDEF
)
{
printf
(
"Think %s.%s is undefined, at %d
\n
"
,
t
->
debugName
().
c_str
(),
node
->
attr
.
c_str
(),
node
->
lineno
);
print_bst
(
node
,
co
nstant_vreg
s
);
print_bst
(
node
,
co
de_constant
s
);
printf
(
"
\n
"
);
}
...
...
@@ -297,7 +297,7 @@ private:
if
(
VERBOSITY
()
>=
2
&&
func
==
UNDEF
)
{
printf
(
"Think %s.%s is undefined, at %d
\n
"
,
t
->
debugName
().
c_str
(),
node
->
attr
.
c_str
(),
node
->
lineno
);
print_bst
(
node
,
co
nstant_vreg
s
);
print_bst
(
node
,
co
de_constant
s
);
printf
(
"
\n
"
);
}
...
...
@@ -399,7 +399,7 @@ private:
if
(
VERBOSITY
()
>=
2
&&
rtn
==
UNDEF
)
{
printf
(
"Think %s.%s is undefined, at %d
\n
"
,
t
->
debugName
().
c_str
(),
node
->
attr
.
c_str
(),
node
->
lineno
);
print_bst
(
node
,
co
nstant_vreg
s
);
print_bst
(
node
,
co
de_constant
s
);
printf
(
"
\n
"
);
}
_doSet
(
node
->
vreg_dst
,
rtn
);
...
...
@@ -551,9 +551,9 @@ private:
public:
static
TypeMap
propagate
(
CFGBlock
*
block
,
const
TypeMap
&
starting
,
ExprTypeMap
&
expr_types
,
TypeSpeculations
&
type_speculations
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
const
Co
deConstants
&
code_constant
s
)
{
TypeMap
ending
=
starting
;
BasicBlockTypePropagator
(
block
,
ending
,
expr_types
,
type_speculations
,
speculation
,
co
nstant_vreg
s
).
run
();
BasicBlockTypePropagator
(
block
,
ending
,
expr_types
,
type_speculations
,
speculation
,
co
de_constant
s
).
run
();
return
ending
;
}
};
...
...
@@ -632,7 +632,7 @@ public:
}
static
PropagatingTypeAnalysis
*
doAnalysis
(
SpeculationLevel
speculation
,
TypeMap
&&
initial_types
,
CFGBlock
*
initial_block
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
CFGBlock
*
initial_block
,
const
Co
deConstants
&
code_constant
s
)
{
Timer
_t
(
"PropagatingTypeAnalysis::doAnalysis()"
);
CFG
*
cfg
=
initial_block
->
cfg
;
...
...
@@ -673,7 +673,7 @@ public:
}
TypeMap
ending
=
BasicBlockTypePropagator
::
propagate
(
block
,
starting_types
.
find
(
block
)
->
second
,
expr_types
,
type_speculations
,
speculation
,
co
nstant_vreg
s
);
type_speculations
,
speculation
,
co
de_constant
s
);
if
(
VERBOSITY
(
"types"
)
>=
3
)
{
printf
(
"before (after):
\n
"
);
...
...
@@ -730,7 +730,7 @@ public:
// public entry point:
TypeAnalysis
*
doTypeAnalysis
(
CFG
*
cfg
,
const
ParamNames
&
arg_names
,
const
std
::
vector
<
ConcreteCompilerType
*>&
arg_types
,
EffortLevel
effort
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
const
Co
deConstants
&
code_constant
s
)
{
// if (effort == EffortLevel::INTERPRETED) {
// return new NullTypeAnalysis();
//}
...
...
@@ -750,11 +750,11 @@ TypeAnalysis* doTypeAnalysis(CFG* cfg, const ParamNames& arg_names, const std::v
assert
(
i
==
arg_types
.
size
());
return
PropagatingTypeAnalysis
::
doAnalysis
(
speculation
,
std
::
move
(
initial_types
),
cfg
->
getStartingBlock
(),
co
nstant_vreg
s
);
co
de_constant
s
);
}
TypeAnalysis
*
doTypeAnalysis
(
const
OSREntryDescriptor
*
entry_descriptor
,
EffortLevel
effort
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
deConstants
&
code_constant
s
)
{
auto
cfg
=
entry_descriptor
->
code
->
source
->
cfg
;
auto
&&
vreg_info
=
cfg
->
getVRegInfo
();
TypeMap
initial_types
(
vreg_info
.
getTotalNumOfVRegs
());
...
...
@@ -764,6 +764,6 @@ TypeAnalysis* doTypeAnalysis(const OSREntryDescriptor* entry_descriptor, EffortL
}
return
PropagatingTypeAnalysis
::
doAnalysis
(
speculation
,
std
::
move
(
initial_types
),
entry_descriptor
->
backedge
->
target
,
co
nstant_vreg
s
);
entry_descriptor
->
backedge
->
target
,
co
de_constant
s
);
}
}
src/analysis/type_analysis.h
View file @
21ac70f4
...
...
@@ -24,7 +24,7 @@
namespace
pyston
{
class
CFGBlock
;
class
Co
nstantVRegInfo
;
class
Co
deConstants
;
class
BoxedClass
;
class
BST_stmt_with_dest
;
class
OSREntryDescriptor
;
...
...
@@ -45,9 +45,9 @@ public:
TypeAnalysis
*
doTypeAnalysis
(
CFG
*
cfg
,
const
ParamNames
&
param_names
,
const
std
::
vector
<
ConcreteCompilerType
*>&
arg_types
,
EffortLevel
effort
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
);
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
deConstants
&
code_constant
s
);
TypeAnalysis
*
doTypeAnalysis
(
const
OSREntryDescriptor
*
entry_descriptor
,
EffortLevel
effort
,
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
nstantVRegInfo
&
constant_vreg
s
);
TypeAnalysis
::
SpeculationLevel
speculation
,
const
Co
deConstants
&
code_constant
s
);
}
#endif
src/codegen/ast_interpreter.cpp
View file @
21ac70f4
...
...
@@ -181,7 +181,7 @@ public:
BoxedClosure
*
getPassedClosure
()
{
return
frame_info
.
passed_closure
;
}
Box
**
getVRegs
()
{
return
vregs
;
}
const
ScopingResults
&
getScopeInfo
()
{
return
scope_info
;
}
const
Co
nstantVRegInfo
&
getConstantVRegInfo
()
{
return
getCode
()
->
constant_vreg
s
;
}
const
Co
deConstants
&
getCodeConstants
()
{
return
getCode
()
->
code_constant
s
;
}
void
addSymbol
(
int
vreg
,
Box
*
value
,
bool
allow_duplicates
);
void
setGenerator
(
Box
*
gen
);
...
...
@@ -900,7 +900,7 @@ Value ASTInterpreter::visit_stmt(BST_stmt* node) {
if
(
0
)
{
printf
(
"%20s % 2d "
,
getCode
()
->
name
->
c_str
(),
current_block
->
idx
);
print_bst
(
node
,
getCo
nstantVRegInfo
());
print_bst
(
node
,
getCo
deConstants
());
printf
(
"
\n
"
);
}
...
...
@@ -1528,7 +1528,7 @@ Value ASTInterpreter::visit_set(BST_Set* node) {
Value
ASTInterpreter
::
getVReg
(
int
vreg
,
bool
is_kill
)
{
assert
(
vreg
!=
VREG_UNDEFINED
);
if
(
vreg
<
0
)
{
Box
*
o
=
getCo
nstantVRegInfo
().
getConstant
(
vreg
);
Box
*
o
=
getCo
deConstants
().
getConstant
(
vreg
);
return
Value
(
incref
(
o
),
jit
?
jit
->
imm
(
o
)
->
setType
(
RefType
::
BORROWED
)
:
NULL
);
}
...
...
@@ -1564,10 +1564,10 @@ Value ASTInterpreter::getVReg(int vreg, bool is_kill) {
}
current_block
->
print
(
getCo
nstantVRegInfo
());
current_block
->
print
(
getCo
deConstants
());
printf
(
"vreg: %d num cross: %d
\n
"
,
vreg
,
getVRegInfo
().
getNumOfCrossBlockVRegs
());
printf
(
"
\n\n
"
);
current_block
->
cfg
->
print
(
getCo
nstantVRegInfo
());
current_block
->
cfg
->
print
(
getCo
deConstants
());
assert
(
0
);
return
Value
();
...
...
src/codegen/irgen.cpp
View file @
21ac70f4
...
...
@@ -1027,7 +1027,7 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
assert
((
entry_descriptor
!=
NULL
)
+
(
spec
!=
NULL
)
==
1
);
if
(
VERBOSITY
(
"irgen"
)
>=
2
)
source
->
cfg
->
print
(
code
->
co
nstant_vreg
s
);
source
->
cfg
->
print
(
code
->
co
de_constant
s
);
assert
(
g
.
cur_module
==
NULL
);
...
...
@@ -1101,10 +1101,10 @@ std::pair<CompiledFunction*, llvm::Function*> doCompile(BoxedCode* code, SourceI
speculation_level
=
TypeAnalysis
::
SOME
;
TypeAnalysis
*
types
;
if
(
entry_descriptor
)
types
=
doTypeAnalysis
(
entry_descriptor
,
effort
,
speculation_level
,
code
->
co
nstant_vreg
s
);
types
=
doTypeAnalysis
(
entry_descriptor
,
effort
,
speculation_level
,
code
->
co
de_constant
s
);
else
types
=
doTypeAnalysis
(
source
->
cfg
,
*
param_names
,
spec
->
arg_types
,
effort
,
speculation_level
,
code
->
co
nstant_vreg
s
);
code
->
co
de_constant
s
);
_t2
.
split
();
...
...
src/codegen/irgen/irgenerator.cpp
View file @
21ac70f4
...
...
@@ -1225,7 +1225,7 @@ private:
CompilerVariable
*
evalVReg
(
int
vreg
,
bool
is_kill
=
true
)
{
assert
(
vreg
!=
VREG_UNDEFINED
);
if
(
vreg
<
0
)
{
Box
*
o
=
irstate
->
getCode
()
->
co
nstant_vreg
s
.
getConstant
(
vreg
);
Box
*
o
=
irstate
->
getCode
()
->
co
de_constant
s
.
getConstant
(
vreg
);
if
(
o
->
cls
==
int_cls
)
{
return
makeInt
(((
BoxedInt
*
)
o
)
->
n
);
}
else
if
(
o
->
cls
==
float_cls
)
{
...
...
@@ -1612,7 +1612,7 @@ private:
printf
(
"Speculating that %s is actually %s, at "
,
rtn
->
getType
()
->
debugName
().
c_str
(),
speculated_type
->
debugName
().
c_str
());
fflush
(
stdout
);
print_bst
(
node
,
irstate
->
getCode
()
->
co
nstant_vreg
s
);
print_bst
(
node
,
irstate
->
getCode
()
->
co
de_constant
s
);
llvm
::
outs
().
flush
();
printf
(
"
\n
"
);
}
...
...
@@ -1624,7 +1624,7 @@ private:
auto
source
=
irstate
->
getSourceInfo
();
printf
(
"On %s:%d, function %s:
\n
"
,
irstate
->
getCode
()
->
filename
->
c_str
(),
irstate
->
getCode
()
->
firstlineno
,
irstate
->
getCode
()
->
name
->
c_str
());
irstate
->
getSourceInfo
()
->
cfg
->
print
(
irstate
->
getCode
()
->
co
nstant_vreg
s
);
irstate
->
getSourceInfo
()
->
cfg
->
print
(
irstate
->
getCode
()
->
co
de_constant
s
);
}
RELEASE_ASSERT
(
!
rtn
->
canConvertTo
(
speculated_type
),
"%s %s"
,
rtn
->
getType
()
->
debugName
().
c_str
(),
speculated_type
->
debugName
().
c_str
());
...
...
src/core/bst.cpp
View file @
21ac70f4
...
...
@@ -754,8 +754,8 @@ void BST_MakeSlice::accept_stmt(StmtVisitor* v) {
return
v
->
visit_makeslice
(
this
);
}
void
print_bst
(
BST_stmt
*
bst
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
PrintVisitor
v
(
co
nstant_vreg
s
,
0
,
llvm
::
outs
());
void
print_bst
(
BST_stmt
*
bst
,
const
Co
deConstants
&
code_constant
s
)
{
PrintVisitor
v
(
co
de_constant
s
,
0
,
llvm
::
outs
());
bst
->
accept
(
&
v
);
v
.
flush
();
}
...
...
@@ -771,7 +771,7 @@ bool PrintVisitor::visit_vreg(int* vreg, bool is_dst) {
if
(
*
vreg
!=
VREG_UNDEFINED
)
{
stream
<<
"%"
<<
*
vreg
;
if
(
*
vreg
<
0
)
stream
<<
"|"
<<
autoDecref
(
repr
(
co
nstant_vreg
s
.
getConstant
(
*
vreg
)))
->
s
()
<<
"|"
;
stream
<<
"|"
<<
autoDecref
(
repr
(
co
de_constant
s
.
getConstant
(
*
vreg
)))
->
s
()
<<
"|"
;
}
else
stream
<<
"%undef"
;
...
...
src/core/bst.h
View file @
21ac70f4
...
...
@@ -906,20 +906,20 @@ public:
virtual
void
visit_yield
(
BST_Yield
*
node
)
{
RELEASE_ASSERT
(
0
,
""
);
}
};
class
Co
nstantVRegInfo
;
void
print_bst
(
BST_stmt
*
bst
,
const
Co
nstantVRegInfo
&
constant_vreg
s
);
class
Co
deConstants
;
void
print_bst
(
BST_stmt
*
bst
,
const
Co
deConstants
&
code_constant
s
);
class
PrintVisitor
:
public
BSTVisitor
{
private:
llvm
::
raw_ostream
&
stream
;
const
Co
nstantVRegInfo
&
constant_vreg
s
;
const
Co
deConstants
&
code_constant
s
;
int
indent
;
void
printIndent
();
void
printOp
(
AST_TYPE
::
AST_TYPE
op_type
);
public:
PrintVisitor
(
const
Co
nstantVRegInfo
&
constant_vreg
s
,
int
indent
,
llvm
::
raw_ostream
&
stream
)
:
BSTVisitor
(
false
/* visit child CFG */
),
stream
(
stream
),
co
nstant_vregs
(
constant_vreg
s
),
indent
(
indent
)
{}
PrintVisitor
(
const
Co
deConstants
&
code_constant
s
,
int
indent
,
llvm
::
raw_ostream
&
stream
)
:
BSTVisitor
(
false
/* visit child CFG */
),
stream
(
stream
),
co
de_constants
(
code_constant
s
),
indent
(
indent
)
{}
virtual
~
PrintVisitor
()
{}
void
flush
()
{
stream
.
flush
();
}
...
...
src/core/cfg.cpp
View file @
21ac70f4
...
...
@@ -185,7 +185,7 @@ void CFGBlock::unconnectFrom(CFGBlock* successor) {
successor
->
predecessors
.
end
());
}
void
CFGBlock
::
print
(
const
Co
nstantVRegInfo
&
constant_vreg
s
,
llvm
::
raw_ostream
&
stream
)
{
void
CFGBlock
::
print
(
const
Co
deConstants
&
code_constant
s
,
llvm
::
raw_ostream
&
stream
)
{
stream
<<
"Block "
<<
idx
;
if
(
info
)
stream
<<
" '"
<<
info
<<
"'"
;
...
...
@@ -200,7 +200,7 @@ void CFGBlock::print(const ConstantVRegInfo& constant_vregs, llvm::raw_ostream&
}
stream
<<
"
\n
"
;
PrintVisitor
pv
(
co
nstant_vreg
s
,
4
,
stream
);
PrintVisitor
pv
(
co
de_constant
s
,
4
,
stream
);
for
(
int
j
=
0
;
j
<
body
.
size
();
j
++
)
{
stream
<<
" "
;
body
[
j
]
->
accept
(
&
pv
);
...
...
@@ -246,10 +246,10 @@ public:
AST
*
orig_node
);
};
static
std
::
pair
<
CFG
*
,
Co
nstantVRegInfo
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
);
static
std
::
pair
<
CFG
*
,
Co
deConstants
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
);
// This keeps track of the result of an instruction it's either a name, const or undefined.
struct
TmpValue
{
...
...
@@ -363,14 +363,14 @@ private:
std
::
vector
<
ContInfo
>
continuations
;
std
::
vector
<
ExcBlockInfo
>
exc_handlers
;
llvm
::
DenseMap
<
Box
*
,
int
>
consts
;
Co
nstantVRegInfo
constant_vreg
s
;
Co
deConstants
code_constant
s
;
unsigned
int
next_var_index
=
0
;
friend
std
::
pair
<
CFG
*
,
Co
nstantVRegInfo
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
);
friend
std
::
pair
<
CFG
*
,
Co
deConstants
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
);
public:
CFGVisitor
(
BoxedString
*
filename
,
SourceInfo
*
source
,
InternedStringPool
&
stringpool
,
ScopeInfo
*
scoping
,
...
...
@@ -513,7 +513,7 @@ private:
auto
it
=
consts
.
find
(
o
);
if
(
it
!=
consts
.
end
())
return
it
->
second
;
int
vreg
=
co
nstant_vregs
.
add
Constant
(
o
);
int
vreg
=
co
de_constants
.
createVRegEntryFor
Constant
(
o
);
consts
[
o
]
=
vreg
;
return
vreg
;
}
...
...
@@ -2855,11 +2855,11 @@ public:
}
};
void
CFG
::
print
(
const
Co
nstantVRegInfo
&
constant_vreg
s
,
llvm
::
raw_ostream
&
stream
)
{
void
CFG
::
print
(
const
Co
deConstants
&
code_constant
s
,
llvm
::
raw_ostream
&
stream
)
{
stream
<<
"CFG:
\n
"
;
stream
<<
blocks
.
size
()
<<
" blocks
\n
"
;
for
(
int
i
=
0
;
i
<
blocks
.
size
();
i
++
)
blocks
[
i
]
->
print
(
co
nstant_vreg
s
,
stream
);
blocks
[
i
]
->
print
(
co
de_constant
s
,
stream
);
stream
.
flush
();
}
...
...
@@ -3047,10 +3047,10 @@ void VRegInfo::assignVRegs(CFG* cfg, const ParamNames& param_names, llvm::DenseM
}
static
std
::
pair
<
CFG
*
,
Co
nstantVRegInfo
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
)
{
static
std
::
pair
<
CFG
*
,
Co
deConstants
>
computeCFG
(
llvm
::
ArrayRef
<
AST_stmt
*>
body
,
AST_TYPE
::
AST_TYPE
ast_type
,
int
lineno
,
AST_arguments
*
args
,
BoxedString
*
filename
,
SourceInfo
*
source
,
const
ParamNames
&
param_names
,
ScopeInfo
*
scoping
,
ModuleCFGProcessor
*
cfgizer
)
{
STAT_TIMER
(
t0
,
"us_timer_computecfg"
,
0
);
CFG
*
rtn
=
new
CFG
();
...
...
@@ -3139,7 +3139,7 @@ static std::pair<CFG*, ConstantVRegInfo> computeCFG(llvm::ArrayRef<AST_stmt*> bo
if
(
VERBOSITY
(
"cfg"
)
>=
3
)
{
printf
(
"Before cfg checking and transformations:
\n
"
);
rtn
->
print
(
visitor
.
co
nstant_vreg
s
);
rtn
->
print
(
visitor
.
co
de_constant
s
);
}
#ifndef NDEBUG
...
...
@@ -3167,7 +3167,7 @@ static std::pair<CFG*, ConstantVRegInfo> computeCFG(llvm::ArrayRef<AST_stmt*> bo
if
(
b
->
predecessors
.
size
()
==
0
)
{
if
(
b
!=
rtn
->
getStartingBlock
())
{
rtn
->
print
(
visitor
.
co
nstant_vreg
s
);
rtn
->
print
(
visitor
.
co
de_constant
s
);
}
ASSERT
(
b
==
rtn
->
getStartingBlock
(),
"%d"
,
b
->
idx
);
}
...
...
@@ -3222,13 +3222,13 @@ static std::pair<CFG*, ConstantVRegInfo> computeCFG(llvm::ArrayRef<AST_stmt*> bo
deduped
[
e
]
++
;
if
(
deduped
[
e
]
==
2
)
{
printf
(
"Duplicated: "
);
print_bst
(
e
,
visitor
.
co
nstant_vreg
s
);
print_bst
(
e
,
visitor
.
co
de_constant
s
);
printf
(
"
\n
"
);
no_dups
=
false
;
}
}
if
(
!
no_dups
)
rtn
->
print
(
visitor
.
co
nstant_vreg
s
);
rtn
->
print
(
visitor
.
co
de_constant
s
);
assert
(
no_dups
);
// Uncomment this for some heavy checking to make sure that we don't forget
...
...
@@ -3331,10 +3331,10 @@ static std::pair<CFG*, ConstantVRegInfo> computeCFG(llvm::ArrayRef<AST_stmt*> bo
if
(
VERBOSITY
(
"cfg"
)
>=
2
)
{
printf
(
"Final cfg:
\n
"
);
rtn
->
print
(
visitor
.
co
nstant_vreg
s
,
llvm
::
outs
());
rtn
->
print
(
visitor
.
co
de_constant
s
,
llvm
::
outs
());
}
return
std
::
make_pair
(
rtn
,
visitor
.
co
nstant_vreg
s
);
return
std
::
make_pair
(
rtn
,
visitor
.
co
de_constant
s
);
}
...
...
@@ -3381,17 +3381,17 @@ BoxedCode* ModuleCFGProcessor::runRecursively(llvm::ArrayRef<AST_stmt*> body, Bo
for
(
auto
e
:
param_names
.
allArgsAsName
())
fillScopingInfo
(
e
,
scope_info
);
Co
nstantVRegInfo
constant_vreg
s
;
std
::
tie
(
si
->
cfg
,
co
nstant_vreg
s
)
Co
deConstants
code_constant
s
;
std
::
tie
(
si
->
cfg
,
co
de_constant
s
)
=
computeCFG
(
body
,
ast_type
,
lineno
,
args
,
fn
,
si
.
get
(),
param_names
,
scope_info
,
this
);
BoxedCode
*
code
;
if
(
args
)
code
=
new
BoxedCode
(
args
->
args
.
size
(),
args
->
vararg
,
args
->
kwarg
,
lineno
,
std
::
move
(
si
),
std
::
move
(
co
nstant_vreg
s
),
std
::
move
(
param_names
),
fn
,
name
,
std
::
move
(
co
de_constant
s
),
std
::
move
(
param_names
),
fn
,
name
,
autoDecref
(
getDocString
(
body
)));
else
code
=
new
BoxedCode
(
0
,
false
,
false
,
lineno
,
std
::
move
(
si
),
std
::
move
(
co
nstant_vreg
s
),
std
::
move
(
param_names
),
code
=
new
BoxedCode
(
0
,
false
,
false
,
lineno
,
std
::
move
(
si
),
std
::
move
(
co
de_constant
s
),
std
::
move
(
param_names
),
fn
,
name
,
autoDecref
(
getDocString
(
body
)));
return
code
;
...
...
@@ -3403,7 +3403,7 @@ BoxedCode* computeAllCFGs(AST* ast, bool globals_from_module, FutureFlags future
.
runRecursively
(
ast
->
getBody
(),
ast
->
getName
(),
ast
->
lineno
,
nullptr
,
ast
);
}
void
printCFG
(
CFG
*
cfg
,
const
Co
nstantVRegInfo
&
constant_vreg
s
)
{
cfg
->
print
(
co
nstant_vreg
s
);
void
printCFG
(
CFG
*
cfg
,
const
Co
deConstants
&
code_constant
s
)
{
cfg
->
print
(
co
de_constant
s
);
}
}
src/core/cfg.h
View file @
21ac70f4
...
...
@@ -88,7 +88,7 @@ public:
void
unconnectFrom
(
CFGBlock
*
successor
);
void
push_back
(
BST_stmt
*
node
)
{
body
.
push_back
(
node
);
}
void
print
(
const
Co
nstantVRegInfo
&
constant_vreg
s
,
llvm
::
raw_ostream
&
stream
=
llvm
::
outs
());
void
print
(
const
Co
deConstants
&
code_constant
s
,
llvm
::
raw_ostream
&
stream
=
llvm
::
outs
());
};
// the vregs are split into three parts.
...
...
@@ -210,7 +210,7 @@ public:
blocks
.
push_back
(
block
);
}
void
print
(
const
Co
nstantVRegInfo
&
constant_vreg
s
,
llvm
::
raw_ostream
&
stream
=
llvm
::
outs
());
void
print
(
const
Co
deConstants
&
code_constant
s
,
llvm
::
raw_ostream
&
stream
=
llvm
::
outs
());
};
class
VRegSet
{
...
...
@@ -331,7 +331,7 @@ public:
BoxedCode
*
computeAllCFGs
(
AST
*
ast
,
bool
globals_from_module
,
FutureFlags
future_flags
,
BoxedString
*
fn
,
BoxedModule
*
bm
);
void
printCFG
(
CFG
*
cfg
,
const
Co
nstantVRegInfo
&
constant_vreg
s
);
void
printCFG
(
CFG
*
cfg
,
const
Co
deConstants
&
code_constant
s
);
}
#endif
src/runtime/code.cpp
View file @
21ac70f4
...
...
@@ -113,10 +113,10 @@ void BoxedCode::dealloc(Box* b) noexcept {
}
BoxedCode
::
BoxedCode
(
int
num_args
,
bool
takes_varargs
,
bool
takes_kwargs
,
int
firstlineno
,
std
::
unique_ptr
<
SourceInfo
>
source
,
Co
nstantVRegInfo
constant_vreg
s
,
ParamNames
param_names
,
std
::
unique_ptr
<
SourceInfo
>
source
,
Co
deConstants
code_constant
s
,
ParamNames
param_names
,
BoxedString
*
filename
,
BoxedString
*
name
,
Box
*
doc
)
:
source
(
std
::
move
(
source
)),
co
nstant_vregs
(
std
::
move
(
constant_vreg
s
)),
co
de_constants
(
std
::
move
(
code_constant
s
)),
filename
(
incref
(
filename
)),
name
(
incref
(
name
)),
firstlineno
(
firstlineno
),
...
...
src/runtime/types.h
View file @
21ac70f4
...
...
@@ -1070,17 +1070,17 @@ public:
};
static_assert
(
sizeof
(
BoxedDict
)
==
sizeof
(
PyDictObject
),
""
);
class
Co
nstantVRegInfo
{
class
Co
deConstants
{
private:
std
::
vector
<
Box
*>
constants
;
public:
Co
nstantVRegInfo
(){};
Co
deConstants
()
{}
Box
*
getConstant
(
int
vreg
)
const
{
return
constants
[
-
(
vreg
+
1
)];
}
// returns the vreg num for the constant (which is a negative number)
int
add
Constant
(
Box
*
o
)
{
int
createVRegEntryFor
Constant
(
Box
*
o
)
{
constants
.
push_back
(
o
);
return
-
constants
.
size
();
}
...
...
@@ -1095,8 +1095,8 @@ public:
// BoxedCode objects also keep track of any machine code that we have available for this function.
class
BoxedCode
:
public
Box
{
public:
std
::
unique_ptr
<
SourceInfo
>
source
;
// source can be NULL for functions defined in the C/C++ runtime
const
Co
nstantVRegInfo
BORROWED
(
constant_vreg
s
);
// keeps track of all constants inside the bytecode
std
::
unique_ptr
<
SourceInfo
>
source
;
// source can be NULL for functions defined in the C/C++ runtime
const
Co
deConstants
BORROWED
(
code_constant
s
);
// keeps track of all constants inside the bytecode
BoxedString
*
filename
=
nullptr
;
BoxedString
*
name
=
nullptr
;
...
...
@@ -1135,8 +1135,7 @@ public:
// Constructor for Python code objects:
BoxedCode
(
int
num_args
,
bool
takes_varargs
,
bool
takes_kwargs
,
int
firstlineno
,
std
::
unique_ptr
<
SourceInfo
>
source
,
ConstantVRegInfo
constant_vregs
,
ParamNames
param_names
,
BoxedString
*
filename
,
BoxedString
*
name
,
Box
*
doc
);
CodeConstants
code_constants
,
ParamNames
param_names
,
BoxedString
*
filename
,
BoxedString
*
name
,
Box
*
doc
);
// Constructor for code objects created by the runtime:
BoxedCode
(
int
num_args
,
bool
takes_varargs
,
bool
takes_kwargs
,
const
char
*
name
,
const
char
*
doc
=
""
,
...
...
src/runtime/util.cpp
View file @
21ac70f4
...
...
@@ -254,7 +254,7 @@ extern "C" void dumpEx(void* p, int levels) {
printf
(
"Defined at %s:%d
\n
"
,
code
->
filename
->
c_str
(),
code
->
firstlineno
);
if
(
code
->
source
->
cfg
&&
levels
>
0
)
{
code
->
source
->
cfg
->
print
(
code
->
co
nstant_vreg
s
);
code
->
source
->
cfg
->
print
(
code
->
co
de_constant
s
);
}
}
else
{
printf
(
"A builtin function
\n
"
);
...
...
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