Skip to content

Commit fd05986

Browse files
fda0igcbot
authored andcommitted
Merge FCL and IGC flag parsing and dump path logic
- Remove ~300 lines of duplicated flag/registry code from clang_tb.cpp - Add igc_dump_paths.cpp/hpp with shared dump path logic - Add ExtractIGCOptsFromOptions() to igc_regkeys.cpp for reusable -igc_opts parsing - Update CMakeLists for common, OCLFE, and UniversalAdapter - Add ocloc lit test for shader dumps via env vars and -igc_opts FCL previously had its own registry/env reading and per-flag accessors duplicating igc_regkeys logic. It now calls LoadRegistryKeys() and uses IGC_IS_FLAG_ENABLED / IGC_GET_REGKEYSTRING directly. Dump path functions (GetBaseIGCOutputFolder, GetShaderOutputFolder, SetShaderOutputFolder) are extracted from customApi.cpp into shared igc_dump_paths files that compile in both FCL and IGC contexts. AdaptorCommon/customApi.hpp and Debug::SetDebugFlag calls are guarded behind #ifndef IGC_FCL_BUILD.
1 parent b05b1c9 commit fd05986

14 files changed

Lines changed: 415 additions & 868 deletions

File tree

IGC/AdaptorCommon/customApi.cpp

Lines changed: 0 additions & 170 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ static struct {
7979
} g_dumpFlags[static_cast<int>(IGC::Debug::DumpType::END)] = {};
8080

8181
std::string g_shaderCorpusName;
82-
std::string g_shaderOutputFolder;
8382
std::string g_shaderOutputName;
8483

