@@ -19,40 +19,64 @@ Def::Def(G4_DstRegRegion* dst) {
19
19
G4_RegVar* dstRegVar = dstBase->asRegVar ();
20
20
G4_Declare* dstDecl = dstRegVar->getDeclare ();
21
21
22
- this ->name = dstRegVar->getName ();
23
- this ->nameLen = strnlen (this ->name , MAX_STRLEN);
24
-
25
- this ->hstride = dst->getHorzStride ();
26
- this ->typeSize = dst->getTypeSize ();
27
-
28
- this ->reg = dstRegVar->getPhyReg ()->asGreg ()->getRegNum ();
29
- this ->subreg = dstRegVar->getPhyRegOff () + dst->getSubRegOff ();
30
-
31
- unsigned int offsetFromR0 = dstDecl->getGRFOffsetFromR0 ();
32
- this ->leftBound = offsetFromR0 + dst->getLeftBound ();
33
- this ->rightBound = offsetFromR0 + dst->getRightBound ();
22
+ // handle the case where this VV is aliased to another VV
23
+ unsigned int rootOffset = 0 ;
24
+ G4_Declare* rootDecl = dstDecl->getRootDeclare (rootOffset);
25
+ G4_RegVar* rootRegVar = rootDecl->getRegVar ();
26
+
27
+ regFileKind = rootDecl->getRegFile ();
28
+ reg = rootRegVar->getPhyReg ()->asGreg ()->getRegNum ();
29
+ subreg = rootRegVar->getPhyRegOff ();
30
+ byteSize = rootDecl->getByteSize ();
31
+ aliasOffset = rootOffset;
32
+
33
+ rowOffset = dst->getRegOff ();
34
+ colOffset = dst->getSubRegOff ();
35
+
36
+ hstride = dst->getHorzStride ();
37
+ typeSize = dst->getTypeSize ();
38
+
39
+ unsigned int offsetFromR0 = rootDecl->getGRFOffsetFromR0 ();
40
+ rootBound = offsetFromR0 + rootOffset;
41
+ leftBound = dst->getLeftBound ();
42
+ rightBound = dst->getRightBound ();
43
+
44
+ name = rootRegVar->getName ();
45
+ nameLen = strnlen (this ->name , MAX_STRLEN);
34
46
}
35
47
36
48
Use::Use (G4_SrcRegRegion* src) {
37
49
G4_VarBase* srcBase = src->getBase ();
38
50
G4_RegVar* srcRegVar = srcBase->asRegVar ();
39
51
G4_Declare* srcDecl = srcRegVar->getDeclare ();
40
52
41
- this ->name = srcRegVar->getName ();
42
- this ->nameLen = strnlen (this ->name , MAX_STRLEN);
53
+ // handle the case where this VV is aliased to another VV
54
+ unsigned int rootOffset = 0 ;
55
+ G4_Declare* rootDecl = srcDecl->getRootDeclare (rootOffset);
56
+ G4_RegVar* rootRegVar = rootDecl->getRegVar ();
43
57
44
- const RegionDesc* srcRegion = src->getRegion ();
45
- this ->hstride = srcRegion->horzStride ;
46
- this ->vstride = srcRegion->vertStride ;
47
- this ->width = srcRegion->width ;
58
+ regFileKind = rootDecl->getRegFile ();
59
+ reg = rootRegVar->getPhyReg ()->asGreg ()->getRegNum ();
60
+ subreg = rootRegVar->getPhyRegOff ();
61
+ byteSize = rootDecl->getByteSize ();
62
+ aliasOffset = rootOffset;
48
63
49
- this ->typeSize = src->getTypeSize ();
50
- this ->reg = srcRegVar->getPhyReg ()->asGreg ()->getRegNum ();
51
- this ->subreg = srcRegVar->getPhyRegOff () + src->getSubRegOff ();
64
+ rowOffset = src->getRegOff ();
65
+ colOffset = src->getSubRegOff ();
52
66
53
- unsigned int offsetFromR0 = srcDecl->getGRFOffsetFromR0 ();
54
- this ->leftBound = offsetFromR0 + src->getLeftBound ();
55
- this ->rightBound = offsetFromR0 + src->getRightBound ();
67
+ const RegionDesc* srcRegion = src->getRegion ();
68
+ hstride = srcRegion->horzStride ;
69
+ vstride = srcRegion->vertStride ;
70
+ width = srcRegion->width ;
71
+ typeSize = src->getTypeSize ();
72
+
73
+ unsigned int offsetFromR0 = rootDecl->getGRFOffsetFromR0 ();
74
+ rootBound = offsetFromR0 + rootOffset;
75
+ leftBound = src->getLeftBound ();
76
+ rightBound = src->getRightBound ();
77
+
78
+ name = rootRegVar->getName ();
79
+ nameLen = strnlen (this ->name , MAX_STRLEN);
56
80
}
57
81
58
82
void MetadataDumpRA::addKernelMD (G4_Kernel* kernel) {
@@ -155,12 +179,14 @@ void MetadataDumpRA::addKernelMD(G4_Kernel* kernel) {
155
179
// |--- ... ... ...
156
180
// <repeats numKernels times, for each Kernel>
157
181
// |--- ... ... ...
158
- void MetadataDumpRA::emitMetadataFile () {
182
+ void MetadataDumpRA::emitMetadataFile (std::string asmName, std::string kernelName ) {
159
183
using namespace std ;
160
- ofstream MDFile;
161
184
162
- // create metadata file in CWD -- FIXME: emit to a specific dump dir
163
- MDFile.open (" RA_METADATA_DUMP" , ios::trunc);
185
+ // create metadata file in shader dump
186
+ ofstream MDFile;
187
+ stringstream ssInit;
188
+ ssInit << asmName << " _" << kernelName << " .ra_metadata" ;
189
+ MDFile.open (ssInit.str (), std::ofstream::binary);
164
190
165
191
// write number of kernels to file
166
192
assert (numKernels == kernelMetadatas.size ());
@@ -184,13 +210,15 @@ void MetadataDumpRA::emitMetadataFile() {
184
210
185
211
for (Def def : iMD.instDefs ) {
186
212
213
+ // uchar (1) : regFileKind
187
214
// ushort (1) : typeSize
188
- // uint (6 ) : leftBound, rightBound, reg, subreg, hstride, nameLen
189
- streamsize defOffset = sizeof (unsigned short ) + sizeof (unsigned int ) * 6 ;
215
+ // uint (10 ) : reg, subreg, byteSize, aliasOffset, row/colOffset, hstride, root/l/rBound , nameLen
216
+ streamsize defOffset = sizeof (unsigned char ) + sizeof ( unsigned short ) + sizeof (unsigned int ) * 11 ;
190
217
MDFile.write ((char *)&def, defOffset);
191
218
192
219
// write virtual variable name to file
193
220
MDFile.write (def.name , def.nameLen );
221
+ vISA_ASSERT (MDFile.good (), " RA metadata file write stream error for Def" );
194
222
}
195
223
196
224
// write number of uses in this inst to file
@@ -199,15 +227,18 @@ void MetadataDumpRA::emitMetadataFile() {
199
227
200
228
for (Use use : iMD.instUses ) {
201
229
230
+ // uchar (1) : regFileKind
202
231
// ushort (1) : typeSize
203
- // uint (8 ) : leftBound, rightBound, reg, subreg, hstride, vstride, width, nameLen
204
- streamsize useOffset = sizeof (unsigned short ) + sizeof (unsigned int ) * 8 ;
232
+ // uint (12 ) : reg, subreg, byteSize, aliasOffset, row/colOffset, h/ vstride, width, root/l/rBound , nameLen
233
+ streamsize useOffset = sizeof (unsigned char ) + sizeof ( unsigned short ) + sizeof (unsigned int ) * 13 ;
205
234
MDFile.write ((char *)&use, useOffset);
206
235
207
236
// write virtual variable name to file
208
237
MDFile.write (use.name , use.nameLen );
209
-
238
+ vISA_ASSERT (MDFile. good (), " RA metadata file write stream error for Use " );
210
239
}
240
+
241
+ MDFile.flush ();
211
242
}
212
243
}
213
244
MDFile.close ();
@@ -221,10 +252,10 @@ void MetadataReader::printName(const char* name, unsigned int nameLen) {
221
252
}
222
253
223
254
// Reads a metadata file from the dump directory
224
- void MetadataReader::readMetadata () {
255
+ void MetadataReader::readMetadata (std::string fileName ) {
225
256
ifstream MDFile;
226
257
227
- MDFile.open (" RA_METADATA_DUMP " , ios::in );
258
+ MDFile.open (fileName , ios::binary );
228
259
229
260
unsigned int numKernels;
230
261
MDFile.read ((char *)&numKernels, sizeof (unsigned int ));
@@ -252,20 +283,25 @@ void MetadataReader::readMetadata() {
252
283
253
284
for (unsigned int d = 0 ; d < numDefs; d++) {
254
285
Def def;
286
+
287
+ // uchar (1) : regFileKind
255
288
// ushort (1) : typeSize
256
- // uint (6) : leftBound, rightBound, reg, subreg, hstride, nameLen
257
- streamsize defOffset = sizeof (unsigned short ) + sizeof (unsigned int ) * 6 ;
289
+ // uint (10) : reg, subreg, byteSize, aliasOffset, row/colOffset, hstride, root/l/rBound, nameLen
290
+ streamsize defOffset = sizeof (unsigned char ) + sizeof (unsigned short ) + sizeof (unsigned int ) * 11 ;
291
+
258
292
MDFile.read ((char *)&def, defOffset);
259
293
260
- char * name = new char [def. nameLen ];
294
+ char name[MAX_NAMELEN ];
261
295
MDFile.read (name, def.nameLen );
262
296
def.name = name;
263
297
298
+ vISA_ASSERT (MDFile.good (), " RA metadata file read stream error for Def" );
299
+
264
300
printf (" | " );
265
301
this ->printName (def.name , def.nameLen );
266
302
printf (" \t\t |" );
267
303
printf (" %5u -> %-5u| " , def.leftBound , def.rightBound );
268
- printf (" r%-5u.%-5u<%-5u%-5s%-5s >:%-5u" , def.reg , def.subreg , def.hstride , " " , " " , def.typeSize );
304
+ printf (" r%-5u.%-5u(%-5u,%-5u) <%-5u%-5s%-5s >:%-5u_%-5u_%- 5u" , def.reg , def.subreg , def.rowOffset , def. colOffset , def. hstride , " " , " " , def.typeSize , def. byteSize , ( unsigned int )def. regFileKind );
269
305
printf (" \n " );
270
306
}
271
307
@@ -274,20 +310,25 @@ void MetadataReader::readMetadata() {
274
310
275
311
for (unsigned int u = 0 ; u < numUses; u++) {
276
312
Use use;
313
+
314
+ // uchar (1) : regFileKind
277
315
// ushort (1) : typeSize
278
- // uint (8) : leftBound, rightBound, reg, subreg, hstride, vstride, width, nameLen
279
- streamsize useOffset = sizeof (unsigned short ) + sizeof (unsigned int ) * 8 ;
316
+ // uint (12) : reg, subreg, byteSize, aliasOffset, row/colOffset, h/vstride, width, root/l/rBound, nameLen
317
+ streamsize useOffset = sizeof (unsigned char ) + sizeof (unsigned short ) + sizeof (unsigned int ) * 13 ;
318
+
280
319
MDFile.read ((char *)&use, useOffset);
281
320
282
- char * name = new char [use. nameLen ];
321
+ char name[MAX_NAMELEN ];
283
322
MDFile.read (name, use.nameLen );
284
323
use.name = name;
285
324
325
+ vISA_ASSERT (MDFile.good (), " RA metadata file read stream error for Use" );
326
+
286
327
printf (" | " );
287
328
this ->printName (use.name , use.nameLen );
288
329
printf (" \t\t |" );
289
330
printf (" %5u -> %-5u| " , use.leftBound , use.rightBound );
290
- printf (" r%-5u.%-5u<%-5u;%-5u,%-5u>:%-5u" , use.reg , use.subreg , use.vstride , use.width , use.hstride , use.typeSize );
331
+ printf (" r%-5u.%-5u(%-5u,%-5u) <%-5u;%-5u,%-5u>:%-5u_%-5u_%- 5u" , use.reg , use.subreg , use.rowOffset , use. colOffset , use. vstride , use.width , use.hstride , use.typeSize , use. byteSize , ( unsigned int )use. regFileKind );
291
332
printf (" \n " );
292
333
}
293
334
}
0 commit comments