Update copyright to LGPL on all files
[dyninst.git] / dyninstAPI / src / parRegion.C
1 /*
2  * Copyright (c) 1996-2009 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30  */
31
32 #include "parRegion.h"
33 #include "image-func.h"
34
35 #include "process.h"
36
37 image_parRegion::image_parRegion(image_func * imageFunc)
38 {
39    regionIf_ = imageFunc;
40   parentIf_ = NULL;
41 }
42
43 image_parRegion::image_parRegion(Address firstOffset, image_func * imageFunc)
44 {
45    regionIf_ = imageFunc;
46   parentIf_ = NULL;
47   firstInsnOffset_ = firstOffset;
48 }
49
50 image_func * image_parRegion::getAssociatedFunc(){return regionIf_;}
51
52 void image_parRegion::printDetails()
53 {  
54   printf("\n********************************************************\n");
55   
56   if (parentIf_)
57     printf("Parent func is %s\n", parentIf_->prettyName().c_str());
58   else
59     printf("Parent func NULL\n");
60   if (regionIf_)
61     printf("Outlined func is %s\n", regionIf_->prettyName().c_str());
62   else 
63     printf("Outlined func is NULL\n");
64   
65   printf("Begin address - 0x%lx\n", firstInsnOffset_);
66   printf("End address - 0x%lx\n", lastInsnOffset_);
67
68   printf("Region Type is ...");
69   if(regionType == OMP_NONE)
70     printf("OMP_NONE\n");
71   else if (regionType == OMP_PARALLEL)
72     printf("OMP_PARALLEL\n");
73   else if (regionType == OMP_DO_FOR)
74     printf("OMP_DO_FOR\n");
75   else if (regionType == OMP_SECTIONS)
76     printf("OMP_SECTIONS\n");
77   else if (regionType == OMP_SINGLE)
78     printf("OMP_SINGLE\n");
79   else if (regionType == OMP_PAR_DO)
80     printf("OMP_PAR_DO\n");
81   else if (regionType == OMP_PAR_SECTIONS)
82     printf("OMP_PAR_SECTIONS\n");
83   else if (regionType == OMP_MASTER)
84     printf("OMP_MASTER\n");
85   else if (regionType == OMP_CRITICAL)
86     printf("OMP_CRITICAL\n");
87   else if (regionType == OMP_BARRIER)
88     printf("OMP_BARRIER\n");
89   else if (regionType == OMP_ATOMIC)
90     printf("OMP_ATOMIC\n");
91   else if (regionType == OMP_FLUSH)
92     printf("OMP_FLUSH\n");
93   else if (regionType == OMP_ORDERED)
94     printf("OMP_ORDERED\n");
95   else if (regionType == OMP_DO_FOR_LOOP_BODY)
96     printf("OMP_DO_FOR_LOOP_BODY\n");
97   else
98     printf("UNKNOWN\n");
99
100   /*
101   std::map<const char *, int>::iterator iter;
102
103   printf("Mapped Items ...\n");
104   for (iter = clauses.begin(); iter != clauses.end(); iter++)
105     {
106       printf("Directive %s - Value %d\n", iter->first, iter->second); 
107     }
108   */
109
110  printf("********************************************************\n");
111
112 }
113
114 void image_parRegion::decodeClauses(int bitmap)
115 {
116   /* Par do always evaluates to '0' for power, which could be quite misleading to someone asking for the value, so 
117      for this purpose we just have it always return '1', as in, the thing is executed.  In the cases that
118      someone actually does put something like if(0) in the code, the par do section isn't even generated,
119      so this becomes moot */
120   if (regionType == OMP_PAR_DO)
121     clauses["IF"] = 1;
122
123   if (regionType == OMP_PARALLEL || regionType == OMP_PAR_SECTIONS)
124     clauses["IF"] = bitmap & 0x0001;
125   
126   bitmap >>= 2;
127
128   if (regionType == OMP_DO_FOR || regionType == OMP_SECTIONS || regionType == OMP_SINGLE)
129     clauses["NOWAIT"] = bitmap & 0x0001;
130
131   bitmap >>=2;
132
133   if (regionType == OMP_DO_FOR || regionType == OMP_PAR_DO)
134     clauses["ORDERED"] = bitmap & 0x0001;
135   
136 }
137
138 void image_parRegion::setRegionType(parRegType rt)
139 {
140   regionType = rt;
141   setClause("REGION_TYPE", (int) rt);
142
143
144 void image_parRegion::setClause(const char *key, int value)
145 {
146   clauses[key] = value;
147 }
148
149 void image_parRegion::setClauseLoc(const char *key, Address value)
150 {
151   clauses[key] = value;
152 }
153
154 int_parRegion::int_parRegion(image_parRegion *ip, Address baseAddr, int_function * iFunc)
155 {
156   ip_ = ip;
157   addr_ = baseAddr + ip->get_address();
158   endAddr_ = addr_ + ip->getSize();
159   intFunc_ = iFunc;
160 }
161
162 int_parRegion::~int_parRegion()
163 {}
164
165
166 int int_parRegion::getClause(const char * key)
167 {
168   return  ip_->getClause(key);   
169 }
170
171 int image_parRegion::getClause(const char * key)
172 {
173   if (clauses.find(key) != clauses.end())
174     return clauses[key];
175   else
176     return -1;
177 }
178
179
180 Address int_parRegion::getClauseLoc(const char * key)
181 {
182   return  ip_->getClauseLoc(key);   
183 }
184
185 Address image_parRegion::getClauseLoc(const char * key)
186 {
187   if (clauses.find(key) != clauses.end())
188     return clauses[key];
189   else
190     return 0;
191 }
192
193
194 int int_parRegion::replaceOMPParameter(const char * key, int value)
195 {
196   //  parReg->replaceOMPParameter(key,value);
197   
198   Address writeAddy = getClauseLoc(key);
199
200   Address writeValue = 0x39000000;
201
202   if (value > 0 )
203     writeValue += (unsigned) value;
204
205   AddressSpace * p = intFunc_->proc();
206
207   //printf("About to write value 0x%x to address 0x%x\n", writeValue, writeAddy);
208   
209   if (!p->writeDataSpace((void *) writeAddy, sizeof(writeValue), &writeValue))
210     fprintf(stderr, "%s[%d]:  writeDataSpace failed\n", FILE__, __LINE__);
211   
212   return 0;
213 }
214
215
216