8584
} // namespace
@@ -295,101 +294,8 @@ void IGC_DEBUG_API_CALL SetShaderCorpusName(CorpusName name) { g_shaderCorpusNam
295294

296295
CorpusName IGC_DEBUG_API_CALL GetShaderCorpusName() { return g_shaderCorpusName.c_str(); }
297296

298-
void IGC_DEBUG_API_CALL SetShaderOutputFolder(OutputFolderName name) { g_shaderOutputFolder = name; }
299297
void IGC_DEBUG_API_CALL SetShaderOutputName(OutputName name) { g_shaderOutputName = name; }
300298

301-
bool needMkDir() {
302-
return IGC_IS_FLAG_ENABLED(DumpLLVMIR) || IGC_IS_FLAG_ENABLED(EnableCosDump) ||
303-
IGC_IS_FLAG_ENABLED(EnableVISAOutput) || IGC_IS_FLAG_ENABLED(EnableVISABinary) ||
304-
IGC_IS_FLAG_ENABLED(EnableVISADumpCommonISA) ||
305-
GetDebugFlag(DebugFlag::DUMP_AFTER_PASSES) || GetDebugFlag(DebugFlag::VISA_OUTPUT) ||
306-
GetDebugFlag(DebugFlag::VISA_BINARY) || GetDebugFlag(DebugFlag::VISA_DUMPCOMMONISA) ||
307-
IGC_IS_FLAG_ENABLED(EnableCapsDump) || IGC_IS_FLAG_ENABLED(ShaderOverride) ||
308-
IGC_IS_FLAG_ENABLED(GenerateOptionsFile);
309-
}
310-
311-
OutputFolderName IGC_DEBUG_API_CALL GetBaseIGCOutputFolder() {
312-
static std::mutex m;
313-
std::lock_guard<std::mutex> lck(m);
314-
static std::string IGCBaseFolder;
315-
if (IGCBaseFolder != "") {
316-
return IGCBaseFolder.c_str();
317-
}
318-
#if defined(_WIN64) || defined(_WIN32)
319-
if (!IGC_IS_FLAG_ENABLED(DumpToCurrentDir) && !IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
320-
bool needMkdir = needMkDir();
321-
322-
char dumpPath[256];
323-
324-
sprintf_s(dumpPath, "c:\\Intel\\");
325-
if (GetFileAttributesA(dumpPath) != FILE_ATTRIBUTE_DIRECTORY && needMkdir) {
326-
_mkdir(dumpPath);
327-
}
328-
329-
sprintf_s(dumpPath, "c:\\Intel\\IGC\\");
330-
if (GetFileAttributesA(dumpPath) != FILE_ATTRIBUTE_DIRECTORY && needMkdir) {
331-
_mkdir(dumpPath);
332-
}
333-
334-
// Make sure we can write in the dump folder as the app may be sandboxed
335-
if (needMkdir) {
336-
int tmp_id = _getpid();
337-
std::string testFilename = std::string(dumpPath) + "testfile" + std::to_string(tmp_id);
338-
HANDLE testFile =
339-
CreateFileA(testFilename.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, NULL);
340-
if (testFile == INVALID_HANDLE_VALUE) {
341-
char temppath[256];
342-
if (GetTempPathA(sizeof(temppath), temppath) != 0) {
343-
sprintf_s(dumpPath, "%sIGC\\", temppath);
344-
}
345-
} else {
346-
CloseHandle(testFile);
347-
}
348-
}
349-
350-
if (GetFileAttributesA(dumpPath) != FILE_ATTRIBUTE_DIRECTORY && needMkdir) {
351-
_mkdir(dumpPath);
352-
}
353-
354-
IGCBaseFolder = dumpPath;
355-
} else if (IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
356-
std::string dumpPath = "c:\\Intel\\IGC\\"; // default if something goes wrong
357-
const char *custom_dir = IGC_GET_REGKEYSTRING(DumpToCustomDir);
358-
if (custom_dir != nullptr && strlen(custom_dir) > 0) {
359-
dumpPath = custom_dir;
360-
}
361-
362-
char pathBuf[256];
363-
iSTD::CreateAppOutputDir(pathBuf, 256, dumpPath.c_str(), false, false, false);
364-
365-
IGCBaseFolder = pathBuf;
366-
}
367-
#elif defined ANDROID
368-
369-
if (IGC_IS_FLAG_ENABLED(DumpToCurrentDir))
370-
return "";
371-
IGCBaseFolder = "/sdcard/intel/igc/";
372-
373-
#elif defined __linux__
374-
if (!IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
375-
IGCBaseFolder = "/tmp/IntelIGC/";
376-
} else {
377-
std::string dumpPath = "/tmp/IntelIGC/"; // default if something goes wrong
378-
const char *custom_dir = IGC_GET_REGKEYSTRING(DumpToCustomDir);
379-
if (custom_dir != nullptr && strlen(custom_dir) > 0) {
380-
dumpPath = custom_dir;
381-
dumpPath += "/";
382-
}
383-
384-
char pathBuf[256];
385-
iSTD::CreateAppOutputDir(pathBuf, 256, dumpPath.c_str(), false, false, false);
386-
387-
IGCBaseFolder = pathBuf;
388-
}
389-
#endif
390-
return IGCBaseFolder.c_str();
391-
}
392-
393299
std::string &GetShaderOverridePathString() {
394300
static std::string path = []() -> std::string {
395301
if (IGC_IS_FLAG_DISABLED(ShaderOverride)) {
@@ -425,82 +331,6 @@ OutputFolderName IGC_DEBUG_API_CALL GetShaderOverridePath() {
425331
return overridePath.c_str();
426332
}
427333

428-
OutputFolderName IGC_DEBUG_API_CALL GetShaderOutputFolder() {
429-
static std::mutex m;
430-
std::lock_guard<std::mutex> lck(m);
431-
if (g_shaderOutputFolder != "" && doesRegexMatch(g_shaderOutputFolder, IGC_GET_REGKEYSTRING(ShaderDumpRegexFilter))) {
432-
return g_shaderOutputFolder.c_str();
433-
}
434-
#if defined(_WIN64) || defined(_WIN32)
435-
if (!IGC_IS_FLAG_ENABLED(DumpToCurrentDir) && !IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
436-
char dumpPath[256];
437-
sprintf_s(dumpPath, "%s", GetBaseIGCOutputFolder());
438-
char appPath[MAX_PATH] = {0};
439-
// check a process id and make an adequate directory for it:
440-
441-
if (::GetModuleFileNameA(NULL, appPath, sizeof(appPath) - 1)) {
442-
std::string appPathStr = std::string(appPath);
443-
int pos = appPathStr.find_last_of("\\") + 1;
444-
445-
if (IGC_IS_FLAG_ENABLED(ShaderDumpPidDisable)) {
446-
sprintf_s(dumpPath, "%s%s\\", dumpPath, appPathStr.substr(pos, MAX_PATH).c_str());
447-
} else {
448-
sprintf_s(dumpPath, "%s%s_%d\\", dumpPath, appPathStr.substr(pos, MAX_PATH).c_str(), _getpid());
449-
}
450-
} else {
451-
sprintf_s(dumpPath, "%sunknownProcess_%d\\", dumpPath, _getpid());
452-
}
453-
454-
if (needMkDir() && doesRegexMatch(dumpPath, IGC_GET_REGKEYSTRING(ShaderDumpRegexFilter))) {
455-
if (GetFileAttributesA(dumpPath) != FILE_ATTRIBUTE_DIRECTORY) {
456-
_mkdir(dumpPath);
457-
}
458-
g_shaderOutputFolder = dumpPath;
459-
} else {
460-
// To make the path always invalid.
461-
g_shaderOutputFolder = "NUL\\";
462-
}
463-
} else if (IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
464-
char pathBuf[256];
465-
iSTD::CreateAppOutputDir(pathBuf, 256, GetBaseIGCOutputFolder(), false, true,
466-
!IGC_IS_FLAG_ENABLED(ShaderDumpPidDisable));
467-
g_shaderOutputFolder = pathBuf;
468-
}
469-
#elif defined ANDROID
470-
471-
if (IGC_IS_FLAG_ENABLED(DumpToCurrentDir))
472-
return "";
473-
474-
if (!SysUtils::CreateDir(GetBaseIGCOutputFolder(), true, IGC_IS_FLAG_DISABLED(ShaderDumpPidDisable),
475-
&g_shaderOutputFolder))
476-
477-
g_shaderOutputFolder = "";
478-
479-
#elif defined __linux__
480-
if (!IGC_IS_FLAG_ENABLED(DumpToCurrentDir) && g_shaderOutputFolder == "" && !IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
481-
bool needMkdir =
482-
needMkDir() && doesRegexMatch(GetBaseIGCOutputFolder(), IGC_GET_REGKEYSTRING(ShaderDumpRegexFilter));
483-
484-
char path[MAX_PATH] = {0};
485-
bool pidEnabled = IGC_IS_FLAG_DISABLED(ShaderDumpPidDisable);
486-
487-
if (needMkdir) {
488-
iSTD::CreateAppOutputDir(path, MAX_PATH, GetBaseIGCOutputFolder(), false, true, pidEnabled);
489-
g_shaderOutputFolder = path;
490-
} else {
491-
// To make the path always invalid.
492-
g_shaderOutputFolder = "/dev/null/";
493-
}
494-
} else if (IGC_IS_FLAG_ENABLED(DumpToCustomDir)) {
495-
char pathBuf[256];
496-
iSTD::CreateAppOutputDir(pathBuf, 256, GetBaseIGCOutputFolder(), false, false, false);
497-
g_shaderOutputFolder = pathBuf;
498-
}
499-
500-
#endif
501-
return g_shaderOutputFolder.c_str();
502-
}
503-
504334
OutputName IGC_DEBUG_API_CALL GetFunctionDebugFile() {
505335
if (IGC_GET_FLAG_VALUE(SelectiveFunctionControl) != 0) {
506336
static std::mutex m;

IGC/AdaptorCommon/customApi.hpp

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,12 @@ SPDX-License-Identifier: MIT
1111
#include "usc.h"
1212
#include "API/igc.h"
1313
#include "common/igc_regkeys.hpp"
14+
#include "common/igc_dump_paths.hpp"
1415

1516
#if !defined(IGC_DEBUG_VARIABLES)
1617
#include <stdio.h>
1718
#endif
1819

19-
// In _RELEASE builds, make these api functions available for internal use,
20-
// but do not export them in the dll.
21-
#if defined(IGC_DEBUG_VARIABLES)
22-
#if defined(_WIN32)
23-
#if defined(IGC_EXPORTS)
24-
#define IGC_DEBUG_API_CALL __declspec(dllexport)
25-
#else
26-
#define IGC_DEBUG_API_CALL __declspec(dllimport)
27-
#endif
28-
#else
29-
#if defined(IGC_EXPORTS)
30-
#define IGC_DEBUG_API_CALL __attribute__((visibility("default")))
31-
#else
32-
#define IGC_DEBUG_API_CALL
33-
#endif
34-
#endif
35-
#else
36-
#define IGC_DEBUG_API_CALL
37-
#endif
38-
3920
namespace IGC {
4021
namespace Debug {
4122
/// enum to set the compiler flags from the custom API
@@ -181,15 +162,10 @@ void IGC_DEBUG_API_CALL SetShaderCorpusName(CorpusName name);
181162
/// Get the name for the to-be-compiled set of shaders
182163
CorpusName IGC_DEBUG_API_CALL GetShaderCorpusName();
183164

184-
/// Set a name for the output folder
185-
void IGC_DEBUG_API_CALL SetShaderOutputFolder(OutputFolderName name);
186-
187165
void IGC_DEBUG_API_CALL SetShaderOutputName(OutputName name);
188166

189167
void IGC_DEBUG_API_CALL SetShaderOverridePath(OutputFolderName pOutputFolderName);
190168
OutputFolderName IGC_DEBUG_API_CALL GetShaderOverridePath();
191-
/// Get the name for the output folder
192-
OutputFolderName IGC_DEBUG_API_CALL GetShaderOutputFolder();
193169

194170
OutputName IGC_DEBUG_API_CALL GetShaderOutputName();
195171

@@ -282,12 +258,7 @@ inline void IGC_DEBUG_API_CALL SetShaderCorpusName(CorpusName name) { (void)name
282258
/// Returns empty string in _RELEASE builds
283259
inline CorpusName IGC_DEBUG_API_CALL GetShaderCorpusName() { return ""; }
284260

285-
/// Does nothing in _RELEASE builds
286-
inline void IGC_DEBUG_API_CALL SetShaderOutputFolder(OutputFolderName name) { (void)name; }
287261
inline void IGC_DEBUG_API_CALL SetShaderOutputName(OutputName name) { (void)name; }
288-
289-
/// Returns empty string in _RELEASE builds
290-
inline OutputFolderName IGC_DEBUG_API_CALL GetShaderOutputFolder() { return ""; }
291262
inline OutputName IGC_DEBUG_API_CALL GetShaderOutputName() { return ""; }
292263

293264
inline void IGC_DEBUG_API_CALL SetShaderOverridePath(OutputFolderName pOutputFolderName) { (void)pOutputFolderName; }

IGC/AdaptorOCL/ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ SPDX-License-Identifier: MIT
77
============================= end_copyright_notice ===========================*/
88

99
#include "ocl_igc_interface/impl/fcl_ocl_translation_ctx_impl.h"
10-
#include "AdaptorCommon/customApi.hpp"
10+
#include "common/igc_regkeys.hpp"
1111
#include "common/StringMacros.hpp"
1212
#include "common/VCPlatformSelector.hpp"
1313
#include "common/debug/Dump.hpp"
@@ -130,7 +130,7 @@ std::optional<FeShaderDumpData> getShaderDumpData(PLATFORM *Platform, const char
130130
CIF::Builtins::BufferSimple *InternalOptions,
131131
CIF::Builtins::BufferSimple *TracingOptions) {
132132
#if defined(_DEBUG) || defined(_INTERNAL)
133-
if (!FCL_IGC_IS_FLAG_ENABLED(ShaderDumpEnable))
133+
if (!IGC_IS_FLAG_ENABLED(ShaderDumpEnable))
134134
return {};
135135

136136
return FeShaderDumpData(Platform, Selected, Stepping, Src, Options, InternalOptions, TracingOptions);

IGC/AdaptorOCL/ocl_igc_interface/impl/igc_ocl_translation_ctx_impl.h

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -237,27 +237,11 @@ CIF_DECLARE_INTERFACE_PIMPL(IgcOclTranslationCtx) : CIF::PimplBase {
237237
USC::SShaderStageBTLayout zeroLayout = USC::g_cZeroShaderStageBTLayout;
238238
IGC::COCLBTILayout oclLayout(&zeroLayout);
239239

240-
std::string RegKeysFlagsFromOptions;
241-
if (inputArgs.pOptions != nullptr) {
242-
std::string_view optionsWithFlags = inputArgs.pOptions;
243-
244-
// check if there are more instances of '-igc_opts'
245-
while (!optionsWithFlags.empty()) {
246-
std::size_t found = optionsWithFlags.find("-igc_opts");
247-
if (found == std::string::npos)
248-
break;
249-
250-
std::size_t foundFirstSingleQuote = optionsWithFlags.find('\'', found);
251-
std::size_t foundSecondSingleQuote = optionsWithFlags.find('\'', foundFirstSingleQuote + 1);
252-
if (foundFirstSingleQuote == std::string::npos || foundSecondSingleQuote == std::string::npos) {
253-
outputInterface->GetImpl()->SetError(TranslationErrorType::Unused, "Missing single quotes for -igc_opts");
254-
return outputInterface.release();
255-
}
256-
RegKeysFlagsFromOptions +=
257-
optionsWithFlags.substr(foundFirstSingleQuote + 1, (foundSecondSingleQuote - foundFirstSingleQuote - 1));
258-
RegKeysFlagsFromOptions = RegKeysFlagsFromOptions + ',';
259-
optionsWithFlags = optionsWithFlags.substr(foundSecondSingleQuote + 1, optionsWithFlags.length());
260-
}
240+
std::string igcOptsError;
241+
std::string RegKeysFlagsFromOptions = ExtractIGCOptsFromOptions(inputArgs.pOptions, igcOptsError);
242+
if (!igcOptsError.empty()) {
243+
outputInterface->GetImpl()->SetError(TranslationErrorType::Unused, igcOptsError.c_str());
244+
return outputInterface.release();
261245
}
262246
bool RegFlagNameError = 0;
263247
LoadRegistryKeys(RegKeysFlagsFromOptions, &RegFlagNameError);

IGC/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1816,6 +1816,9 @@ if (FCL_ENABLED)
18161816
set_target_properties("${IGC_BUILD__PROJ__fcl_dll}" PROPERTIES FOLDER "Libraries")
18171817

18181818
add_dependencies("${IGC_BUILD__PROJ__fcl_dll}" opencl-clang-lib)
1819+
1820+
target_compile_definitions("${IGC_BUILD__PROJ__fcl_dll}" PRIVATE
1821+
IGC_FCL_BUILD)
18191822
endif()
18201823

18211824
set(IGC_BUILD__HDR__IGC__igc_lib

IGC/OCLFE/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ set(IGC_BUILD__SRC__FCL
3131
"${CMAKE_CURRENT_SOURCE_DIR}/igd_fcl_mcl/source/clang_tb.cpp"
3232
"${CMAKE_CURRENT_SOURCE_DIR}/igd_fcl_mcl/source/clang_debug.cpp"
3333
"${CMAKE_CURRENT_SOURCE_DIR}/igd_fcl_mcl/source/LoadBuffer.cpp"
34+
"${CMAKE_CURRENT_SOURCE_DIR}/../common/igc_regkeys.cpp"
35+
"${CMAKE_CURRENT_SOURCE_DIR}/../common/igc_dump_paths.cpp"
3436
"${IGC_BUILD__SRC__IGC_Common_CLElfLib}"
3537
)
3638

IGC/OCLFE/igd_fcl_mcl/headers/clang_tb.h

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ SPDX-License-Identifier: MIT
1111
#include "GlobalData.h"
1212
#include "igfxfmid.h"
1313
#include "TranslationBlock.h"
14+
#include "common/igc_dump_paths.hpp"
1415
#include <string>
1516
#include <memory>
1617
#include <vector>
@@ -137,22 +138,8 @@ class CClangTranslationBlock : public CTranslationBlock {
137138

138139
namespace FCL {
139140

140-
// type for name of output folder
141-
using OutputFolderName = const char *;
141+
using IGC::Debug::GetBaseIGCOutputFolder;
142+
using IGC::Debug::GetShaderOutputFolder;
143+
using IGC::Debug::OutputFolderName;
142144

143-
// function returns full path where to dump shaders for FCL
144-
OutputFolderName GetShaderOutputFolder();
145-
146-
// different register-dependent functions
147-
bool GetFCLShaderDumpEnable();
148-
bool GetFCLShaderDumpPidDisable();
149-
bool GetFCLDumpToCurrentDir();
150-
bool GetFCLDumpToCustomDir();
151-
bool GetFCLEnableKernelNamesBasedHash();
152-
#if LLVM_VERSION_MAJOR < 17
153-
bool GetFCLEnableOpaquePointersBackend();
154-
#endif
155145
} // namespace FCL
156-
157-
// convenient macro to check FCL flags
158-
#define FCL_IGC_IS_FLAG_ENABLED(name) FCL::GetFCL##name()

0 commit comments

Comments
 (0)