]>
git.siccegge.de Git - frida/frida.git/blob - src/gui/widgets/FunctionWidget.cxx
1 #include "FunctionWidget.hxx"
3 #include "core/Function.hxx"
4 #include "core/BasicBlock.hxx"
5 #include "core/InformationManager.hxx"
7 #include "gui/widgets/CFGScene.hxx"
8 #include "gui/Mainwindow.hxx"
12 local__add_basic_block(BasicBlock
* block
,
13 Mainwindow
* mainwindow
, InformationManager
* manager
,
14 std::map
<uint64_t, BasicBlockWidget
*>& known_blocks
,
15 CFGScene
* scene
, uint64_t starty
, uint64_t startx
);
18 FunctionWidget::FunctionWidget(Function
* function
, Mainwindow
* mainwindow
)
20 , mainwindow(mainwindow
)
21 , logger(log4cxx::Logger::getLogger("gui.Mainwindow")) {
24 CFGScene
* scene
= new CFGScene
;
25 InformationManager
* manager
= function
->getManager();
27 BasicBlock
* block
= manager
->getBasicBlock(function
->getStartAddress());
28 LOG4CXX_DEBUG(logger
, "Building widget for functionction " << function
->getName());
29 for (auto i
: function
->blocks()) {
30 LOG4CXX_DEBUG(logger
, "Functionction contains Block " << i
.second
->getName());
33 uint64_t start_address(std::numeric_limits
<uint64_t>::max());
34 for (auto b
: function
->blocks()) {
35 if (b
.first
< start_address
)
36 start_address
= b
.first
;
39 std::map
<uint64_t, BasicBlockWidget
*> _blocks
;
40 local__add_basic_block(block
, mainwindow
,
41 manager
, _blocks
, scene
, start_address
, 100);
43 QGraphicsView
* view
= new QGraphicsView(scene
);
47 QTableWidget
* t
= new QTableWidget();
49 t
->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents
);
59 local__add_basic_block(BasicBlock
* block
,
60 Mainwindow
* mainwindow
, InformationManager
* manager
,
61 std::map
<uint64_t, BasicBlockWidget
*>& known_blocks
,
62 CFGScene
* scene
, uint64_t starty
, uint64_t startx
) {
64 decltype(known_blocks
.begin()) old
;
65 if ((old
= known_blocks
.find(block
->getStartAddress())) != known_blocks
.end())
69 s
<< "BLOCK_" << std::hex
<< block
->getStartAddress()
70 << "_" << block
->getEndAddress();
71 BasicBlockWidget
* widget
= new BasicBlockWidget(s
.str().c_str(),
74 known_blocks
.insert(std::make_pair(block
->getStartAddress(), widget
));
76 scene
->addItem(widget
);
77 widget
->setFlag(QGraphicsItem::ItemIsMovable
, true);
78 widget
->moveBy(100*startx
, block
->getStartAddress() - starty
);
80 BasicBlockWidget
*tmp
, *nextl(NULL
), *nextr(NULL
);
81 BasicBlock
* tmpblock
;
82 if (block
->getNextBlock(0) != 0) {
84 if (block
->getNextBlock(1) != 0)
86 tmpblock
= manager
->getBasicBlock(block
->getNextBlock(0));
87 tmp
= local__add_basic_block(tmpblock
, mainwindow
, manager
,
89 scene
, starty
, startx
+xshift
);
91 tmp
->addPrevious(widget
);
93 if (block
->getNextBlock(1) != 0) {
94 tmpblock
= manager
->getBasicBlock(block
->getNextBlock(1));
95 tmp
= local__add_basic_block(tmpblock
, mainwindow
, manager
,
97 scene
, starty
, startx
-1);
99 tmp
->addPrevious(widget
);
101 widget
->addNext(nextl
, nextr
);