-
Notifications
You must be signed in to change notification settings - Fork 0
/
CallgraphVisit.c
69 lines (56 loc) · 1.91 KB
/
CallgraphVisit.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include "CallgraphVisit.h"
#include <stdlib.h>
#include "DefinitionData.h"
#include "definition_analysis.h"
#include "parameters.h"
typedef struct {
GatheredCallgraph Callgraph;
CXCursor CurrentCaller;
} CallgraphVisitImpl;
CallgraphVisit CallgraphVisit_create(GatheredCallgraph modified)
{
CallgraphVisitImpl* visit_impl = malloc(sizeof(CallgraphVisitImpl));
visit_impl->Callgraph=modified;
return visit_impl;
}
void CallgraphVisit_dispose(CallgraphVisit v)
{
free((CallgraphVisitImpl*) v);
}
void CallgraphVisit_addCall(CallgraphVisit v, CXCursor called)
{
CallgraphVisitImpl* visit = (CallgraphVisitImpl*) v;
CXString current_usr = clang_getCursorUSR(visit->CurrentCaller);
CXString called_usr = clang_getCursorUSR(called);
GatheredCallgraph_addCall(
visit->Callgraph,
clang_getCString(current_usr),
clang_getCString(called_usr)
);
clang_disposeString(current_usr);
clang_disposeString(called_usr);
}
void CallgraphVisit_addFunctionDeclaration(CallgraphVisit v, CXCursor declared)
{
CallgraphVisitImpl* visit = (CallgraphVisitImpl*) v;
CXString usr = clang_getCursorUSR(declared);
if(!GatheredCallgraph_wasDeclared(visit->Callgraph, clang_getCString(usr))){
GatheredCallgraph_addDeclaration(visit->Callgraph, clang_getCString(usr), analyze_declaration(declared));
}
clang_disposeString(usr);
}
void CallgraphVisit_setCurrentFunctionDefinition(CallgraphVisit v, CXCursor defined)
{
CallgraphVisitImpl* visit = (CallgraphVisitImpl*) v;
CXString usr = clang_getCursorUSR(defined);
print_function_usr(clang_getCString(usr));
set_current_analyzed_function(clang_getCString(usr));
GatheredCallgraph_addDefinition(
visit->Callgraph,
clang_getCString(usr),
analyze(defined)
);
set_current_analyzed_function(NULL);
clang_disposeString(usr);
visit->CurrentCaller = defined;
}