-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalyses.cpp
162 lines (134 loc) · 5.01 KB
/
analyses.cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/******************************************************************************
* GRIDGEN: Grid Generating Compiler
* By: Andy Stone (aistone@gmail.com)
* (C) Copyright 2011 Colorado State University
*****************************************************************************/
#include "analyses.hpp"
#include "utils.hpp"
#include <string>
#include <iostream>
using namespace std;
// Maps symbols to environmental objects
std::map<std::string, IEnvironmental*> gSymbolTable;
/**
* This visitor finds nodes that mark calls to subroutines and functions in the
* GridLib library.
*/
class FindFunctionCalls : public AstSimpleProcessing {
public:
virtual void visit(SgNode *n);
int numCalls() const { return mCalls.size(); }
string getCall(int num) const { return mCalls[num]; }
SgFunctionCallExp* getCallNode(int num) const { return mNodes[num]; }
private:
vector<string> mCalls;
vector<SgFunctionCallExp*> mNodes;
};
void FindFunctionCalls::visit(SgNode *n) {
string name;
// Find all function calls that begin with environment_,
// schedule__, or data__
SgFunctionCallExp* call = isSgFunctionCallExp(n);
if(call != NULL) {
SgFunctionSymbol* func = call->getAssociatedFunctionSymbol();
name = func->get_name().getString();
trim(name);
if(name.find("neighbor_", 0) == 0 ||
name.find("subgrid_", 0) == 0 ||
name.find("grid_", 0) == 0 ||
name.find("distribution_", 0) == 0 ||
name.find("schedule_", 0) == 0 ||
name.find("data_", 0) == 0)
{
mCalls.push_back(name);
mNodes.push_back(call);
}
}
}
void CallsAnalysis::analyze(SgProject *proj) {
// Find calls to GridGen tool
FindFunctionCalls v;
v.traverseInputFiles(proj, preorder);
// Iterate through these calls and construct objects that wrap them.
for(int i = 0; i < v.numCalls(); i++) {
string call = v.getCall(i);
SgFunctionCallExp *node = v.getCallNode(i);
int pos = find(&CALL_IDENT[0], &CALL_IDENT[CALL__NUM_CALLS],
call) - &CALL_IDENT[0];
if(pos != CALL__NUM_CALLS) {
mCalls.push_back((*CALL_CONSTRUCTOR[pos])(node));
}
}
// Construct environmental objects based on call
EnvironmentConstructionVisitor envBuilder;
envBuilder.accept(mCalls);
}
void CallsAnalysis::print(std::ostream &out) const {
// Iterate through calls
for(vector<GridLibCall*>::const_iterator i = mCalls.begin();
i != mCalls.end(); i++)
{
(*i)->print(out);
}
}
Neighbor* CallsAnalysis::getNeighborForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<Neighbor*>(gSymbolTable.find(ftnIdent)->second);
}
Subgrid* CallsAnalysis::getSubgridForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<Subgrid*>(gSymbolTable.find(ftnIdent)->second);
}
Grid* CallsAnalysis::getGridForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<Grid*>(gSymbolTable.find(ftnIdent)->second);
}
Distribution* CallsAnalysis::getDistributionForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<Distribution*>(gSymbolTable.find(ftnIdent)->second);
}
Schedule* CallsAnalysis::getScheduleForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<Schedule*>(gSymbolTable.find(ftnIdent)->second);
}
DataObject* CallsAnalysis::getDataObjectForFortranVar(const std::string &ftnIdent) const {
return dynamic_cast<DataObject*>(gSymbolTable.find(ftnIdent)->second);
}
void EnvironmentConstructionVisitor::visit__subgrid_new(
Call__subgrid_new *call)
{
Subgrid *sg = Environment::newSubgrid(call->envName());
sg->setExtents(100, 100);
sg->setSymbolicExtents(call->width(), call->height());
gSymbolTable.insert(make_pair(call->lhs(), sg));
}
void EnvironmentConstructionVisitor::visit__grid_new(
Call__grid_new *call)
{
Grid *g = Environment::newGrid(call->envName());
gSymbolTable.insert(make_pair(call->lhs(), g));
}
void EnvironmentConstructionVisitor::visit__grid_addSubgrid(
Call__grid_addSubgrid *call)
{
Grid *g = dynamic_cast<Grid*>(gSymbolTable.find(call->grid())->second);
Subgrid *sg = dynamic_cast<Subgrid*>(gSymbolTable.find(call->subgrid())->second);
g->addSubgrid(sg);
}
void EnvironmentConstructionVisitor::visit__grid_addBorder(
Call__grid_addBorder *call)
{
}
void EnvironmentConstructionVisitor::visit__distribution_new(
Call__distribution_new *call)
{
Distribution *dist = Environment::newDistribution(call->envName());
gSymbolTable.insert(make_pair(call->lhs(), dist));
}
void EnvironmentConstructionVisitor::visit__schedule_new(
Call__schedule_new *call)
{
Schedule *sched = Environment::newSchedule(call->envName());
gSymbolTable.insert(make_pair(call->lhs(), sched));
}
void EnvironmentConstructionVisitor::visit__data_new(
Call__data_new *call)
{
DataObject *data = Environment::newDataObject(call->lhs());
gSymbolTable.insert(make_pair(call->lhs(), data));
}