Skip to content

Commit b59a5f1

Browse files
Source Level Debugger - adding notifications
- notifySourceCode, notifyKernelDebugData, notifyDeviceDestruction - added processDebugData method in Program - change options when SLD is active - add space at the beginning of extension list options Change-Id: Iac1e52f849544dbfda62407e112cde83fa94e3ad
1 parent cec056f commit b59a5f1

23 files changed

+547
-43
lines changed

runtime/device/device.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ Device::~Device() {
108108
commandStreamReceiver = nullptr;
109109
}
110110

111+
if (deviceInfo.sourceLevelDebuggerActive && sourceLevelDebugger) {
112+
sourceLevelDebugger->notifyDeviceDestruction();
113+
}
114+
111115
if (memoryManager) {
112116
if (preemptionAllocation) {
113117
memoryManager->freeGraphicsMemory(preemptionAllocation);

runtime/device/device.h

+1
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ class Device : public BaseObject<_cl_device_id> {
136136
std::string deviceExtensions;
137137
bool getEnabled64kbPages();
138138
bool isSourceLevelDebuggerActive() const;
139+
SourceLevelDebugger *getSourceLevelDebugger() { return sourceLevelDebugger.get(); }
139140

140141
protected:
141142
Device() = delete;

runtime/platform/extensions.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ std::string convertEnabledExtensionsToCompilerInternalOptions(const char *enable
8383
while ((pos = extensionsList.find(" ", pos)) != std::string::npos) {
8484
extensionsList.replace(pos, 1, ",+");
8585
}
86-
extensionsList = "-cl-ext=-all,+" + extensionsList;
86+
extensionsList = " -cl-ext=-all,+" + extensionsList;
8787
return extensionsList;
8888
}
8989

runtime/program/build.cpp

+23-2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "runtime/compiler_interface/compiler_options.h"
2525
#include "runtime/os_interface/debug_settings_manager.h"
2626
#include "runtime/platform/platform.h"
27+
#include "runtime/source_level_debugger/source_level_debugger.h"
2728
#include "runtime/helpers/validators.h"
2829
#include "program.h"
2930
#include <cstring>
@@ -91,13 +92,24 @@ cl_int Program::build(
9192
break;
9293
}
9394

94-
internalOptions.append(platform()->peekCompilerExtensions());
95-
9695
if (isKernelDebugEnabled()) {
9796
internalOptions.append(CompilerOptions::debugKernelEnable);
9897
options.append(" -g ");
98+
if (pDevice->getSourceLevelDebugger()) {
99+
if (pDevice->getSourceLevelDebugger()->isOptimizationDisabled()) {
100+
options.append("-cl-opt-disable ");
101+
}
102+
std::string filename;
103+
pDevice->getSourceLevelDebugger()->notifySourceCode(sourceCode.c_str(), sourceCode.size(), filename);
104+
if (!filename.empty()) {
105+
// Add "-s" flag first so it will be ignored by clang in case the options already have this flag set.
106+
options = std::string("-s ") + filename + " " + options;
107+
}
108+
}
99109
}
100110

111+
internalOptions.append(platform()->peekCompilerExtensions());
112+
101113
inputArgs.pInput = (char *)(sourceCode.c_str());
102114
inputArgs.InputSize = (uint32_t)sourceCode.size();
103115
inputArgs.pOptions = options.c_str();
@@ -122,6 +134,15 @@ cl_int Program::build(
122134
break;
123135
}
124136

137+
if (isKernelDebugEnabled()) {
138+
processDebugData();
139+
if (pDevice->getSourceLevelDebugger()) {
140+
for (size_t i = 0; i < kernelInfoArray.size(); i++) {
141+
pDevice->getSourceLevelDebugger()->notifyKernelDebugData(kernelInfoArray[i]);
142+
}
143+
}
144+
}
145+
125146
separateBlockKernels();
126147
} while (false);
127148

runtime/program/compile.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "runtime/compiler_interface/compiler_interface.h"
2525
#include "runtime/compiler_interface/compiler_options.h"
2626
#include "runtime/platform/platform.h"
27+
#include "runtime/source_level_debugger/source_level_debugger.h"
2728
#include "runtime/helpers/validators.h"
2829
#include "program.h"
2930
#include <cstring>
@@ -155,6 +156,16 @@ cl_int Program::compile(
155156
if (isKernelDebugEnabled()) {
156157
internalOptions.append(CompilerOptions::debugKernelEnable);
157158
options.append(" -g ");
159+
if (pDevice->getSourceLevelDebugger()) {
160+
if (pDevice->getSourceLevelDebugger()->isOptimizationDisabled()) {
161+
options.append("-cl-opt-disable ");
162+
}
163+
std::string filename;
164+
pDevice->getSourceLevelDebugger()->notifySourceCode(sourceCode.c_str(), sourceCode.size(), filename);
165+
if (!filename.empty()) {
166+
options = std::string("-s ") + filename + " " + options;
167+
}
168+
}
158169
}
159170

160171
inputArgs.pInput = pCompileData;

runtime/program/link.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "runtime/compiler_interface/compiler_interface.h"
2424
#include "runtime/platform/platform.h"
2525
#include "runtime/helpers/validators.h"
26+
#include "runtime/source_level_debugger/source_level_debugger.h"
2627
#include "program.h"
2728
#include "elf/writer.h"
2829
#include <cstring>
@@ -147,6 +148,13 @@ cl_int Program::link(
147148
break;
148149
}
149150
programBinaryType = CL_PROGRAM_BINARY_TYPE_EXECUTABLE;
151+
152+
if (isKernelDebugEnabled()) {
153+
processDebugData();
154+
for (size_t i = 0; i < kernelInfoArray.size(); i++) {
155+
pDevice->getSourceLevelDebugger()->notifyKernelDebugData(kernelInfoArray[i]);
156+
}
157+
}
150158
} else {
151159
retVal = pCompilerInterface->createLibrary(*this, inputArgs);
152160
if (retVal != CL_SUCCESS) {

runtime/program/process_gen_binary.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "runtime/memory_manager/memory_manager.h"
2929
#include "patch_list.h"
3030
#include "patch_shared.h"
31+
#include "program_debug_data.h"
3132
#include "program.h"
3233
#include "runtime/kernel/kernel.h"
3334

@@ -992,4 +993,34 @@ bool Program::validateGenBinaryHeader(const iOpenCL::SProgramBinaryHeader *pGenB
992993
pGenBinaryHeader->Version == CURRENT_ICBE_VERSION &&
993994
validateGenBinaryDevice(static_cast<GFXCORE_FAMILY>(pGenBinaryHeader->Device));
994995
}
996+
997+
void Program::processDebugData() {
998+
if (debugData != nullptr) {
999+
SProgramDebugDataHeaderIGC *programDebugHeader = reinterpret_cast<SProgramDebugDataHeaderIGC *>(debugData);
1000+
1001+
DEBUG_BREAK_IF(programDebugHeader->NumberOfKernels != kernelInfoArray.size());
1002+
1003+
const SKernelDebugDataHeaderIGC *kernelDebugHeader = reinterpret_cast<SKernelDebugDataHeaderIGC *>(ptrOffset(programDebugHeader, sizeof(SProgramDebugDataHeaderIGC)));
1004+
const char *kernelName = nullptr;
1005+
const char *kernelDebugData = nullptr;
1006+
1007+
for (uint32_t i = 0; i < programDebugHeader->NumberOfKernels; i++) {
1008+
kernelName = reinterpret_cast<const char *>(ptrOffset(kernelDebugHeader, sizeof(SKernelDebugDataHeaderIGC)));
1009+
1010+
auto kernelInfo = kernelInfoArray[i];
1011+
UNRECOVERABLE_IF(kernelInfo->name.compare(0, kernelInfo->name.size(), kernelName) != 0);
1012+
1013+
kernelDebugData = ptrOffset(kernelName, kernelDebugHeader->KernelNameSize);
1014+
1015+
kernelInfo->debugData.vIsa = kernelDebugData;
1016+
kernelInfo->debugData.genIsa = ptrOffset(kernelDebugData, kernelDebugHeader->SizeVisaDbgInBytes);
1017+
kernelInfo->debugData.vIsaSize = kernelDebugHeader->SizeVisaDbgInBytes;
1018+
kernelInfo->debugData.genIsaSize = kernelDebugHeader->SizeGenIsaDbgInBytes;
1019+
1020+
kernelDebugData = ptrOffset(kernelDebugData, kernelDebugHeader->SizeVisaDbgInBytes + kernelDebugHeader->SizeGenIsaDbgInBytes);
1021+
kernelDebugHeader = reinterpret_cast<const SKernelDebugDataHeaderIGC *>(kernelDebugData);
1022+
}
1023+
}
1024+
}
1025+
9951026
} // namespace OCLRT

runtime/program/program.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ Program::Program(Context *context, bool isBuiltIn) : context(context), isBuiltIn
8787
if (DebugManager.flags.DisableStatelessToStatefulOptimization.get()) {
8888
internalOptions += "-cl-intel-greater-than-4GB-buffer-required ";
8989
}
90+
kernelDebugEnabled = pDevice->isSourceLevelDebuggerActive();
9091
}
9192

9293
if (DebugManager.flags.EnableStatelessToStatefulBufferOffsetOpt.get()) {

runtime/program/program.h

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ class Program : public BaseObject<_cl_program> {
188188
void storeLlvmBinary(const void *pSrc, const size_t srcSize);
189189

190190
void storeDebugData(const void *pSrc, const size_t srcSize);
191+
void processDebugData();
191192

192193
void updateBuildLog(const Device *pDevice, const char *pErrorString, const size_t errorStringSize);
193194

runtime/source_level_debugger/source_level_debugger.cpp

+41-9
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const char *SourceLevelDebugger::getDebuggerOptionSymbol = "getDebuggerOption";
3434
const char *SourceLevelDebugger::notifyKernelDebugDataSymbol = "notifyKernelDebugData";
3535
const char *SourceLevelDebugger::initSymbol = "init";
3636
const char *SourceLevelDebugger::isDebuggerActiveSymbol = "isDebuggerActive";
37+
const char *SourceLevelDebugger::notifyDeviceDestructionSymbol = "notifyDeviceDestruction";
3738

3839
class SourceLevelDebugger::SourceLevelDebuggerInterface {
3940
public:
@@ -46,13 +47,15 @@ class SourceLevelDebugger::SourceLevelDebuggerInterface {
4647
typedef int (*NotifyKernelDebugDataFunction)(GfxDbgKernelDebugData *data);
4748
typedef int (*InitFunction)(GfxDbgTargetCaps *data);
4849
typedef int (*IsDebuggerActiveFunction)(void);
50+
typedef int (*NotifyDeviceDestructionFunction)(GfxDbgDeviceDestructionData *data);
4951

5052
NotifyNewDeviceFunction notifyNewDeviceFunc = nullptr;
5153
NotifySourceCodeFunction notifySourceCodeFunc = nullptr;
5254
GetDebuggerOptionFunction getDebuggerOptionFunc = nullptr;
5355
NotifyKernelDebugDataFunction notifyKernelDebugDataFunc = nullptr;
5456
InitFunction initFunc = nullptr;
5557
IsDebuggerActiveFunction isDebuggerActive = nullptr;
58+
NotifyDeviceDestructionFunction notifyDeviceDestructionFunc = nullptr;
5659
};
5760

5861
SourceLevelDebugger *SourceLevelDebugger::create() {
@@ -88,6 +91,7 @@ SourceLevelDebugger::SourceLevelDebugger(OsLibrary *library) {
8891
UNRECOVERABLE_IF(sourceLevelDebuggerInterface->notifyKernelDebugDataFunc == nullptr);
8992
UNRECOVERABLE_IF(sourceLevelDebuggerInterface->notifyNewDeviceFunc == nullptr);
9093
UNRECOVERABLE_IF(sourceLevelDebuggerInterface->notifySourceCodeFunc == nullptr);
94+
UNRECOVERABLE_IF(sourceLevelDebuggerInterface->notifyDeviceDestructionFunc == nullptr);
9195
isActive = true;
9296
}
9397
}
@@ -111,31 +115,55 @@ void SourceLevelDebugger::getFunctions() {
111115
sourceLevelDebuggerInterface->notifyKernelDebugDataFunc = reinterpret_cast<SourceLevelDebuggerInterface::NotifyKernelDebugDataFunction>(debuggerLibrary->getProcAddress(notifyKernelDebugDataSymbol));
112116
sourceLevelDebuggerInterface->initFunc = reinterpret_cast<SourceLevelDebuggerInterface::InitFunction>(debuggerLibrary->getProcAddress(initSymbol));
113117
sourceLevelDebuggerInterface->isDebuggerActive = reinterpret_cast<SourceLevelDebuggerInterface::IsDebuggerActiveFunction>(debuggerLibrary->getProcAddress(isDebuggerActiveSymbol));
118+
sourceLevelDebuggerInterface->notifyDeviceDestructionFunc = reinterpret_cast<SourceLevelDebuggerInterface::NotifyDeviceDestructionFunction>(debuggerLibrary->getProcAddress(notifyDeviceDestructionSymbol));
114119
}
115120

116-
void SourceLevelDebugger::notifyNewDevice(uint32_t deviceHandle) const {
121+
bool SourceLevelDebugger::notifyNewDevice(uint32_t deviceHandle) {
117122
if (isActive) {
118123
GfxDbgNewDeviceData newDevice;
119124
newDevice.version = IGFXDBG_CURRENT_VERSION;
120125
newDevice.dh = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(deviceHandle));
121126
newDevice.udh = GfxDeviceHandle(0);
122-
sourceLevelDebuggerInterface->notifyNewDeviceFunc(&newDevice);
127+
int result = sourceLevelDebuggerInterface->notifyNewDeviceFunc(&newDevice);
128+
DEBUG_BREAK_IF(static_cast<IgfxdbgRetVal>(result) != IgfxdbgRetVal::IGFXDBG_SUCCESS);
129+
static_cast<void>(result);
130+
this->deviceHandle = deviceHandle;
123131
}
132+
return false;
133+
}
134+
135+
bool SourceLevelDebugger::notifyDeviceDestruction() {
136+
if (isActive) {
137+
GfxDbgDeviceDestructionData deviceDestruction;
138+
deviceDestruction.version = IGFXDBG_CURRENT_VERSION;
139+
deviceDestruction.dh = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(this->deviceHandle));
140+
int result = sourceLevelDebuggerInterface->notifyDeviceDestructionFunc(&deviceDestruction);
141+
DEBUG_BREAK_IF(static_cast<IgfxdbgRetVal>(result) != IgfxdbgRetVal::IGFXDBG_SUCCESS);
142+
static_cast<void>(result);
143+
this->deviceHandle = 0;
144+
return true;
145+
}
146+
return false;
124147
}
125-
void SourceLevelDebugger::notifySourceCode(uint32_t deviceHandle, const char *source, size_t sourceSize) const {
148+
149+
bool SourceLevelDebugger::notifySourceCode(const char *source, size_t sourceSize, std::string &file) const {
126150
if (isActive) {
127151
GfxDbgSourceCode sourceCode;
128152
char fileName[FILENAME_MAX] = "";
129153

130154
sourceCode.version = IGFXDBG_CURRENT_VERSION;
131-
sourceCode.hDevice = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(deviceHandle));
155+
sourceCode.hDevice = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(this->deviceHandle));
132156
sourceCode.sourceCode = source;
133157
sourceCode.sourceCodeSize = static_cast<unsigned int>(sourceSize);
134158
sourceCode.sourceName = &fileName[0];
135159
sourceCode.sourceNameMaxLen = sizeof(fileName);
136160

137-
sourceLevelDebuggerInterface->notifySourceCodeFunc(&sourceCode);
161+
int result = sourceLevelDebuggerInterface->notifySourceCodeFunc(&sourceCode);
162+
DEBUG_BREAK_IF(static_cast<IgfxdbgRetVal>(result) != IgfxdbgRetVal::IGFXDBG_SUCCESS);
163+
static_cast<void>(result);
164+
file = fileName;
138165
}
166+
return false;
139167
}
140168

141169
bool SourceLevelDebugger::isOptimizationDisabled() const {
@@ -157,10 +185,10 @@ bool SourceLevelDebugger::isOptimizationDisabled() const {
157185
return false;
158186
}
159187

160-
void SourceLevelDebugger::notifyKernelDebugData(uint32_t deviceHandle, const KernelInfo *kernelInfo) const {
188+
bool SourceLevelDebugger::notifyKernelDebugData(const KernelInfo *kernelInfo) const {
161189
if (isActive) {
162190
GfxDbgKernelDebugData kernelDebugData;
163-
kernelDebugData.hDevice = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(deviceHandle));
191+
kernelDebugData.hDevice = reinterpret_cast<GfxDeviceHandle>(static_cast<uint64_t>(this->deviceHandle));
164192
kernelDebugData.version = IGFXDBG_CURRENT_VERSION;
165193
kernelDebugData.hProgram = reinterpret_cast<GenRtProgramHandle>(0);
166194

@@ -173,17 +201,21 @@ void SourceLevelDebugger::notifyKernelDebugData(uint32_t deviceHandle, const Ker
173201
kernelDebugData.dbgGenIsaBuffer = kernelInfo->debugData.genIsa;
174202
kernelDebugData.dbgGenIsaSize = kernelInfo->debugData.genIsaSize;
175203

176-
sourceLevelDebuggerInterface->notifyKernelDebugDataFunc(&kernelDebugData);
204+
int result = sourceLevelDebuggerInterface->notifyKernelDebugDataFunc(&kernelDebugData);
205+
DEBUG_BREAK_IF(static_cast<IgfxdbgRetVal>(result) != IgfxdbgRetVal::IGFXDBG_SUCCESS);
206+
static_cast<void>(result);
177207
}
208+
return false;
178209
}
179210

180-
void SourceLevelDebugger::initialize(bool useLocalMemory) {
211+
bool SourceLevelDebugger::initialize(bool useLocalMemory) {
181212
if (isActive) {
182213
GfxDbgTargetCaps caps = {IGFXDBG_CURRENT_VERSION, useLocalMemory};
183214
int result = sourceLevelDebuggerInterface->initFunc(&caps);
184215
if (static_cast<IgfxdbgRetVal>(result) != IgfxdbgRetVal::IGFXDBG_SUCCESS) {
185216
isActive = false;
186217
}
187218
}
219+
return false;
188220
}
189221
} // namespace OCLRT

runtime/source_level_debugger/source_level_debugger.h

+11-7
Original file line numberDiff line numberDiff line change
@@ -23,24 +23,26 @@
2323
#pragma once
2424
#include "runtime/os_interface/os_library.h"
2525
#include <memory>
26+
#include <string>
2627

2728
namespace OCLRT {
2829
struct KernelInfo;
2930

3031
class SourceLevelDebugger {
3132
public:
3233
SourceLevelDebugger(OsLibrary *library);
33-
~SourceLevelDebugger();
34+
virtual ~SourceLevelDebugger();
3435
SourceLevelDebugger(const SourceLevelDebugger &ref) = delete;
3536
SourceLevelDebugger &operator=(const SourceLevelDebugger &) = delete;
3637
static SourceLevelDebugger *create();
3738

38-
bool isDebuggerActive();
39-
void notifyNewDevice(uint32_t deviceHandle) const;
40-
void notifySourceCode(uint32_t deviceHandle, const char *sourceCode, size_t size) const;
41-
bool isOptimizationDisabled() const;
42-
void notifyKernelDebugData(uint32_t deviceHandle, const KernelInfo *kernelInfo) const;
43-
void initialize(bool useLocalMemory);
39+
MOCKABLE_VIRTUAL bool isDebuggerActive();
40+
MOCKABLE_VIRTUAL bool notifyNewDevice(uint32_t deviceHandle);
41+
MOCKABLE_VIRTUAL bool notifyDeviceDestruction();
42+
MOCKABLE_VIRTUAL bool notifySourceCode(const char *sourceCode, size_t size, std::string &filename) const;
43+
MOCKABLE_VIRTUAL bool isOptimizationDisabled() const;
44+
MOCKABLE_VIRTUAL bool notifyKernelDebugData(const KernelInfo *kernelInfo) const;
45+
MOCKABLE_VIRTUAL bool initialize(bool useLocalMemory);
4446

4547
protected:
4648
class SourceLevelDebuggerInterface;
@@ -51,13 +53,15 @@ class SourceLevelDebugger {
5153

5254
std::unique_ptr<OsLibrary> debuggerLibrary;
5355
bool isActive = false;
56+
uint32_t deviceHandle = 0;
5457

5558
static const char *notifyNewDeviceSymbol;
5659
static const char *notifySourceCodeSymbol;
5760
static const char *getDebuggerOptionSymbol;
5861
static const char *notifyKernelDebugDataSymbol;
5962
static const char *initSymbol;
6063
static const char *isDebuggerActiveSymbol;
64+
static const char *notifyDeviceDestructionSymbol;
6165
// OS specific library name
6266
static const char *dllName;
6367
};

runtime/source_level_debugger/source_level_debugger_stubs.cpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,28 @@ bool SourceLevelDebugger::isDebuggerActive() {
3939
return false;
4040
}
4141

42-
void SourceLevelDebugger::notifyNewDevice(uint32_t deviceHandle) const {
42+
bool SourceLevelDebugger::notifyNewDevice(uint32_t deviceHandle) {
43+
return false;
44+
}
45+
46+
bool SourceLevelDebugger::notifyDeviceDestruction() {
47+
return false;
4348
}
44-
void SourceLevelDebugger::notifySourceCode(uint32_t deviceHandle, const char *sourceCode, size_t size) const {
49+
50+
bool SourceLevelDebugger::notifySourceCode(const char *sourceCode, size_t size, std::string &filename) const {
51+
return false;
4552
}
53+
4654
bool SourceLevelDebugger::isOptimizationDisabled() const {
4755
return false;
4856
}
49-
void SourceLevelDebugger::notifyKernelDebugData(uint32_t deviceHandle, const KernelInfo *kernelInfo) const {
57+
58+
bool SourceLevelDebugger::notifyKernelDebugData(const KernelInfo *kernelInfo) const {
59+
return false;
5060
}
51-
void SourceLevelDebugger::initialize(bool useLocalMemory) {
61+
62+
bool SourceLevelDebugger::initialize(bool useLocalMemory) {
63+
return false;
5264
}
5365

5466
} // namespace OCLRT

0 commit comments

Comments
 (0)