Skip to content

Commit 77e3412

Browse files
dvrogozhgfxbot
authored andcommitted
Dynamically linking common_clang to fcl for Linux
Since there is no other path of going into igdfcl without using common_clang we can just dynamically link this library to igdfcl and no longer use dlopen. Fixes #72, 81 Change-Id: I8ea41f742a07294e5fbd51dd7de809e8f9d80731
1 parent 4b2c014 commit 77e3412

File tree

4 files changed

+59
-103
lines changed

4 files changed

+59
-103
lines changed

IGC/BiFModule/CMakeLists.txt

Lines changed: 9 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,6 @@ endif()
122122

123123
get_property(_clang7zLocation TARGET CLANG_7Z PROPERTY IMPORTED_LOCATION_RELEASE)
124124

125-
if(WIN32)
126-
set(COMMON_CLANG_LIB_FULL_NAME "${COMMON_CLANG_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
127-
else()
128-
set(COMMON_CLANG_LIB_FULL_NAME "lib${COMMON_CLANG_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
129-
endif()
130-
131125
if(NOT ${CCLANG_BUILD_INTREE_LLVM})
132126
# Add step to preform the extraction
133127
add_custom_command(
@@ -150,7 +144,7 @@ endif()
150144
set(CL_OPTIONS "")
151145

152146
add_custom_target(GetClang)
153-
add_library(common_clang_dll UNKNOWN IMPORTED GLOBAL)
147+
add_library(common_clang_dll SHARED IMPORTED GLOBAL)
154148

155149
if(EXISTS ${_clang7zLocation} AND NOT ${CCLANG_BUILD_INTREE_LLVM})
156150
# Use precompiled common clang bundle.
@@ -169,38 +163,14 @@ endif()
169163
if(${CCLANG_BUILD_INTREE_LLVM})
170164
message("Common clang build-in-tree")
171165
set(SYSTEM_COMMON_CLANG OFF)
172-
set(CCLANG_INSTALL_ARTIFACTS_DIR ${IGC_TARGET__TOOLS_CLANG_DIR})
173-
174-
if(NOT CCLANG_OCL_HEADERS_DIR)
175-
if (EXISTS "${IGC_BUILD__GFX_DEV_SRC_DIR}/third_party/opencl_headers")
176-
set(CCLANG_OCL_HEADERS_DIR "${IGC_BUILD__GFX_DEV_SRC_DIR}/third_party/opencl_headers")
177-
else()
178-
get_filename_component(CCLANG_OCL_HEADERS_DIR "${IGC_BUILD__GFX_DEV_SRC_DIR}/../opencl_headers" ABSOLUTE)
179-
endif()
180-
endif(NOT CCLANG_OCL_HEADERS_DIR)
181-
182-
set(clang_filename "clang${CMAKE_EXECUTABLE_SUFFIX}")
183-
add_custom_command(
184-
OUTPUT "${IGC_TARGET__TOOLS_CLANG_DIR}/${clang_filename}"
185-
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:clang>" "${IGC_TARGET__TOOLS_CLANG_DIR}/${clang_filename}"
186-
DEPENDS clang
187-
)
188-
189-
add_custom_command(
190-
OUTPUT "${IGC_TARGET__TOOLS_CLANG_DIR}/${COMMON_CLANG_LIB_FULL_NAME}"
191-
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${COMMON_CLANG_LIBRARY_NAME}>" "${IGC_TARGET__TOOLS_CLANG_DIR}/${COMMON_CLANG_LIB_FULL_NAME}"
192-
DEPENDS ${COMMON_CLANG_LIBRARY_NAME}
193-
)
194-
195-
set(cclang_header_filename "opencl-c.h")
196-
add_custom_command(
197-
OUTPUT "${IGC_TARGET__TOOLS_CLANG_DIR}/${cclang_header_filename}"
198-
COMMAND ${CMAKE_COMMAND} -E copy "${CLANG_SOURCE_DIR}/lib/Headers/${cclang_header_filename}" "${IGC_TARGET__TOOLS_CLANG_DIR}/${cclang_header_filename}"
199-
DEPENDS cl_headers
200-
)
201166

202167
add_custom_target(copy_cclang_files ALL
203-
DEPENDS ${IGC_TARGET__TOOLS_CLANG_DIR}/${clang_filename} ${IGC_TARGET__TOOLS_CLANG_DIR}/${COMMON_CLANG_LIB_FULL_NAME} ${IGC_TARGET__TOOLS_CLANG_DIR}/${cclang_header_filename}
168+
COMMAND ${CMAKE_COMMAND} -E make_directory "${IGC_TARGET__TOOLS_CLANG_DIR}"
169+
COMMAND ${CMAKE_COMMAND} -E copy "${CLANG_SOURCE_DIR}/lib/Headers/opencl-c.h" "${IGC_TARGET__TOOLS_CLANG_DIR}/"
170+
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:clang>" "${IGC_TARGET__TOOLS_CLANG_DIR}/clang${CMAKE_EXECUTABLE_SUFFIX}"
171+
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_LINKER_FILE:${COMMON_CLANG_LIBRARY_NAME}>" "${IGC_TARGET__TOOLS_CLANG_DIR}/"
172+
COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_SONAME_FILE:${COMMON_CLANG_LIBRARY_NAME}>" "${IGC_TARGET__TOOLS_CLANG_DIR}/"
173+
DEPENDS clang cl_headers ${COMMON_CLANG_LIBRARY_NAME}
204174
)
205175

206176
add_dependencies(GetClang copy_cclang_files)
@@ -236,8 +206,8 @@ endif()
236206
add_dependencies(common_clang_dll GetClang)
237207

238208
if(UNIX AND NOT SYSTEM_COMMON_CLANG)
239-
install(FILES $<TARGET_FILE:common_clang_dll> DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} COMPONENT igc-opencl)
240-
endif(UNIX)
209+
install(FILES $<TARGET_SONAME_FILE:common_clang_dll> DESTINATION ${CMAKE_INSTALL_FULL_LIBDIR} COMPONENT igc-opencl)
210+
endif()
241211

242212
# End Clang section
243213

IGC/CMakeLists.txt

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3088,19 +3088,6 @@ set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
30883088
)
30893089
endif()
30903090

3091-
if(NOT DEFINED COMMON_CLANG_LIBRARY_NAME)
3092-
set(COMMON_CLANG_LIBRARY_NAME opencl-clang)
3093-
endif()
3094-
3095-
if(WIN32)
3096-
igc_arch_get_cpu(_cpuSuffix)
3097-
set(COMMON_CLANG_LIBRARY_NAME common_clang${_cpuSuffix})
3098-
endif()
3099-
3100-
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
3101-
COMMON_CLANG_LIBRARY_NAME=${COMMON_CLANG_LIBRARY_NAME}
3102-
)
3103-
31043091

