Skip to content

Commit 5e7e7f7

Browse files
pratikasharigcbot
authored andcommitted
Remove unnecessary legacy code that was creating lot of strings in
dwarf.
1 parent 51a1410 commit 5e7e7f7

File tree

6 files changed

+187
-51
lines changed

6 files changed

+187
-51
lines changed

IGC/AdaptorOCL/OCL/sp/sp_g8.cpp

Lines changed: 54 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -420,56 +420,96 @@ void CGen8OpenCLStateProcessor::CreateProgramScopePatchStream(const IGC::SOpenCL
420420
}
421421

422422
void CGen8OpenCLStateProcessor::CreateKernelDebugData(
423-
const char* rawDebugDataVISA,
423+
const char* rawDebugDataVISA,
424424
unsigned int rawDebugDataVISASize,
425-
const char* rawDebugDataGenISA,
425+
const char* rawDebugDataGenISA,
426426
unsigned int rawDebugDataGenISASize,
427427
const std::string& kernelName,
428428
Util::BinaryStream& kernelDebugData)
429429
{
430+
// Used by VC
430431
RETVAL retValue = g_cInitRetValue;
431432

432433
Util::BinaryStream kernelVisaDbg;
433434
Util::BinaryStream kernelGenIsaDbg;
434435

435436
// Source -> VISA debug info
436-
if( kernelVisaDbg.Write( rawDebugDataVISA, rawDebugDataVISASize ) == false )
437+
if (kernelVisaDbg.Write(rawDebugDataVISA, rawDebugDataVISASize) == false)
437438
{
438439
IGC_ASSERT(0);
439440
retValue.Success = false;
440441
}
441-
kernelVisaDbg.Align( sizeof( DWORD ) );
442+
kernelVisaDbg.Align(sizeof(DWORD));
442443

443444
// VISA -> Gen ISA debug info
444-
if( kernelGenIsaDbg.Write( rawDebugDataGenISA, rawDebugDataGenISASize ) == false )
445+
if (kernelGenIsaDbg.Write(rawDebugDataGenISA, rawDebugDataGenISASize) == false)
445446
{
446447
IGC_ASSERT(0);
447448
retValue.Success = false;
448449
}
449-
kernelGenIsaDbg.Align( sizeof( DWORD ) );
450+
kernelGenIsaDbg.Align(sizeof(DWORD));
450451

451-
if( retValue.Success )
452+
if (retValue.Success)
452453
{
453454
iOpenCL::SKernelDebugDataHeaderIGC header;
454455

455456

456-
memset( &header, 0, sizeof( header ) );
457+
memset(&header, 0, sizeof(header));
457458

458459
header.KernelNameSize = (uint32_t)kernelName.size() + 1;
459-
header.KernelNameSize += GetAlignmentOffset( header.KernelNameSize, sizeof(DWORD) );
460+
header.KernelNameSize += GetAlignmentOffset(header.KernelNameSize, sizeof(DWORD));
460461
header.SizeVisaDbgInBytes = (uint32_t)kernelVisaDbg.Size();
461462
header.SizeGenIsaDbgInBytes = (uint32_t)kernelGenIsaDbg.Size();
462463

463-
kernelDebugData.Write( header );
464-
kernelDebugData.Write( kernelName.c_str(), kernelName.size() + 1 );
465-
kernelDebugData.Align( sizeof (DWORD ) );
466-
kernelDebugData.Write( kernelVisaDbg );
467-
kernelDebugData.Write( kernelGenIsaDbg );
464+
kernelDebugData.Write(header);
465+
kernelDebugData.Write(kernelName.c_str(), kernelName.size() + 1);
466+
kernelDebugData.Align(sizeof(DWORD));
467+
kernelDebugData.Write(kernelVisaDbg);
468+
kernelDebugData.Write(kernelGenIsaDbg);
468469

469470
IGC_ASSERT(IsAligned(kernelDebugData.Size(), sizeof(DWORD)));
470471
}
471472
}
472473

