Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
H
hostCompiledSimulation
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Gaurav Kukreja
hostCompiledSimulation
Commits
d6939e5b
Commit
d6939e5b
authored
Jul 15, 2014
by
Gaurav Kukreja
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added display_cfg functionality
Signed-off-by:
Gaurav Kukreja
<
gaurav@gauravk.in
>
parent
d7c836b6
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
292 additions
and
78 deletions
+292
-78
cfg.py
map_cfg/cfg.py
+3
-3
cfg_binary.py
map_cfg/cfg_binary.py
+2
-1
display_cfg.py
map_cfg/display_cfg.py
+234
-0
map_cfg.py
map_cfg/map_cfg.py
+53
-74
No files found.
map_cfg/cfg.py
View file @
d6939e5b
...
@@ -68,11 +68,11 @@ class ControlFlowGraph:
...
@@ -68,11 +68,11 @@ class ControlFlowGraph:
edgeIndex
=
edgeIndex
+
1
edgeIndex
=
edgeIndex
+
1
return
listSuccBlockIndices
return
listSuccBlockIndices
def
suc
cessorBlocks
(
self
,
blockIndex
):
def
prede
cessorBlocks
(
self
,
blockIndex
):
listSuccBlockIndices
=
[]
listSuccBlockIndices
=
[]
for
edge
in
self
.
listEdges
:
for
edge
in
self
.
listEdges
:
if
edge
.
from
BlockIndex
==
blockIndex
:
if
edge
.
to
BlockIndex
==
blockIndex
:
listSuccBlockIndices
.
append
(
edge
.
to
BlockIndex
)
listSuccBlockIndices
.
append
(
edge
.
from
BlockIndex
)
return
listSuccBlockIndices
return
listSuccBlockIndices
def
predecessorBlocksWOBackEdges
(
self
,
blockIndex
):
def
predecessorBlocksWOBackEdges
(
self
,
blockIndex
):
...
...
map_cfg/cfg_binary.py
View file @
d6939e5b
...
@@ -183,7 +183,8 @@ def parse_binary(fileName, listFunctionNames = []):
...
@@ -183,7 +183,8 @@ def parse_binary(fileName, listFunctionNames = []):
listBlocks
=
[]
listBlocks
=
[]
for
i
in
range
(
len
(
listCurrFuncBlockStartLineNum
)):
for
i
in
range
(
len
(
listCurrFuncBlockStartLineNum
)):
listBlocks
.
append
(
BasicBlock
(
listCurrFuncBlockStartLineNum
[
i
],
listBlocks
.
append
(
BasicBlock
(
listCurrFuncBlockStartLineNum
[
i
],
listCurrFuncBlockEndLineNum
[
i
]))
listCurrFuncBlockEndLineNum
[
i
],
name
=
"
%
d"
%
i
))
...
...
map_cfg/display_cfg.py
0 → 100644
View file @
d6939e5b
import
sys
import
pyqtgraph
as
pg
from
pyqtgraph.Qt
import
QtCore
,
QtGui
import
numpy
as
np
from
collections
import
deque
from
cfg
import
*
class
Graph
(
pg
.
GraphItem
):
def
__init__
(
self
):
self
.
dragPoint
=
None
self
.
dragOffset
=
None
self
.
textItems
=
[]
pg
.
GraphItem
.
__init__
(
self
)
self
.
scatter
.
sigClicked
.
connect
(
self
.
clicked
)
def
setData
(
self
,
**
kwds
):
self
.
text
=
kwds
.
pop
(
'text'
,
[])
self
.
data
=
kwds
if
'pos'
in
self
.
data
:
npts
=
self
.
data
[
'pos'
]
.
shape
[
0
]
self
.
data
[
'data'
]
=
np
.
empty
(
npts
,
dtype
=
[(
'index'
,
int
)])
self
.
data
[
'data'
][
'index'
]
=
np
.
arange
(
npts
)
self
.
setTexts
(
self
.
text
)
self
.
updateGraph
()
def
setTexts
(
self
,
text
):
for
i
in
self
.
textItems
:
i
.
scene
()
.
removeItem
(
i
)
self
.
textItems
=
[]
for
t
in
text
:
item
=
pg
.
TextItem
(
t
)
self
.
textItems
.
append
(
item
)
item
.
setParentItem
(
self
)
def
updateGraph
(
self
):
pg
.
GraphItem
.
setData
(
self
,
**
self
.
data
)
for
i
,
item
in
enumerate
(
self
.
textItems
):
item
.
setPos
(
*
self
.
data
[
'pos'
][
i
])
def
mouseDragEvent
(
self
,
ev
):
if
ev
.
button
()
!=
QtCore
.
Qt
.
LeftButton
:
ev
.
ignore
()
return
if
ev
.
isStart
():
# We are already one step into the drag.
# Find the point(s) at the mouse cursor when the button was first
# pressed:
pos
=
ev
.
buttonDownPos
()
pts
=
self
.
scatter
.
pointsAt
(
pos
)
if
len
(
pts
)
==
0
:
ev
.
ignore
()
return
self
.
dragPoint
=
pts
[
0
]
ind
=
pts
[
0
]
.
data
()[
0
]
self
.
dragOffset
=
self
.
data
[
'pos'
][
ind
]
-
pos
elif
ev
.
isFinish
():
self
.
dragPoint
=
None
return
else
:
if
self
.
dragPoint
is
None
:
ev
.
ignore
()
return
ind
=
self
.
dragPoint
.
data
()[
0
]
self
.
data
[
'pos'
][
ind
]
=
ev
.
pos
()
+
self
.
dragOffset
self
.
updateGraph
()
ev
.
accept
()
def
clicked
(
self
,
pts
):
print
(
"clicked:
%
s"
%
pts
)
verticalGap
=
5
horizontalGap
=
15
def
display_cfgs
(
app
,
cfg1
,
cfg2
,
windowTitle
):
# Initialization of Qt
# Enable antialiasing for prettier plots
pg
.
setConfigOptions
(
antialias
=
True
)
w
=
pg
.
GraphicsWindow
()
w
.
setWindowTitle
(
windowTitle
)
v1
=
w
.
addViewBox
()
v1
.
setAspectLocked
()
g1
=
Graph
()
v1
.
addItem
(
g1
)
(
pos
,
adj
,
texts
,
symbols
)
=
draw_cfg
(
cfg1
)
g1
.
setData
(
pos
=
pos
,
adj
=
adj
,
size
=
1
,
pxMode
=
False
,
text
=
texts
,
symbol
=
symbols
)
v2
=
w
.
addViewBox
()
v2
.
setAspectLocked
()
g2
=
Graph
()
v2
.
addItem
(
g2
)
(
pos
,
adj
,
texts
,
symbols
)
=
draw_cfg
(
cfg2
)
print
adj
g2
.
setData
(
pos
=
pos
,
adj
=
adj
,
size
=
1
,
pxMode
=
False
,
text
=
texts
,
symbol
=
symbols
)
app
.
exec_
();
def
draw_cfg
(
cfg1
):
logging
.
debug
(
"Inside Function draw_cfg()"
)
'''
Breadth first search for all blocks in the Control Flow Graph to print them
on screen.
'''
posOfBlock
=
{}
posOfBlock
[
0
]
=
0
symbols
=
[
'+'
]
pos
=
np
.
array
([[
0
,
0
]])
adj
=
None
texts
=
[
"
%
s"
%
cfg1
.
listBlocks
[
0
]
.
name
]
# Queue for BFS
q
=
deque
([
0
])
while
q
:
# Extract entry from queue, will be 0 for the first iteration.
blockInd
=
q
.
popleft
()
logging
.
debug
(
"Block
%
d"
%
blockInd
)
# Find all children of the
succBlocks
=
cfg1
.
successorBlocks
(
blockInd
)
print
"
\t
successors = "
,
print
succBlocks
spaceForChildren
=
(
len
(
succBlocks
)
-
1
)
*
horizontalGap
logging
.
debug
(
"
\t
has
%
d children, space =
%
d"
%
(
len
(
succBlocks
),
spaceForChildren
))
if
len
(
succBlocks
)
>
1
:
i
=
0
for
succBlock
in
succBlocks
:
if
succBlock
==
blockInd
:
# Self Edge!!
continue
logging
.
debug
(
"
\t
Successor Block
%
d"
%
succBlock
)
if
succBlock
in
posOfBlock
:
logging
.
debug
(
"
\t\t
Already drawn at
%
d,
%
d"
%
(
pos
[
posOfBlock
[
succBlock
]][
0
],
pos
[
posOfBlock
[
succBlock
]][
1
]))
if
adj
==
None
:
adj
=
np
.
array
([[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]]])
else
:
adj
=
np
.
insert
(
adj
,
len
(
adj
),
[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]],
axis
=
0
)
else
:
parent
=
None
for
predBlock
in
cfg1
.
predecessorBlocks
(
succBlock
):
if
predBlock
in
posOfBlock
:
parent
=
predBlock
break
;
if
parent
==
None
:
# should never occur
logging
.
error
(
"Parent of a child does not exist, which should never happen!"
)
exit
(
1
)
parentPos
=
pos
[
posOfBlock
[
parent
]]
posSuccBlock
=
[
parentPos
[
0
]
-
(
spaceForChildren
/
2
)
+
(
i
*
horizontalGap
),
parentPos
[
1
]
-
verticalGap
]
posOfBlock
[
succBlock
]
=
len
(
pos
)
pos
=
np
.
insert
(
pos
,
len
(
pos
),
posSuccBlock
,
axis
=
0
)
if
adj
==
None
:
adj
=
np
.
array
([[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]]])
else
:
adj
=
np
.
insert
(
adj
,
len
(
adj
),
[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]],
axis
=
0
)
logging
.
debug
(
"
\t\t
Drawn at
%
d,
%
d"
%
(
posSuccBlock
[
0
],
posSuccBlock
[
1
]))
texts
.
append
(
"
%
s"
%
cfg1
.
listBlocks
[
succBlock
]
.
name
)
if
cfg1
.
listBlocks
[
succBlock
]
.
isReturning
==
1
:
symbols
.
append
(
'x'
)
else
:
symbols
.
append
(
'o'
)
if
succBlock
not
in
q
:
q
.
append
(
succBlock
)
i
=
i
+
1
elif
len
(
succBlocks
)
==
1
:
succBlock
=
succBlocks
[
0
]
logging
.
debug
(
"
\t
Successor Block
%
d"
%
succBlock
)
if
succBlock
in
posOfBlock
:
logging
.
debug
(
"
\t\t
Already drawn at
%
d,
%
d"
%
(
pos
[
posOfBlock
[
succBlock
]][
0
],
pos
[
posOfBlock
[
succBlock
]][
1
]))
if
adj
==
None
:
adj
=
np
.
array
([[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]]])
else
:
adj
=
np
.
insert
(
adj
,
len
(
adj
),
[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]],
axis
=
0
)
else
:
predBlocks
=
cfg1
.
predecessorBlocksWOBackEdges
(
succBlock
)
if
len
(
predBlocks
)
>
1
:
posSuccBlockX
=
0
posSuccBlockY
=
0
for
predBlock
in
predBlocks
:
posSuccBlockX
=
pos
[
posOfBlock
[
predBlock
]][
0
]
+
posSuccBlockX
if
posSuccBlockY
>
pos
[
posOfBlock
[
predBlock
]][
1
]
-
verticalGap
:
posSuccBlockY
=
pos
[
posOfBlock
[
predBlock
]][
1
]
-
verticalGap
posSuccBlockX
=
posSuccBlockX
/
len
(
predBlocks
)
posSuccBlock
=
[
posSuccBlockX
,
posSuccBlockY
]
posOfBlock
[
succBlock
]
=
len
(
pos
)
pos
=
np
.
insert
(
pos
,
len
(
pos
),
posSuccBlock
,
axis
=
0
)
if
adj
==
None
:
adj
=
np
.
array
([[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]]])
else
:
adj
=
np
.
insert
(
adj
,
len
(
adj
),
[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]],
axis
=
0
)
logging
.
debug
(
"
\t\t
Drawn at
%
d,
%
d"
%
(
posSuccBlock
[
0
],
posSuccBlock
[
1
]))
texts
.
append
(
"
%
s"
%
cfg1
.
listBlocks
[
succBlock
]
.
name
)
if
cfg1
.
listBlocks
[
succBlock
]
.
isReturning
==
1
:
symbols
.
append
(
'x'
)
else
:
symbols
.
append
(
'o'
)
if
succBlock
not
in
q
:
q
.
append
(
succBlock
)
else
:
parent
=
predBlocks
[
0
]
parentPos
=
pos
[
posOfBlock
[
parent
]]
posSuccBlock
=
[
parentPos
[
0
],
parentPos
[
1
]
-
verticalGap
]
posOfBlock
[
succBlock
]
=
len
(
pos
)
pos
=
np
.
insert
(
pos
,
len
(
pos
),
posSuccBlock
,
axis
=
0
)
if
adj
==
None
:
adj
=
np
.
array
([[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]]])
else
:
adj
=
np
.
insert
(
adj
,
len
(
adj
),
[
posOfBlock
[
blockInd
],
posOfBlock
[
succBlock
]],
axis
=
0
)
logging
.
debug
(
"
\t\t
Drawn at
%
d,
%
d"
%
(
posSuccBlock
[
0
],
posSuccBlock
[
1
]))
texts
.
append
(
"
%
s"
%
cfg1
.
listBlocks
[
succBlock
]
.
name
)
if
cfg1
.
listBlocks
[
succBlock
]
.
isReturning
==
1
:
symbols
.
append
(
'x'
)
else
:
symbols
.
append
(
'o'
)
if
succBlock
not
in
q
:
q
.
append
(
succBlock
)
else
:
continue
return
pos
,
adj
,
texts
,
symbols
\ No newline at end of file
map_cfg/map_cfg.py
View file @
d6939e5b
...
@@ -6,12 +6,15 @@ from optparse import OptionParser
...
@@ -6,12 +6,15 @@ from optparse import OptionParser
from
subprocess
import
call
from
subprocess
import
call
import
logging
import
logging
import
re
import
re
from
collections
import
deque
import
sys
from
PyQt4
import
QtGui
,
QtCore
from
cfg_binary
import
parse_binary
,
print_debug_binary
from
cfg_binary
import
parse_binary
,
print_debug_binary
from
cfg_isc
import
parse_isc
,
print_debug_isc
from
cfg_isc
import
parse_isc
,
print_debug_isc
from
display_cfg
import
display_cfgs
app
=
None
from
collections
import
deque
listISCFileNames
=
[]
listISCFileNames
=
[]
listObjdumpFileNames
=
[]
listObjdumpFileNames
=
[]
...
@@ -60,6 +63,28 @@ def printDebugMapCFG(listISCFunctions, listObjdumpFunctions, gdbMapping):
...
@@ -60,6 +63,28 @@ def printDebugMapCFG(listISCFunctions, listObjdumpFunctions, gdbMapping):
ISCBlockName
))
ISCBlockName
))
i
=
i
+
1
i
=
i
+
1
for
func
in
listISCFunctions
:
print
(
"
\n
FileName :
%
s"
%
(
func
.
fileName
))
print
(
"Function :
%
s"
%
(
func
.
functionName
))
ObjFuncCfg
=
find
(
lambda
fn
:
fn
.
functionName
==
func
.
functionName
,
listObjdumpFunctions
)
.
cfg
i
=
0
for
block
in
func
.
cfg
.
listBlocks
:
print
(
"
\t
Block
%
s: line
%
d -
%
d, flow =
%
f, nestingLevel =
%
d"
%
(
func
.
cfg
.
listBlocks
[
i
]
.
name
,
block
.
startLine
,
block
.
endLine
,
block
.
flow
,
block
.
nestingLevel
))
print
"
\t
Maps to "
,
print
list
(
set
(
block
.
mapsTo
))
for
funcCall
in
block
.
listFunctionCalls
:
print
(
"
\t\t
calls
%
s()"
%
(
funcCall
))
if
block
.
hasConditionalExec
==
1
:
print
(
"
\t\t
Conditional Execution Instruction!"
)
if
block
.
isReturning
==
1
:
print
(
"
\t\t
returns"
)
for
edge
in
func
.
cfg
.
listEdges
:
if
edge
.
fromBlockIndex
==
i
:
print
(
"
\t\t
Edge to block
%
s"
%
(
func
.
cfg
.
listBlocks
[
edge
.
toBlockIndex
]
.
name
))
i
=
i
+
1
def
gdbMappingDebug
(
gdbMapping
):
def
gdbMappingDebug
(
gdbMapping
):
for
lineNum
in
gdbMapping
:
for
lineNum
in
gdbMapping
:
print
(
"line
%
d maps to
%
s:
%
d"
%
(
lineNum
,
gdbMapping
[
lineNum
]
.
fileName
,
gdbMapping
[
lineNum
]
.
lineNum
))
print
(
"line
%
d maps to
%
s:
%
d"
%
(
lineNum
,
gdbMapping
[
lineNum
]
.
fileName
,
gdbMapping
[
lineNum
]
.
lineNum
))
...
@@ -116,12 +141,12 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -116,12 +141,12 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
mappingStackObj
.
append
(
blockIndObj
)
mappingStackObj
.
append
(
blockIndObj
)
blockISC
=
cfgISC
.
listBlocks
[
blockIndISC
]
blockISC
=
cfgISC
.
listBlocks
[
blockIndISC
]
blockObj
=
cfgObj
.
listBlocks
[
blockIndObj
]
blockObj
=
cfgObj
.
listBlocks
[
blockIndObj
]
print
"
\t
Mapping blocks ISC:
%
s and OBJ:
%
d"
%
(
blockISC
.
name
,
blockIndObj
)
logging
.
debug
(
"
\t
Mapping blocks ISC:
%
s and OBJ:
%
d"
%
(
blockISC
.
name
,
blockIndObj
)
)
print
"
\t
mergedLevelsISC =
%
d"
%
(
mergedLevelsISC
)
logging
.
debug
(
"
\t
mergedLevelsISC =
%
d"
%
(
mergedLevelsISC
)
)
if
(
blockISC
.
isReturning
==
1
and
if
(
blockISC
.
isReturning
==
1
and
blockObj
.
isReturning
==
1
):
blockObj
.
isReturning
==
1
):
print
"
\t\t
Both Blocks return!!!"
logging
.
debug
(
"
\t\t
Both Blocks return!!!"
)
blockISC
.
mapsTo
.
append
(
blockIndObj
)
blockISC
.
mapsTo
.
append
(
blockIndObj
)
blockObj
.
mapsTo
.
append
(
blockIndISC
)
blockObj
.
mapsTo
.
append
(
blockIndISC
)
mappingStackISC
.
pop
()
mappingStackISC
.
pop
()
...
@@ -131,7 +156,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -131,7 +156,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
if
(
blockISC
.
flow
!=
blockObj
.
flow
or
if
(
blockISC
.
flow
!=
blockObj
.
flow
or
(
blockISC
.
nestingLevel
-
mergedLevelsISC
)
!=
blockObj
.
nestingLevel
or
(
blockISC
.
nestingLevel
-
mergedLevelsISC
)
!=
blockObj
.
nestingLevel
or
blockISC
.
isReturning
!=
blockObj
.
isReturning
):
blockISC
.
isReturning
!=
blockObj
.
isReturning
):
print
"
\t\t
Flow, or nesting level did not match or only one of them returns!"
logging
.
debug
(
"
\t\t
Flow, or nesting level did not match or only one of them returns!"
)
mappingStackISC
.
pop
()
mappingStackISC
.
pop
()
mappingStackObj
.
pop
()
mappingStackObj
.
pop
()
return
-
1
return
-
1
...
@@ -148,7 +173,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -148,7 +173,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
if
(
len
(
listSuccWOBackEdgeISC
)
!=
len
(
listSuccWOBackEdgeObj
)):
if
(
len
(
listSuccWOBackEdgeISC
)
!=
len
(
listSuccWOBackEdgeObj
)):
if
(
blockObj
.
hasConditionalExec
==
1
and
if
(
blockObj
.
hasConditionalExec
==
1
and
len
(
listSuccWOBackEdgeObj
)
==
len
(
listSuccWOBackEdgeISC
)
-
1
):
len
(
listSuccWOBackEdgeObj
)
==
len
(
listSuccWOBackEdgeISC
)
-
1
):
print
"
\t\t
Conditional Execution Found!"
logging
.
debug
(
"
\t\t
Conditional Execution Found!"
)
# Conditional Execution!
# Conditional Execution!
for
succ1BlockISC
in
listSuccISC
:
for
succ1BlockISC
in
listSuccISC
:
if
succ1BlockISC
in
mappingStackISC
:
if
succ1BlockISC
in
mappingStackISC
:
...
@@ -156,12 +181,13 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -156,12 +181,13 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
for
succSucc1BlockISC
in
cfgISC
.
successorBlocks
(
succ1BlockISC
):
for
succSucc1BlockISC
in
cfgISC
.
successorBlocks
(
succ1BlockISC
):
if
succSucc1BlockISC
in
mappingStackISC
:
if
succSucc1BlockISC
in
mappingStackISC
:
continue
continue
for
succ2BlockISC
in
list
(
set
(
listSuccISC
)
-
{
succ1BlockISC
}):
for
succ2BlockISC
in
list
(
set
(
listSuccISC
)
-
{
succ1BlockISC
}):
if
succ2BlockISC
in
mappingStackISC
:
if
succ2BlockISC
in
mappingStackISC
:
continue
continue
if
succSucc1BlockISC
==
succ2BlockISC
:
if
succSucc1BlockISC
==
succ2BlockISC
:
# case 1
# case 1
print
"
\t\t
case 1"
logging
.
debug
(
"
\t\t
case 1"
)
mappingStackISC
.
append
(
succ1BlockISC
)
mappingStackISC
.
append
(
succ1BlockISC
)
mappingStackObj
.
pop
()
# popping blockIndObj, because mapping it again
mappingStackObj
.
pop
()
# popping blockIndObj, because mapping it again
if
mapping
(
cfgISC
,
succ2BlockISC
,
cfgObj
,
blockIndObj
,
mergedLevelsISC
+
1
)
==
0
:
if
mapping
(
cfgISC
,
succ2BlockISC
,
cfgObj
,
blockIndObj
,
mergedLevelsISC
+
1
)
==
0
:
...
@@ -176,32 +202,6 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -176,32 +202,6 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
mappingStackISC
.
pop
()
mappingStackISC
.
pop
()
mappingStackObj
.
append
(
blockIndObj
)
mappingStackObj
.
append
(
blockIndObj
)
# if succSucc1BlockISC in (set(listSuccISC) - {succ1BlockISC}):
# # case 1
# print "\t\tcase 1"
# for succSuccSucc1BlockISC in cfgISC.successorBlocks(succSucc1BlockISC):
# if succSuccSucc1BlockISC in mappingStackISC:
# continue
# for succBlockObj in listSuccObj:
# if succBlockObj in mappingStackObj:
# continue
# mappingStackISC.append(succ1BlockISC)
# mappingStackISC.append(succSucc1BlockISC)
# if mapping(cfgISC, succSuccSucc1BlockISC, cfgObj, succBlockObj, mergedLevelsISC+1) == 0:
# cfgISC.listBlocks[blockIndISC].mapsTo.append(blockIndObj)
# cfgISC.listBlocks[succ1BlockISC].mapsTo.append(blockIndObj)
# cfgISC.listBlocks[succSucc1BlockISC].mapsTo.append(blockIndObj)
# cfgObj.listBlocks[blockIndObj].mapsTo.append(succSucc1BlockISC)
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackObj.pop()
# return 0
# else:
# mappingStackISC.pop()
# mappingStackISC.pop()
for
succ2BlockISC
in
list
(
set
(
listSuccISC
)
-
{
succ1BlockISC
}):
for
succ2BlockISC
in
list
(
set
(
listSuccISC
)
-
{
succ1BlockISC
}):
if
succ2BlockISC
in
mappingStackISC
:
if
succ2BlockISC
in
mappingStackISC
:
continue
continue
...
@@ -210,7 +210,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -210,7 +210,7 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
continue
continue
if
succSucc1BlockISC
==
succSucc2BlockISC
:
if
succSucc1BlockISC
==
succSucc2BlockISC
:
# case 2
# case 2
print
"
\t\t
case 2"
logging
.
debug
(
"
\t\t
case 2"
)
mappingStackISC
.
append
(
succ1BlockISC
)
mappingStackISC
.
append
(
succ1BlockISC
)
mappingStackISC
.
append
(
succ2BlockISC
)
mappingStackISC
.
append
(
succ2BlockISC
)
mappingStackObj
.
pop
()
# popping blockIndObj, because mapping it again
mappingStackObj
.
pop
()
# popping blockIndObj, because mapping it again
...
@@ -229,45 +229,17 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -229,45 +229,17 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
mappingStackISC
.
pop
()
mappingStackISC
.
pop
()
mappingStackObj
.
append
(
blockIndObj
)
mappingStackObj
.
append
(
blockIndObj
)
# for succSuccSucc1BlockISC in cfgISC.successorBlocks(succSucc1BlockISC):
# if succSuccSucc1BlockISC in mappingStackISC:
# continue
# for succBlockObj in listSuccObj:
# if succBlockObj in mappingStackObj:
# continue
# mappingStackISC.append(succ1BlockISC)
# mappingStackISC.append(succ2BlockISC)
# mappingStackISC.append(succSucc1BlockISC)
# if mapping(cfgISC, succSuccSucc1BlockISC, cfgObj, succBlockObj, mergedLevelsISC+2) == 0:
# cfgISC.listBlocks[blockIndISC].mapsTo.append(blockIndObj)
# cfgISC.listBlocks[succ1BlockISC].mapsTo.append(blockIndObj)
# cfgISC.listBlocks[succ2BlockISC].mapsTo.append(blockIndObj)
# cfgISC.listBlocks[succSucc1BlockISC].mapsTo.append(blockIndObj)
# cfgObj.listBlocks[blockIndObj].mapsTo.append(succSucc1BlockISC)
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackObj.pop()
# return 0
# else:
# mappingStackISC.pop()
# mappingStackISC.pop()
# mappingStackISC.pop()
else
:
else
:
print
"no. of successors not same, and difference more than one."
logging
.
debug
(
"no. of successors not same, and difference more than one."
)
print
"ISC Block
%
d; Obj Block
%
d"
%
(
blockIndISC
,
blockIndObj
)
logging
.
debug
(
"ISC Block
%
d; Obj Block
%
d"
%
(
blockIndISC
,
blockIndObj
)
)
exit
(
1
)
exit
(
1
)
print
"Successors of ISC:
%
d"
%
(
blockIndISC
),
print
cfgISC
.
successorBlocks
(
blockIndISC
)
for
succBlockISC
in
cfgISC
.
successorBlocks
(
blockIndISC
):
for
succBlockISC
in
cfgISC
.
successorBlocks
(
blockIndISC
):
if
succBlockISC
in
mappingStackISC
:
if
succBlockISC
in
mappingStackISC
:
continue
continue
for
succBlockObj
in
listSuccObj
:
for
succBlockObj
in
listSuccObj
:
if
succBlockObj
in
mappingStackObj
:
if
succBlockObj
in
mappingStackObj
:
continue
continue
print
"recursing on mapping"
if
mapping
(
cfgISC
,
succBlockISC
,
cfgObj
,
succBlockObj
,
mergedLevelsISC
)
==
0
:
if
mapping
(
cfgISC
,
succBlockISC
,
cfgObj
,
succBlockObj
,
mergedLevelsISC
)
==
0
:
blockISC
.
mapsTo
.
append
(
blockIndObj
)
blockISC
.
mapsTo
.
append
(
blockIndObj
)
blockObj
.
mapsTo
.
append
(
blockIndISC
)
blockObj
.
mapsTo
.
append
(
blockIndISC
)
...
@@ -276,7 +248,6 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
...
@@ -276,7 +248,6 @@ def mapping(cfgISC, blockIndISC, cfgObj, blockIndObj, mergedLevelsISC):
mappingStackISC
.
pop
()
mappingStackISC
.
pop
()
mappingStackObj
.
pop
()
mappingStackObj
.
pop
()
print
"Here"
return
0
return
0
def
map_cfg
(
listISCFileNames
,
listObjdumpFileNames
,
listBinaryFileNames
):
def
map_cfg
(
listISCFileNames
,
listObjdumpFileNames
,
listBinaryFileNames
):
...
@@ -314,8 +285,7 @@ def map_cfg(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
...
@@ -314,8 +285,7 @@ def map_cfg(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
for
binaryFileName
in
listBinaryFileNames
:
for
binaryFileName
in
listBinaryFileNames
:
gdbMapping
=
getGDBMapping
(
binaryFileName
,
objdumpLineNumForAddress
)
gdbMapping
=
getGDBMapping
(
binaryFileName
,
objdumpLineNumForAddress
)
print_debug_isc
(
listISCFunctions
)
print_debug_binary
(
listObjdumpFunctions
,
gdbMapping
)
mappingStackISC
=
[]
mappingStackISC
=
[]
mappingStackObj
=
[]
mappingStackObj
=
[]
...
@@ -324,18 +294,27 @@ def map_cfg(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
...
@@ -324,18 +294,27 @@ def map_cfg(listISCFileNames, listObjdumpFileNames, listBinaryFileNames):
fnObj
=
find
(
lambda
fn
:
fn
.
functionName
==
fnISC
.
functionName
,
listObjdumpFunctions
)
fnObj
=
find
(
lambda
fn
:
fn
.
functionName
==
fnISC
.
functionName
,
listObjdumpFunctions
)
cfgObj
=
fnObj
.
cfg
cfgObj
=
fnObj
.
cfg
print
"Mapping Function
%
s"
%
(
fnISC
.
functionName
)
logging
.
debug
(
"Mapping Function
%
s"
%
(
fnISC
.
functionName
)
)
if
mapping
(
cfgISC
,
0
,
cfgObj
,
0
,
0
)
==
0
:
if
mapping
(
cfgISC
,
0
,
cfgObj
,
0
,
0
)
==
0
:
print
"Mapping Found!!!!"
logging
.
debug
(
"Mapping Found!!!!s"
)
else
:
else
:
print
"Fuck my life!!!"
logging
.
debug
(
"Fuck my life!!!"
)
# print_debug_isc (listISCFunctions)
# print_debug_binary (listObjdumpFunctions, gdbMapping)
printDebugMapCFG
(
listISCFunctions
,
listObjdumpFunctions
,
gdbMapping
)
printDebugMapCFG
(
listISCFunctions
,
listObjdumpFunctions
,
gdbMapping
)
display_cfgs
(
app
,
listISCFunctions
[
0
]
.
cfg
,
listObjdumpFunctions
[
0
]
.
cfg
,
"
%
s"
%
listISCFunctions
[
0
]
.
functionName
)
# display_cfg(app, listISCFunctions[1].cfg, "%s" % listISCFunctions[0].functionName)
# app.exec_()
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
# listISCFileNames = []
# listISCFileNames = []
# listObjdumpFileNames = []
# listObjdumpFileNames = []
app
=
QtGui
.
QApplication
(
sys
.
argv
)
logging
.
basicConfig
(
level
=
logging
.
WARNING
)
logging
.
basicConfig
(
level
=
logging
.
WARNING
)
optparser
=
OptionParser
()
optparser
=
OptionParser
()
optparser
.
add_option
(
"-i"
,
"--isc"
,
action
=
"append"
,
dest
=
"listISCFileNames"
,
optparser
.
add_option
(
"-i"
,
"--isc"
,
action
=
"append"
,
dest
=
"listISCFileNames"
,
...
...
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