31053092
#SPIRV consumption flag
31063093
if(IGC_BUILD__SPIRV_ENABLED)
@@ -3345,6 +3332,27 @@ else()
33453332
endif()
33463333
endif()
33473334

3335+
if(NOT DEFINED COMMON_CLANG_LIBRARY_NAME)
3336+
set(COMMON_CLANG_LIBRARY_NAME opencl-clang)
3337+
endif()
3338+
3339+
if(WIN32)
3340+
igc_arch_get_cpu(_cpuSuffix)
3341+
set(COMMON_CLANG_LIBRARY_NAME common_clang${_cpuSuffix})
3342+
set(COMMON_CLANG_LIB_FULL_NAME "${COMMON_CLANG_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
3343+
3344+
message(STATUS "OpenCL Clang library name to load: ${COMMON_CLANG_LIB_FULL_NAME}")
3345+
3346+
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
3347+
COMMON_CLANG_LIB_FULL_NAME=\"${COMMON_CLANG_LIB_FULL_NAME}\"
3348+
)
3349+
elseif(UNIX)
3350+
set(COMMON_CLANG_LIB_FULL_NAME "lib${COMMON_CLANG_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}.${LLVM_VERSION_MAJOR}")
3351+
else()
3352+
set(COMMON_CLANG_LIB_FULL_NAME "lib${COMMON_CLANG_LIBRARY_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
3353+
endif()
3354+
3355+
33483356
# ==================================== WrapperLLVM package =============================================
33493357

33503358
add_subdirectory(WrapperLLVM)
@@ -3811,8 +3819,15 @@ if(_targetIsStatic)
38113819
${_targetLinkLine}
38123820
)
38133821
else()
3822+
if (UNIX)
3823+
set(COMMON_CLANG common_clang_dll)
3824+
else()
3825+
set(COMMON_CLANG "")
3826+
endif()
3827+
38143828
target_link_libraries("${IGC_BUILD__PROJ__fcl_dll}"
38153829
${_targetLinkLine}
3830+
${COMMON_CLANG}
38163831
)
38173832
# Link line for shared / dynamic library requires only library project (all static libs are linked inside).
38183833
set_property(TARGET "${IGC_BUILD__PROJ__fcl_dll}" PROPERTY LINK_INTERFACE_LIBRARIES "")

IGC/OCLFE/igd_fcl_mcl/headers/clang_tb.h

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -64,34 +64,20 @@ namespace TC
6464
{ TB_DATA_FORMAT_ELF, TB_DATA_FORMAT_LLVM_ARCHIVE }
6565
};
6666

67+
#ifdef _WIN32
68+
#ifdef COMMON_CLANG_LIB_FULL_NAME
6769
struct CCModuleStruct {
6870
typedef decltype(Compile) *PFcnCCCompile;
6971

7072
void* pModule = nullptr;
7173
PFcnCCCompile pCompile = nullptr;
72-
const char *pModuleName = nullptr;
7374

74-
CCModuleStruct()
75-
{
76-
#ifdef COMMON_CLANG_LIBRARY_NAME
77-
#define TO_STRING(name) #name
78-
#define CCLANG_NAME(cclang) TO_STRING(cclang)
79-
80-
#if defined(_WIN32) || defined(_WIN64)
81-
#define CCLANG_WIN(clang_name) clang_name ".dll"
82-
pModuleName = CCLANG_WIN(CCLANG_NAME(COMMON_CLANG_LIBRARY_NAME));
75+
const char *pModuleName = COMMON_CLANG_LIB_FULL_NAME;
76+
};
8377
#else
84-
#define CCLANG_UNIX(clang_name) "lib" clang_name ".so"
85-
pModuleName = CCLANG_UNIX(CCLANG_NAME(COMMON_CLANG_LIBRARY_NAME));
78+
# error "Common clang name not defined"
8679
#endif
87-
88-
#else
89-
assert(0 && "Common clang name not defined");
9080
#endif
91-
}
92-
};
93-
94-
9581