474+
void CGen8OpenCLStateProcessor::CreateKernelDebugData(
475+
const char* rawDebugDataVISA,
476+
unsigned int rawDebugDataVISASize,
477+
const char* rawDebugDataGenISA,
478+
unsigned int rawDebugDataGenISASize,
479+
const std::string& kernelName,
480+
KernelData::DbgInfoBuffer& kernelDebugDataHeader)
481+
{
482+
RETVAL retValue = g_cInitRetValue;
483+
484+
if (rawDebugDataVISA)
485+
{
486+
kernelDebugDataHeader.dbgInfoBuffer = (uint8_t*)rawDebugDataVISA;
487+
kernelDebugDataHeader.dbgInfoBufferSize = rawDebugDataVISASize;
488+
kernelDebugDataHeader.extraAlignBytes = (sizeof(DWORD) - rawDebugDataVISASize % sizeof(DWORD)) % sizeof(DWORD);
489+
rawDebugDataVISASize += kernelDebugDataHeader.extraAlignBytes;
490+
}
491+
492+
if (retValue.Success)
493+
{
494+
iOpenCL::SKernelDebugDataHeaderIGC header;
495+
496+
memset(&header, 0, sizeof(header));
497+
498+
header.KernelNameSize = (uint32_t)kernelName.size() + 1;
499+
header.KernelNameSize += GetAlignmentOffset(header.KernelNameSize, sizeof(DWORD));
500+
header.SizeVisaDbgInBytes = (uint32_t)rawDebugDataVISASize;
501+
header.SizeGenIsaDbgInBytes = (uint32_t)rawDebugDataGenISASize;
502+
IGC_ASSERT(rawDebugDataGenISASize == 0);
503+
504+
kernelDebugDataHeader.header->Write(header);
505+
kernelDebugDataHeader.header->Write(kernelName.c_str(), kernelName.size() + 1);
506+
kernelDebugDataHeader.header->Align(sizeof(DWORD));
507+
508+
IGC_ASSERT(IsAligned(kernelDebugDataHeader.header->Size(), sizeof(DWORD)));
509+
IGC_ASSERT(rawDebugDataVISASize % sizeof(DWORD) == 0);
510+
}
511+
}
512+
473513
const G6HWC::SMediaHardwareCapabilities& CGen8OpenCLStateProcessor::HWCaps() const
474514
{
475515
return m_HWCaps;

IGC/AdaptorOCL/OCL/sp/sp_g8.h

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,29 @@ namespace iOpenCL
6060
// Forward Declare
6161
struct SStateProcessorContextGen8_0;
6262

63+
64+
class KernelData
65+
{
66+
public:
67+
class DbgInfoBuffer
68+
{
69+
public:
70+
Util::BinaryStream* header = nullptr;
71+
uint8_t* dbgInfoBuffer = nullptr;
72+
uint32_t dbgInfoBufferSize = 0;
73+
uint8_t extraAlignBytes = 0;
74+
};
75+
76+
Util::BinaryStream* kernelBinary = nullptr;
77+
// DbgInfo is stored in pieces as header, dbg buffer, alignment padding
78+
// instead of storing it in a single BinaryStream. This is because
79+
// BinaryStream approach requires unnecessary copies.
80+
DbgInfoBuffer dbgInfo;
81+
82+
// kernelDebugData instance below is used only for VC
83+
Util::BinaryStream* kernelDebugData = nullptr;
84+
};
85+
6386
struct RETVAL
6487
{
6588
DWORD Success;
@@ -110,13 +133,21 @@ class CGen8OpenCLStateProcessor : DisallowCopy
110133
void CreateProgramScopePatchStream(const IGC::SOpenCLProgramInfo& annotations,
111134
Util::BinaryStream& membuf);
112135

136+
virtual void CreateKernelDebugData(
137+
const char* rawDebugDataVISA,
138+
unsigned int rawDebugDataVISASize,
139+
const char* rawDebugDataGenISA,
140+
unsigned int rawDebugDataGenISASize,
141+
const std::string& kernelName,
142+
Util::BinaryStream& kernelDebugData);
143+
113144
virtual void CreateKernelDebugData(
114145
const char* rawDebugDataVISA,
115146
unsigned int rawDebugDataVISASize,
116147
const char* rawDebugDataGenISA,
117148
unsigned int rawDebugDataGenISASize,
118149
const std::string& kernelName,
119-
Util::BinaryStream& kernelDebugData);
150+
KernelData::DbgInfoBuffer& kernelDebugData);
120151

121152
const IProgramContext& m_Context;
122153
std::string m_oclStateDebugMessagePrintOut;

IGC/AdaptorOCL/OCL/sp/spp_g8.cpp

Lines changed: 94 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,11 @@ CGen8OpenCLProgramBase::CGen8OpenCLProgramBase(PLATFORM platform,
6767
CGen8OpenCLProgramBase::~CGen8OpenCLProgramBase()
6868
{
6969
delete m_ProgramScopePatchStream;
70-
for (auto data : m_KernelBinaries)
70+
for (auto& data : m_KernelBinaries)
7171
{
7272
delete data.kernelBinary;
7373
delete data.kernelDebugData;
74+
delete data.dbgInfo.header;
7475
}
7576

7677
if (m_pSystemThreadKernelOutput)
@@ -106,7 +107,7 @@ RETVAL CGen8OpenCLProgramBase::GetProgramBinary(
106107

107108
programBinary.Write( *m_ProgramScopePatchStream );
108109

109-
for( auto data : m_KernelBinaries )
110+
for( auto& data : m_KernelBinaries )
110111
{
111112
programBinary.Write( *(data.kernelBinary) );
112113
}
@@ -137,6 +138,7 @@ CGen8OpenCLProgram::~CGen8OpenCLProgram()
137138

138139
RETVAL CGen8OpenCLProgramBase::GetProgramDebugData(Util::BinaryStream& programDebugData)
139140
{
141+
// Used by VC only
140142
RETVAL retValue = g_cInitRetValue;
141143

142144
unsigned numDebugBinaries = 0;
@@ -148,25 +150,109 @@ RETVAL CGen8OpenCLProgramBase::GetProgramDebugData(Util::BinaryStream& programDe
148150
}
149151
}
150152

151-
if( numDebugBinaries )
153+
if (numDebugBinaries)
152154
{
153155
iOpenCL::SProgramDebugDataHeaderIGC header;
154156

155-
memset( &header, 0, sizeof( header ) );
157+
memset(&header, 0, sizeof(header));
156158

157159
header.Magic = iOpenCL::MAGIC_CL;
158160
header.Version = iOpenCL::CURRENT_ICBE_VERSION;
159161
header.Device = m_Platform.eRenderCoreFamily;
160162
header.NumberOfKernels = numDebugBinaries;
161163
header.SteppingId = m_Platform.usRevId;
162164

163-
programDebugData.Write( header );
165+
programDebugData.Write(header);
164166

165167
for (auto data : m_KernelBinaries)
166168
{
167169
if (data.kernelDebugData && data.kernelDebugData->Size() > 0)
168170
{
169-
programDebugData.Write( *(data.kernelDebugData) );
171+
programDebugData.Write(*(data.kernelDebugData));
172+
}
173+
}
174+
}
175+
176+
return retValue;
177+
}
178+
179+
RETVAL CGen8OpenCLProgramBase::GetProgramDebugDataSize(size_t& totalDbgInfoBufferSize)
180+
{
181+
RETVAL retValue = g_cInitRetValue;
182+
183+
unsigned numDebugBinaries = 0;
184+
for (auto& data : m_KernelBinaries)
185+
{
186+
if (data.dbgInfo.header &&
187+
data.dbgInfo.header->Size() > 0 &&
188+
data.dbgInfo.dbgInfoBufferSize > 0)
189+
{
190+
numDebugBinaries++;
191+
}
192+
}
193+
194+
totalDbgInfoBufferSize = 0;
195+
if (numDebugBinaries)
196+
{
197+
totalDbgInfoBufferSize += sizeof(iOpenCL::SProgramDebugDataHeaderIGC);
198+
for (auto& data : m_KernelBinaries)
199+
{
200+
totalDbgInfoBufferSize += (size_t)data.dbgInfo.header->Size() +
201+
(size_t)(data.dbgInfo.dbgInfoBufferSize +
202+
data.dbgInfo.extraAlignBytes);
203+
}
204+
}
205+
206+
return retValue;
207+
}
208+
209+
RETVAL CGen8OpenCLProgramBase::GetProgramDebugData(char* dstBuffer, size_t dstBufferSize)
210+
{
211+
RETVAL retValue = g_cInitRetValue;
212+
size_t offset = 0;
213+
214+
auto Append = [&offset, dstBuffer, dstBufferSize](void* src, size_t srcSize)
215+
{
216+
memcpy_s(dstBuffer + offset, dstBufferSize - offset, src, srcSize);
217+
offset += srcSize;
218+
};
219+
220+
unsigned numDebugBinaries = 0;
221+
for (auto& data : m_KernelBinaries)
222+
{
223+
if (data.dbgInfo.header &&
224+
data.dbgInfo.header->Size() > 0 &&
225+
data.dbgInfo.dbgInfoBufferSize > 0)
226+
{
227+
numDebugBinaries++;
228+
}
229+
}
230+
231+
if( numDebugBinaries )
232+
{
233+
iOpenCL::SProgramDebugDataHeaderIGC header;
234+
235+
memset( &header, 0, sizeof( header ) );
236+
237+
header.Magic = iOpenCL::MAGIC_CL;
238+
header.Version = iOpenCL::CURRENT_ICBE_VERSION;
239+
header.Device = m_Platform.eRenderCoreFamily;
240+
header.NumberOfKernels = numDebugBinaries;
241+
header.SteppingId = m_Platform.usRevId;
242+
243+
Append(&header, sizeof(header));
244+
245+
const uint64_t zero = 0;
246+
for (auto& data : m_KernelBinaries)
247+
{
248+
if (data.dbgInfo.header &&
249+
data.dbgInfo.header->Size() > 0 &&
250+
data.dbgInfo.dbgInfoBufferSize > 0)
251+
{
252+
Append((void*)data.dbgInfo.header->GetLinearPointer(), (size_t)data.dbgInfo.header->Size());
253+
Append(data.dbgInfo.dbgInfoBuffer, data.dbgInfo.dbgInfoBufferSize);
254+
IGC_ASSERT(data.dbgInfo.extraAlignBytes <= sizeof(zero));
255+
Append((void*)&zero, data.dbgInfo.extraAlignBytes);
170256
}
171257
}
172258
}
@@ -390,15 +476,15 @@ void CGen8OpenCLProgram::CreateKernelBinaries()
390476
// Create the debug data binary streams
391477
if (pOutput->m_debugDataVISASize > 0 || pOutput->m_debugDataGenISASize > 0)
392478
{
393-
data.kernelDebugData = new Util::BinaryStream();
479+
data.dbgInfo.header = new Util::BinaryStream();
394480

395481
m_StateProcessor.CreateKernelDebugData(
396482
(const char*)pOutput->m_debugDataVISA,
397483
pOutput->m_debugDataVISASize,
398484
(const char*)pOutput->m_debugDataGenISA,
399485
pOutput->m_debugDataGenISASize,
400486
kernel->m_kernelInfo.m_kernelName,
401-
*(data.kernelDebugData));
487+
data.dbgInfo);
402488
}
403489

404490
m_KernelBinaries.push_back(data);

IGC/AdaptorOCL/OCL/sp/spp_g8.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ namespace IGC
4545
namespace iOpenCL
4646
{
4747

48-
struct KernelData
49-
{
50-
Util::BinaryStream* kernelBinary = nullptr;
51-
Util::BinaryStream* kernelDebugData = nullptr;
52-
};
53-
5448
// This is the base class to create an OpenCL ELF binary with patch tokens.
5549
// It owns BinaryStreams allocated.
5650
class CGen8OpenCLProgramBase : DisallowCopy {
@@ -66,8 +60,12 @@ class CGen8OpenCLProgramBase : DisallowCopy {
6660
/// CGen8OpenCLProgram::CreateKernelBinaries or CGen8CMProgram::CreateKernelBinaries
6761
RETVAL GetProgramBinary(Util::BinaryStream& programBinary,
6862
unsigned pointerSizeInBytes);
63+
/// GetProgramDebugDataSize - get size of debug info patch token
64+
RETVAL GetProgramDebugDataSize(size_t& totalDbgInfoBufferSize);
6965
/// GetProgramDebugData - get debug data binary for legacy (Patch token based)
7066
/// binary format
67+
RETVAL GetProgramDebugData(char* dstBuffer, size_t dstBufferSize);
68+
/// GetProgramDebugData - get program debug data API used by VC.
7169
RETVAL GetProgramDebugData(Util::BinaryStream& programDebugData);
7270
/// CreateProgramScopePatchStream - get program scope patch token for legacy
7371
/// (Patch token based) binary format

IGC/AdaptorOCL/dllInterfaceCompute.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,14 +1262,12 @@ bool TranslateBuild(
12621262
pOutputArgs->pOutput = binaryOutput;
12631263

12641264
// Prepare and set program debug data
1265-
Util::BinaryStream programDebugData;
1266-
oclContext.m_programOutput.GetProgramDebugData(programDebugData);
1267-
1268-
int debugDataSize = int_cast<int>(programDebugData.Size());
1265+
size_t debugDataSize = 0;
1266+
oclContext.m_programOutput.GetProgramDebugDataSize(debugDataSize);
12691267
if (debugDataSize > 0)
12701268
{
12711269
char* debugDataOutput = new char[debugDataSize];
1272-
memcpy_s(debugDataOutput, debugDataSize, programDebugData.GetLinearPointer(), debugDataSize);
1270+
oclContext.m_programOutput.GetProgramDebugData(debugDataOutput, debugDataSize);
12731271

12741272
pOutputArgs->DebugDataSize = debugDataSize;
12751273
pOutputArgs->pDebugData = debugDataOutput;

IGC/DebugInfo/DwarfCompileUnit.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2428,23 +2428,6 @@ void CompileUnit::buildLocation(const llvm::Instruction* pDbgInst, DbgVariable&
24282428

24292429
DV.setDIE(VariableDie);
24302430
}
2431-
2432-
if (addDecoration)
2433-
{
2434-
if (FirstLoc.IsVectorized())
2435-
{
2436-
// Add description stating whether variable was vectorized in VISA
2437-
addString(VariableDie, dwarf::DW_AT_description, "vectorized");
2438-
uint16_t simdSize = VISAModule->GetSIMDSize();
2439-
addString(VariableDie, dwarf::DW_AT_description,
2440-
simdSize == 8 ? "simd8" : simdSize == 16 ? "simd16" : simdSize == 32 ? "simd32" : "???");
2441-
}
2442-
2443-
if (FirstLoc.IsInGlobalAddrSpace())
2444-
{
2445-
addString(VariableDie, dwarf::DW_AT_description, "global");
2446-
}
2447-
}
24482431
}
24492432

24502433
IGC::DIEBlock* CompileUnit::buildPointer(DbgVariable& var, const VISAVariableLocation* loc)

0 commit comments

Comments
 (0)