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
45349e60
Commit
45349e60
authored
Feb 17, 2016
by
Kevin Modzelewski
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
It seems to be able to run some simple cases
parent
12e5d956
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
76 additions
and
36 deletions
+76
-36
src/codegen/compvars.cpp
src/codegen/compvars.cpp
+9
-2
src/codegen/irgen.h
src/codegen/irgen.h
+15
-14
src/codegen/irgen/irgenerator.cpp
src/codegen/irgen/irgenerator.cpp
+20
-3
src/codegen/irgen/refcounts.cpp
src/codegen/irgen/refcounts.cpp
+30
-16
src/codegen/irgen/util.cpp
src/codegen/irgen/util.cpp
+2
-1
No files found.
src/codegen/compvars.cpp
View file @
45349e60
...
@@ -231,12 +231,14 @@ public:
...
@@ -231,12 +231,14 @@ public:
void
setattr
(
IREmitter
&
emitter
,
const
OpInfo
&
info
,
ConcreteCompilerVariable
*
var
,
BoxedString
*
attr
,
void
setattr
(
IREmitter
&
emitter
,
const
OpInfo
&
info
,
ConcreteCompilerVariable
*
var
,
BoxedString
*
attr
,
CompilerVariable
*
v
)
override
{
CompilerVariable
*
v
)
override
{
llvm
::
Constant
*
ptr
=
embedRelocatablePtr
(
attr
,
g
.
llvm_boxedstring_type_ptr
);
llvm
::
Constant
*
ptr
=
embedRelocatablePtr
(
attr
,
g
.
llvm_boxedstring_type_ptr
);
emitter
.
setType
(
ptr
,
RefType
::
BORROWED
);
ConcreteCompilerVariable
*
converted
=
v
->
makeConverted
(
emitter
,
UNKNOWN
);
ConcreteCompilerVariable
*
converted
=
v
->
makeConverted
(
emitter
,
UNKNOWN
);
// g.funcs.setattr->dump();
// g.funcs.setattr->dump();
// var->getValue()->dump(); llvm::errs() << '\n';
// var->getValue()->dump(); llvm::errs() << '\n';
// ptr->dump(); llvm::errs() << '\n';
// ptr->dump(); llvm::errs() << '\n';
// converted->getValue()->dump(); llvm::errs() << '\n';
// converted->getValue()->dump(); llvm::errs() << '\n';
bool
do_patchpoint
=
ENABLE_ICSETATTRS
;
bool
do_patchpoint
=
ENABLE_ICSETATTRS
;
llvm
::
Instruction
*
inst
;
if
(
do_patchpoint
)
{
if
(
do_patchpoint
)
{
ICSetupInfo
*
pp
=
createSetattrIC
(
info
.
getTypeRecorder
(),
info
.
getBJitICInfo
());
ICSetupInfo
*
pp
=
createSetattrIC
(
info
.
getTypeRecorder
(),
info
.
getBJitICInfo
());
...
@@ -245,10 +247,11 @@ public:
...
@@ -245,10 +247,11 @@ public:
llvm_args
.
push_back
(
ptr
);
llvm_args
.
push_back
(
ptr
);
llvm_args
.
push_back
(
converted
->
getValue
());
llvm_args
.
push_back
(
converted
->
getValue
());
emitter
.
createIC
(
pp
,
(
void
*
)
pyston
::
setattr
,
llvm_args
,
info
.
unw_info
);
inst
=
emitter
.
createIC
(
pp
,
(
void
*
)
pyston
::
setattr
,
llvm_args
,
info
.
unw_info
);
}
else
{
}
else
{
emitter
.
createCall3
(
info
.
unw_info
,
g
.
funcs
.
setattr
,
var
->
getValue
(),
ptr
,
converted
->
getValue
());
inst
=
emitter
.
createCall3
(
info
.
unw_info
,
g
.
funcs
.
setattr
,
var
->
getValue
(),
ptr
,
converted
->
getValue
());
}
}
emitter
.
refConsumed
(
converted
->
getValue
(),
inst
);
}
}
void
delattr
(
IREmitter
&
emitter
,
const
OpInfo
&
info
,
ConcreteCompilerVariable
*
var
,
BoxedString
*
attr
)
override
{
void
delattr
(
IREmitter
&
emitter
,
const
OpInfo
&
info
,
ConcreteCompilerVariable
*
var
,
BoxedString
*
attr
)
override
{
...
@@ -456,6 +459,7 @@ public:
...
@@ -456,6 +459,7 @@ public:
rtn
=
emitter
.
createCall3
(
info
.
unw_info
,
rt_func
,
var
->
getValue
(),
converted_rhs
->
getValue
(),
rtn
=
emitter
.
createCall3
(
info
.
unw_info
,
rt_func
,
var
->
getValue
(),
converted_rhs
->
getValue
(),
getConstantInt
(
op_type
,
g
.
i32
));
getConstantInt
(
op_type
,
g
.
i32
));
}
}
emitter
.
setType
(
rtn
,
RefType
::
OWNED
);
if
(
op_type
==
AST_TYPE
::
In
||
op_type
==
AST_TYPE
::
NotIn
||
op_type
==
AST_TYPE
::
Is
if
(
op_type
==
AST_TYPE
::
In
||
op_type
==
AST_TYPE
::
NotIn
||
op_type
==
AST_TYPE
::
Is
||
op_type
==
AST_TYPE
::
IsNot
)
{
||
op_type
==
AST_TYPE
::
IsNot
)
{
...
@@ -788,6 +792,7 @@ CompilerVariable* makeFunction(IREmitter& emitter, FunctionMetadata* f, Compiler
...
@@ -788,6 +792,7 @@ CompilerVariable* makeFunction(IREmitter& emitter, FunctionMetadata* f, Compiler
closure_v
=
convertedClosure
->
getValue
();
closure_v
=
convertedClosure
->
getValue
();
}
else
{
}
else
{
closure_v
=
getNullPtr
(
g
.
llvm_closure_type_ptr
);
closure_v
=
getNullPtr
(
g
.
llvm_closure_type_ptr
);
emitter
.
setType
(
closure_v
,
RefType
::
BORROWED
);
}
}
llvm
::
Value
*
scratch
;
llvm
::
Value
*
scratch
;
...
@@ -813,6 +818,7 @@ CompilerVariable* makeFunction(IREmitter& emitter, FunctionMetadata* f, Compiler
...
@@ -813,6 +818,7 @@ CompilerVariable* makeFunction(IREmitter& emitter, FunctionMetadata* f, Compiler
g
.
funcs
.
createFunctionFromMetadata
,
g
.
funcs
.
createFunctionFromMetadata
,
std
::
vector
<
llvm
::
Value
*>
{
embedRelocatablePtr
(
f
,
g
.
llvm_functionmetadata_type_ptr
),
closure_v
,
globals
,
std
::
vector
<
llvm
::
Value
*>
{
embedRelocatablePtr
(
f
,
g
.
llvm_functionmetadata_type_ptr
),
closure_v
,
globals
,
scratch
,
getConstantInt
(
defaults
.
size
(),
g
.
i64
)
});
scratch
,
getConstantInt
(
defaults
.
size
(),
g
.
i64
)
});
emitter
.
setType
(
boxed
,
RefType
::
OWNED
);
return
new
ConcreteCompilerVariable
(
typeFromClass
(
function_cls
),
boxed
);
return
new
ConcreteCompilerVariable
(
typeFromClass
(
function_cls
),
boxed
);
}
}
...
@@ -2201,6 +2207,7 @@ public:
...
@@ -2201,6 +2207,7 @@ public:
ConcreteCompilerVariable
*
makeConverted
(
IREmitter
&
emitter
,
VAR
*
var
,
ConcreteCompilerType
*
other_type
)
override
{
ConcreteCompilerVariable
*
makeConverted
(
IREmitter
&
emitter
,
VAR
*
var
,
ConcreteCompilerType
*
other_type
)
override
{
assert
(
other_type
==
STR
||
other_type
==
UNKNOWN
);
assert
(
other_type
==
STR
||
other_type
==
UNKNOWN
);
llvm
::
Value
*
boxed
=
embedRelocatablePtr
(
var
->
getValue
(),
g
.
llvm_value_type_ptr
);
llvm
::
Value
*
boxed
=
embedRelocatablePtr
(
var
->
getValue
(),
g
.
llvm_value_type_ptr
);
emitter
.
setType
(
boxed
,
RefType
::
BORROWED
);
return
new
ConcreteCompilerVariable
(
other_type
,
boxed
);
return
new
ConcreteCompilerVariable
(
other_type
,
boxed
);
}
}
...
...
src/codegen/irgen.h
View file @
45349e60
...
@@ -86,20 +86,20 @@ public:
...
@@ -86,20 +86,20 @@ public:
virtual
llvm
::
Function
*
getIntrinsic
(
llvm
::
Intrinsic
::
ID
)
=
0
;
virtual
llvm
::
Function
*
getIntrinsic
(
llvm
::
Intrinsic
::
ID
)
=
0
;
virtual
llvm
::
Value
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
virtual
llvm
::
Instruction
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
const
std
::
vector
<
llvm
::
Value
*>&
args
,
ExceptionStyle
target_exception_style
=
CXX
)
const
std
::
vector
<
llvm
::
Value
*>&
args
,
=
0
;
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
llvm
::
Value
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
virtual
llvm
::
Instruction
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
llvm
::
Value
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
virtual
llvm
::
Instruction
*
createCall
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
llvm
::
Value
*
createCall2
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
virtual
llvm
::
Instruction
*
createCall2
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
llvm
::
Value
*
arg2
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
llvm
::
Value
*
arg2
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
llvm
::
Value
*
createCall3
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
virtual
llvm
::
Instruction
*
createCall3
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
callee
,
llvm
::
Value
*
arg1
,
llvm
::
Value
*
arg2
,
llvm
::
Value
*
arg3
,
ExceptionStyle
target_exception_style
=
CXX
)
llvm
::
Value
*
arg2
,
llvm
::
Value
*
arg3
,
=
0
;
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
llvm
::
Value
*
createIC
(
const
ICSetupInfo
*
pp
,
void
*
func_addr
,
const
std
::
vector
<
llvm
::
Value
*>&
args
,
virtual
llvm
::
Instruction
*
createIC
(
const
ICSetupInfo
*
pp
,
void
*
func_addr
,
const
std
::
vector
<
llvm
::
Value
*>&
args
,
const
UnwindInfo
&
unw_info
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
const
UnwindInfo
&
unw_info
,
ExceptionStyle
target_exception_style
=
CXX
)
=
0
;
virtual
void
checkAndPropagateCapiException
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
returned_val
,
virtual
void
checkAndPropagateCapiException
(
const
UnwindInfo
&
unw_info
,
llvm
::
Value
*
returned_val
,
llvm
::
Value
*
exc_val
,
bool
double_check
=
false
)
=
0
;
llvm
::
Value
*
exc_val
,
bool
double_check
=
false
)
=
0
;
...
@@ -108,6 +108,7 @@ public:
...
@@ -108,6 +108,7 @@ public:
virtual
BORROWED
(
Box
*
)
getFloatConstant
(
double
d
)
=
0
;
virtual
BORROWED
(
Box
*
)
getFloatConstant
(
double
d
)
=
0
;
virtual
llvm
::
Value
*
setType
(
llvm
::
Value
*
v
,
RefType
reftype
)
=
0
;
virtual
llvm
::
Value
*
setType
(
llvm
::
Value
*
v
,
RefType
reftype
)
=
0
;
virtual
void
refConsumed
(
llvm
::
Value
*
v
,
llvm
::
Instruction
*
inst
)
=
0
;
virtual
ConcreteCompilerVariable
*
getNone
()
=
0
;
virtual
ConcreteCompilerVariable
*
getNone
()
=
0
;
};
};
...
...
src/codegen/irgen/irgenerator.cpp
View file @
45349e60
...
@@ -517,6 +517,10 @@ public:
...
@@ -517,6 +517,10 @@ public:
return
irstate
->
getSourceInfo
()
->
parent_module
->
getFloatConstant
(
d
);
return
irstate
->
getSourceInfo
()
->
parent_module
->
getFloatConstant
(
d
);
}
}
void
refConsumed
(
llvm
::
Value
*
v
,
llvm
::
Instruction
*
inst
)
{
irstate
->
getRefcounts
()
->
refConsumed
(
v
,
inst
);
}
llvm
::
Value
*
setType
(
llvm
::
Value
*
v
,
RefType
reftype
)
{
llvm
::
Value
*
setType
(
llvm
::
Value
*
v
,
RefType
reftype
)
{
irstate
->
getRefcounts
()
->
setType
(
v
,
reftype
);
irstate
->
getRefcounts
()
->
setType
(
v
,
reftype
);
return
v
;
return
v
;
...
@@ -1075,12 +1079,15 @@ private:
...
@@ -1075,12 +1079,15 @@ private:
ConcreteCompilerVariable
*
getEllipsis
()
{
ConcreteCompilerVariable
*
getEllipsis
()
{
llvm
::
Constant
*
ellipsis
=
embedRelocatablePtr
(
Ellipsis
,
g
.
llvm_value_type_ptr
,
"cEllipsis"
);
llvm
::
Constant
*
ellipsis
=
embedRelocatablePtr
(
Ellipsis
,
g
.
llvm_value_type_ptr
,
"cEllipsis"
);
auto
ellipsis_cls
=
Ellipsis
->
cls
;
auto
ellipsis_cls
=
Ellipsis
->
cls
;
emitter
.
setType
(
ellipsis
,
RefType
::
BORROWED
);
return
new
ConcreteCompilerVariable
(
typeFromClass
(
ellipsis_cls
),
ellipsis
);
return
new
ConcreteCompilerVariable
(
typeFromClass
(
ellipsis_cls
),
ellipsis
);
}
}
llvm
::
Constant
*
embedParentModulePtr
()
{
llvm
::
Constant
*
embedParentModulePtr
()
{
BoxedModule
*
parent_module
=
irstate
->
getSourceInfo
()
->
parent_module
;
BoxedModule
*
parent_module
=
irstate
->
getSourceInfo
()
->
parent_module
;
return
embedRelocatablePtr
(
parent_module
,
g
.
llvm_value_type_ptr
,
"cParentModule"
);
auto
r
=
embedRelocatablePtr
(
parent_module
,
g
.
llvm_value_type_ptr
,
"cParentModule"
);
emitter
.
setType
(
r
,
RefType
::
BORROWED
);
return
r
;
}
}
ConcreteCompilerVariable
*
_getGlobal
(
AST_Name
*
node
,
const
UnwindInfo
&
unw_info
)
{
ConcreteCompilerVariable
*
_getGlobal
(
AST_Name
*
node
,
const
UnwindInfo
&
unw_info
)
{
...
@@ -1277,6 +1284,7 @@ private:
...
@@ -1277,6 +1284,7 @@ private:
llvm
::
Value
*
rtn
llvm
::
Value
*
rtn
=
embedRelocatablePtr
(
irstate
->
getSourceInfo
()
->
parent_module
->
getStringConstant
(
node
->
str_data
,
true
),
=
embedRelocatablePtr
(
irstate
->
getSourceInfo
()
->
parent_module
->
getStringConstant
(
node
->
str_data
,
true
),
g
.
llvm_value_type_ptr
);
g
.
llvm_value_type_ptr
);
emitter
.
setType
(
rtn
,
RefType
::
BORROWED
);
return
new
ConcreteCompilerVariable
(
STR
,
rtn
);
return
new
ConcreteCompilerVariable
(
STR
,
rtn
);
}
else
if
(
node
->
str_type
==
AST_Str
::
UNICODE
)
{
}
else
if
(
node
->
str_type
==
AST_Str
::
UNICODE
)
{
...
@@ -2571,28 +2579,34 @@ public:
...
@@ -2571,28 +2579,34 @@ public:
if
(
scope_info
->
takesClosure
())
{
if
(
scope_info
->
takesClosure
())
{
passed_closure
=
AI
;
passed_closure
=
AI
;
emitter
.
setType
(
passed_closure
,
RefType
::
BORROWED
);
symbol_table
[
internString
(
PASSED_CLOSURE_NAME
)]
symbol_table
[
internString
(
PASSED_CLOSURE_NAME
)]
=
new
ConcreteCompilerVariable
(
getPassedClosureType
(),
AI
);
=
new
ConcreteCompilerVariable
(
getPassedClosureType
(),
AI
);
++
AI
;
++
AI
;
}
}
if
(
scope_info
->
createsClosure
())
{
if
(
scope_info
->
createsClosure
())
{
if
(
!
passed_closure
)
if
(
!
passed_closure
)
{
passed_closure
=
getNullPtr
(
g
.
llvm_closure_type_ptr
);
passed_closure
=
getNullPtr
(
g
.
llvm_closure_type_ptr
);
emitter
.
setType
(
passed_closure
,
RefType
::
BORROWED
);
}
llvm
::
Value
*
new_closure
=
emitter
.
getBuilder
()
->
CreateCall2
(
llvm
::
Value
*
new_closure
=
emitter
.
getBuilder
()
->
CreateCall2
(
g
.
funcs
.
createClosure
,
passed_closure
,
getConstantInt
(
scope_info
->
getClosureSize
(),
g
.
i64
));
g
.
funcs
.
createClosure
,
passed_closure
,
getConstantInt
(
scope_info
->
getClosureSize
(),
g
.
i64
));
emitter
.
setType
(
new_closure
,
RefType
::
OWNED
);
symbol_table
[
internString
(
CREATED_CLOSURE_NAME
)]
symbol_table
[
internString
(
CREATED_CLOSURE_NAME
)]
=
new
ConcreteCompilerVariable
(
getCreatedClosureType
(),
new_closure
);
=
new
ConcreteCompilerVariable
(
getCreatedClosureType
(),
new_closure
);
}
}
if
(
irstate
->
getSourceInfo
()
->
is_generator
)
{
if
(
irstate
->
getSourceInfo
()
->
is_generator
)
{
symbol_table
[
internString
(
PASSED_GENERATOR_NAME
)]
=
new
ConcreteCompilerVariable
(
GENERATOR
,
AI
);
symbol_table
[
internString
(
PASSED_GENERATOR_NAME
)]
=
new
ConcreteCompilerVariable
(
GENERATOR
,
AI
);
emitter
.
setType
(
AI
,
RefType
::
BORROWED
);
++
AI
;
++
AI
;
}
}
if
(
!
irstate
->
getSourceInfo
()
->
scoping
->
areGlobalsFromModule
())
{
if
(
!
irstate
->
getSourceInfo
()
->
scoping
->
areGlobalsFromModule
())
{
irstate
->
setGlobals
(
AI
);
irstate
->
setGlobals
(
AI
);
emitter
.
setType
(
AI
,
RefType
::
BORROWED
);
++
AI
;
++
AI
;
}
}
...
@@ -2607,8 +2621,10 @@ public:
...
@@ -2607,8 +2621,10 @@ public:
if
(
arg_types
[
i
]
->
llvmType
()
==
g
.
i64
)
if
(
arg_types
[
i
]
->
llvmType
()
==
g
.
i64
)
loaded
=
emitter
.
getBuilder
()
->
CreatePtrToInt
(
loaded
,
arg_types
[
i
]
->
llvmType
());
loaded
=
emitter
.
getBuilder
()
->
CreatePtrToInt
(
loaded
,
arg_types
[
i
]
->
llvmType
());
else
else
{
assert
(
arg_types
[
i
]
->
llvmType
()
==
g
.
llvm_value_type_ptr
);
assert
(
arg_types
[
i
]
->
llvmType
()
==
g
.
llvm_value_type_ptr
);
emitter
.
setType
(
loaded
,
RefType
::
BORROWED
);
}
python_parameters
.
push_back
(
loaded
);
python_parameters
.
push_back
(
loaded
);
}
}
...
@@ -2617,6 +2633,7 @@ public:
...
@@ -2617,6 +2633,7 @@ public:
}
}
python_parameters
.
push_back
(
AI
);
python_parameters
.
push_back
(
AI
);
emitter
.
setType
(
AI
,
RefType
::
BORROWED
);
++
AI
;
++
AI
;
}
}
...
...
src/codegen/irgen/refcounts.cpp
View file @
45349e60
...
@@ -239,8 +239,6 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
...
@@ -239,8 +239,6 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
for
(
auto
&&
BB
:
*
f
)
{
for
(
auto
&&
BB
:
*
f
)
{
if
(
llvm
::
succ_begin
(
&
BB
)
==
llvm
::
succ_end
(
&
BB
))
{
if
(
llvm
::
succ_begin
(
&
BB
)
==
llvm
::
succ_end
(
&
BB
))
{
printf
(
"%s is a terminator block
\n
"
,
BB
.
getName
().
data
());
block_queue
.
push_back
(
&
BB
);
block_queue
.
push_back
(
&
BB
);
}
}
}
}
...
@@ -311,6 +309,9 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
...
@@ -311,6 +309,9 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
}
}
}
}
// A place to store any decrefs we might have to do, since those will split the basic block:
llvm
::
SmallVector
<
std
::
pair
<
llvm
::
Value
*
,
llvm
::
Instruction
*>
,
4
>
last_uses
;
for
(
auto
&
I
:
llvm
::
iterator_range
<
llvm
::
BasicBlock
::
reverse_iterator
>
(
BB
.
rbegin
(),
BB
.
rend
()))
{
for
(
auto
&
I
:
llvm
::
iterator_range
<
llvm
::
BasicBlock
::
reverse_iterator
>
(
BB
.
rbegin
(),
BB
.
rend
()))
{
llvm
::
DenseMap
<
llvm
::
Value
*
,
int
>
num_consumed_by_inst
;
llvm
::
DenseMap
<
llvm
::
Value
*
,
int
>
num_consumed_by_inst
;
llvm
::
DenseMap
<
llvm
::
Value
*
,
int
>
num_times_as_op
;
llvm
::
DenseMap
<
llvm
::
Value
*
,
int
>
num_times_as_op
;
...
@@ -344,13 +345,8 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
...
@@ -344,13 +345,8 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
if
(
num_times_as_op
[
op
]
>
num_consumed
)
{
if
(
num_times_as_op
[
op
]
>
num_consumed
)
{
if
(
rt
->
vars
[
op
].
reftype
==
RefType
::
OWNED
)
{
if
(
rt
->
vars
[
op
].
reftype
==
RefType
::
OWNED
)
{
if
(
state
.
refs
[
op
]
==
0
)
{
if
(
state
.
refs
[
op
]
==
0
)
{
if
(
llvm
::
InvokeInst
*
invoke
=
llvm
::
dyn_cast
<
llvm
::
InvokeInst
>
(
&
I
))
{
// Don't do any updates now since we are iterating over the bb
addDecrefs
(
op
,
1
,
findIncrefPt
(
invoke
->
getNormalDest
()));
last_uses
.
push_back
(
std
::
make_pair
(
op
,
&
I
));
addDecrefs
(
op
,
1
,
findIncrefPt
(
invoke
->
getUnwindDest
()));
}
else
{
assert
(
&
I
!=
I
.
getParent
()
->
getTerminator
());
addDecrefs
(
op
,
1
,
I
.
getNextNode
());
}
state
.
refs
[
op
]
=
1
;
state
.
refs
[
op
]
=
1
;
}
}
}
}
...
@@ -380,22 +376,40 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
...
@@ -380,22 +376,40 @@ void RefcountTracker::addRefcounts(IRGenState* irstate) {
}
}
}
}
for
(
auto
&
p
:
last_uses
)
{
if
(
llvm
::
InvokeInst
*
invoke
=
llvm
::
dyn_cast
<
llvm
::
InvokeInst
>
(
p
.
second
))
{
addDecrefs
(
p
.
first
,
1
,
findIncrefPt
(
invoke
->
getNormalDest
()));
addDecrefs
(
p
.
first
,
1
,
findIncrefPt
(
invoke
->
getUnwindDest
()));
}
else
{
assert
(
p
.
second
!=
p
.
second
->
getParent
()
->
getTerminator
());
addDecrefs
(
p
.
first
,
1
,
p
.
second
->
getNextNode
());
}
}
if
(
&
BB
==
&
BB
.
getParent
()
->
front
())
{
if
(
&
BB
==
&
BB
.
getParent
()
->
front
())
{
for
(
auto
&&
p
:
state
.
refs
)
{
for
(
auto
&&
p
:
state
.
refs
)
{
llvm
::
outs
()
<<
*
p
.
first
<<
" "
<<
p
.
second
<<
'\n'
;
llvm
::
outs
()
<<
*
p
.
first
<<
" "
<<
p
.
second
<<
'\n'
;
assert
(
llvm
::
isa
<
llvm
::
GlobalVariable
>
(
p
.
first
));
// Anything left should either be an argument or a global variable
#ifndef NDEBUG
if
(
!
llvm
::
isa
<
llvm
::
GlobalVariable
>
(
p
.
first
))
{
bool
found
=
false
;
for
(
auto
&&
arg
:
f
->
args
())
{
if
(
&
arg
==
p
.
first
)
{
found
=
true
;
break
;
}
}
assert
(
found
);
}
#endif
assert
(
rt
->
vars
[
p
.
first
].
reftype
==
RefType
::
BORROWED
);
assert
(
rt
->
vars
[
p
.
first
].
reftype
==
RefType
::
BORROWED
);
addIncrefs
(
p
.
first
,
p
.
second
,
findIncrefPt
(
&
BB
));
addIncrefs
(
p
.
first
,
p
.
second
,
findIncrefPt
(
&
BB
));
}
}
state
.
refs
.
clear
();
state
.
refs
.
clear
();
}
}
llvm
::
outs
()
<<
"End of "
<<
BB
.
getName
()
<<
":
\n
"
;
for
(
auto
&&
p
:
state
.
refs
)
{
llvm
::
outs
()
<<
"With "
<<
p
.
second
<<
" refs: "
<<
*
p
.
first
<<
'\n'
;
}
llvm
::
outs
()
<<
'\n'
;
for
(
auto
&&
PBB
:
llvm
::
iterator_range
<
llvm
::
pred_iterator
>
(
llvm
::
pred_begin
(
&
BB
),
llvm
::
pred_end
(
&
BB
)))
{
for
(
auto
&&
PBB
:
llvm
::
iterator_range
<
llvm
::
pred_iterator
>
(
llvm
::
pred_begin
(
&
BB
),
llvm
::
pred_end
(
&
BB
)))
{
bool
all_succ_done
=
true
;
bool
all_succ_done
=
true
;
for
(
auto
&&
SBB
:
llvm
::
iterator_range
<
llvm
::
succ_iterator
>
(
llvm
::
succ_begin
(
PBB
),
llvm
::
succ_end
(
PBB
)))
{
for
(
auto
&&
SBB
:
llvm
::
iterator_range
<
llvm
::
succ_iterator
>
(
llvm
::
succ_begin
(
PBB
),
llvm
::
succ_end
(
PBB
)))
{
...
...
src/codegen/irgen/util.cpp
View file @
45349e60
...
@@ -132,7 +132,8 @@ llvm::Constant* embedRelocatablePtr(const void* addr, llvm::Type* type, llvm::St
...
@@ -132,7 +132,8 @@ llvm::Constant* embedRelocatablePtr(const void* addr, llvm::Type* type, llvm::St
assert
(
!
relocatable_syms
.
count
(
name
));
assert
(
!
relocatable_syms
.
count
(
name
));
name
=
shared_name
;
name
=
shared_name
;
}
else
{
}
else
{
name
=
(
llvm
::
Twine
(
"c"
)
+
llvm
::
Twine
(
relocatable_syms
.
size
())).
str
();
int
nsyms
=
relocatable_syms
.
size
();
name
=
(
llvm
::
Twine
(
"c"
)
+
llvm
::
Twine
(
nsyms
)).
str
();
}
}
relocatable_syms
[
name
]
=
addr
;
relocatable_syms
[
name
]
=
addr
;
...
...
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