9682
/***************************************************************************\
9783
@@ -106,7 +92,9 @@ namespace TC
10692
{
10793
TB_DATA_FORMAT m_InputFormat;
10894
TB_DATA_FORMAT m_OutputFormat;
95+
#ifdef _WIN32
10996
CCModuleStruct m_CCModule;
97+
#endif
11098

11199

112100
public:

IGC/OCLFE/igd_fcl_mcl/source/clang_tb.cpp

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -571,13 +571,13 @@ namespace TC
571571
{
572572
success = pTranslationBlock->Initialize(pCreateArgs);
573573

574+
#ifdef _WIN32
574575
if (true == success)
575576
{
576-
// Load the Common Clang library
577-
CCModuleStruct &CCModule = pTranslationBlock->m_CCModule;
578-
#ifdef _WIN32
579577
// Both Win32 and Win64
580578
// load dependency only on RS
579+
// Load the Common Clang library
580+
CCModuleStruct &CCModule = pTranslationBlock->m_CCModule;
581581
if (GetWinVer() >= OS_WIN_RS)
582582
{
583583
CCModule.pModule = LoadDependency(CCModule.pModuleName);
@@ -595,29 +595,8 @@ namespace TC
595595
{
596596
success = false;
597597
}
598-
#else
599-
// Both 32 and 64 bit for non-Windows OS
600-
// Avoid sumbol conflicts if some LLVM is already loaded in the project.
601-
// CCModule will use its own symbols in preference to global symbols with the same name
602-
// contained in libraries that have already been loaded
603-
CCModule.pModule = dlopen(CCModule.pModuleName, RTLD_NOW | RTLD_DEEPBIND);
604-
if (NULL == CCModule.pModule)
605-
{
606-
std::string pathToOpenclClang = "/usr/local/lib/";
607-
pathToOpenclClang += CCModule.pModuleName;
608-
CCModule.pModule = dlopen(pathToOpenclClang.c_str(), RTLD_NOW | RTLD_DEEPBIND);
609-
}
610-
if (NULL != CCModule.pModule)
611-
{
612-
CCModule.pCompile = (CCModuleStruct::PFcnCCCompile)dlsym(CCModule.pModule, "Compile");
613-
success = CCModule.pCompile != NULL;
614-
}
615-
else
616-
{
617-
success = false;
618-
}
619-
#endif
620598
}
599+
#endif
621600

622601
if (!success)
623602
{
@@ -647,12 +626,12 @@ namespace TC
647626
void CClangTranslationBlock::Delete(
648627
CClangTranslationBlock* &pTranslationBlock)
649628
{
650-
// Unload the Common Clang library
651629
#ifdef _WIN32
652-
// Both Win32 and Win64
653-
FreeLibrary((HMODULE)pTranslationBlock->m_CCModule.pModule);
654-
#else
655-
dlclose(pTranslationBlock->m_CCModule.pModule);
630+
// Unload the Common Clang library
631+
if (pTranslationBlock->m_CCModule.pModule) {
632+
// Both Win32 and Win64
633+
FreeLibrary((HMODULE)pTranslationBlock->m_CCModule.pModule);
634+
}
656635
#endif
657636

658637
delete pTranslationBlock;
@@ -1422,7 +1401,12 @@ namespace TC
14221401
optionsEx += " -D__IMAGE_SUPPORT__ -D__ENDIAN_LITTLE__";
14231402

14241403
IOCLFEBinaryResult *pResultPtr = NULL;
1425-
int res = m_CCModule.pCompile(pInputArgs->pszProgramSource,
1404+
#ifdef _WIN32
1405+
int res = m_CCModule.pCompile(
1406+
#else
1407+
int res = Compile(
1408+
#endif
1409+
pInputArgs->pszProgramSource,
14261410
(const char**)pInputArgs->inputHeaders.data(),
14271411
(unsigned int)pInputArgs->inputHeaders.size(),
14281412
(const char**)pInputArgs->inputHeadersNames.data(),
@@ -1432,7 +1416,6 @@ namespace TC
14321416
optionsEx.c_str(),
14331417
pInputArgs->oclVersion.c_str(),
14341418
&pResultPtr);
1435-
14361419
if (0 != BuildOptionsAreValid(options.c_str(), exceptString)) res = -43;
14371420

14381421
Utils::FillOutputArgs(pResultPtr, pOutputArgs, exceptString);

0 commit comments

Comments
 (0)