Revert changes that migrate to thread_local.
iOS 8 does not support `thread_local`, which is still in use. Another approach will have to be found. This change is a revert of the following changes: a3845240 - "Simplify PoolAlloc with use of thread_local." abf92c80 - "Deprecate InitializeDll functions" 33585c87 - "Limit visibility of symbols for internal libraries" Issue: #2346
This commit is contained in:
parent
7ab4564696
commit
2a44064885
@ -279,23 +279,17 @@ function(glslang_add_build_info_dependency target)
|
|||||||
add_dependencies(${target} glslang-build-info)
|
add_dependencies(${target} glslang-build-info)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# glslang_default_to_hidden_visibility() makes the symbol visibility hidden by
|
|
||||||
# default for <target>.
|
|
||||||
function(glslang_default_to_hidden_visibility target)
|
|
||||||
if(NOT WIN32)
|
|
||||||
target_compile_options(${target} PRIVATE "-fvisibility=hidden")
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
# glslang_only_export_explicit_symbols() makes the symbol visibility hidden by
|
# glslang_only_export_explicit_symbols() makes the symbol visibility hidden by
|
||||||
# default for <target>, and sets the GLSLANG_IS_SHARED_LIBRARY define, and
|
# default for <target> when building shared libraries, and sets the
|
||||||
# GLSLANG_EXPORTING to 1 when specifically building <target>.
|
# GLSLANG_IS_SHARED_LIBRARY define, and GLSLANG_EXPORTING to 1 when specifically
|
||||||
|
# building <target>.
|
||||||
function(glslang_only_export_explicit_symbols target)
|
function(glslang_only_export_explicit_symbols target)
|
||||||
glslang_default_to_hidden_visibility(${target})
|
|
||||||
if(BUILD_SHARED_LIBS)
|
if(BUILD_SHARED_LIBS)
|
||||||
target_compile_definitions(${target} PUBLIC "GLSLANG_IS_SHARED_LIBRARY=1")
|
target_compile_definitions(${target} PUBLIC "GLSLANG_IS_SHARED_LIBRARY=1")
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
target_compile_definitions(${target} PRIVATE "GLSLANG_EXPORTING=1")
|
target_compile_definitions(${target} PRIVATE "GLSLANG_EXPORTING=1")
|
||||||
|
else()
|
||||||
|
target_compile_options(${target} PRIVATE "-fvisibility=hidden")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|||||||
@ -36,7 +36,6 @@ set(SOURCES InitializeDll.cpp InitializeDll.h)
|
|||||||
add_library(OGLCompiler STATIC ${SOURCES})
|
add_library(OGLCompiler STATIC ${SOURCES})
|
||||||
set_property(TARGET OGLCompiler PROPERTY FOLDER glslang)
|
set_property(TARGET OGLCompiler PROPERTY FOLDER glslang)
|
||||||
set_property(TARGET OGLCompiler PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET OGLCompiler PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
glslang_default_to_hidden_visibility(OGLCompiler)
|
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
source_group("Source" FILES ${SOURCES})
|
source_group("Source" FILES ${SOURCES})
|
||||||
|
|||||||
@ -32,6 +32,134 @@
|
|||||||
// POSSIBILITY OF SUCH DAMAGE.
|
// POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#define SH_EXPORTING
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "InitializeDll.h"
|
||||||
|
#include "../glslang/Include/InitializeGlobals.h"
|
||||||
|
#include "../glslang/Public/ShaderLang.h"
|
||||||
|
#include "../glslang/Include/PoolAlloc.h"
|
||||||
|
|
||||||
namespace glslang {
|
namespace glslang {
|
||||||
|
|
||||||
|
OS_TLSIndex ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
|
||||||
|
|
||||||
|
// Per-process initialization.
|
||||||
|
// Needs to be called at least once before parsing, etc. is done.
|
||||||
|
// Will also do thread initialization for the calling thread; other
|
||||||
|
// threads will need to do that explicitly.
|
||||||
|
bool InitProcess()
|
||||||
|
{
|
||||||
|
glslang::GetGlobalLock();
|
||||||
|
|
||||||
|
if (ThreadInitializeIndex != OS_INVALID_TLS_INDEX) {
|
||||||
|
//
|
||||||
|
// Function is re-entrant.
|
||||||
|
//
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
ThreadInitializeIndex = OS_AllocTLSIndex();
|
||||||
|
|
||||||
|
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
|
||||||
|
assert(0 && "InitProcess(): Failed to allocate TLS area for init flag");
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! InitializePoolIndex()) {
|
||||||
|
assert(0 && "InitProcess(): Failed to initialize global pool");
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! InitThread()) {
|
||||||
|
assert(0 && "InitProcess(): Failed to initialize thread");
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
glslang::ReleaseGlobalLock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Per-thread scoped initialization.
|
||||||
|
// Must be called at least once by each new thread sharing the
|
||||||
|
// symbol tables, etc., needed to parse.
|
||||||
|
bool InitThread()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// This function is re-entrant
|
||||||
|
//
|
||||||
|
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX) {
|
||||||
|
assert(0 && "InitThread(): Process hasn't been initalised.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (OS_GetTLSValue(ThreadInitializeIndex) != 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (! OS_SetTLSValue(ThreadInitializeIndex, (void *)1)) {
|
||||||
|
assert(0 && "InitThread(): Unable to set init flag.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
glslang::SetThreadPoolAllocator(nullptr);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not necessary to call this: InitThread() is reentrant, and the need
|
||||||
|
// to do per thread tear down has been removed.
|
||||||
|
//
|
||||||
|
// This is kept, with memory management removed, to satisfy any exiting
|
||||||
|
// calls to it that rely on it.
|
||||||
|
bool DetachThread()
|
||||||
|
{
|
||||||
|
bool success = true;
|
||||||
|
|
||||||
|
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Function is re-entrant and this thread may not have been initialized.
|
||||||
|
//
|
||||||
|
if (OS_GetTLSValue(ThreadInitializeIndex) != 0) {
|
||||||
|
if (!OS_SetTLSValue(ThreadInitializeIndex, (void *)0)) {
|
||||||
|
assert(0 && "DetachThread(): Unable to clear init flag.");
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not necessary to call this: InitProcess() is reentrant.
|
||||||
|
//
|
||||||
|
// This is kept, with memory management removed, to satisfy any exiting
|
||||||
|
// calls to it that rely on it.
|
||||||
|
//
|
||||||
|
// Users of glslang should call shFinalize() or glslang::FinalizeProcess() for
|
||||||
|
// process-scoped memory tear down.
|
||||||
|
bool DetachProcess()
|
||||||
|
{
|
||||||
|
bool success = true;
|
||||||
|
|
||||||
|
if (ThreadInitializeIndex == OS_INVALID_TLS_INDEX)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
success = DetachThread();
|
||||||
|
|
||||||
|
OS_FreeTLSIndex(ThreadInitializeIndex);
|
||||||
|
ThreadInitializeIndex = OS_INVALID_TLS_INDEX;
|
||||||
|
|
||||||
|
return success;
|
||||||
|
}
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
|||||||
@ -38,10 +38,10 @@
|
|||||||
|
|
||||||
namespace glslang {
|
namespace glslang {
|
||||||
|
|
||||||
inline bool InitProcess() { return true; } // DEPRECATED
|
bool InitProcess();
|
||||||
inline bool InitThread() { return true; } // DEPRECATED
|
bool InitThread();
|
||||||
inline bool DetachThread() { return true; } // DEPRECATED
|
bool DetachThread(); // not called from standalone, perhaps other tools rely on parts of it
|
||||||
inline bool DetachProcess() { return true; } // DEPRECATED
|
bool DetachProcess(); // not called from standalone, perhaps other tools rely on parts of it
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
|
||||||
|
|||||||
@ -43,7 +43,8 @@ set(SOURCES
|
|||||||
CInterface/spirv_c_interface.cpp)
|
CInterface/spirv_c_interface.cpp)
|
||||||
|
|
||||||
set(SPVREMAP_SOURCES
|
set(SPVREMAP_SOURCES
|
||||||
SPVRemapper.cpp)
|
SPVRemapper.cpp
|
||||||
|
doc.cpp)
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
bitutils.h
|
bitutils.h
|
||||||
@ -68,7 +69,6 @@ set(SPVREMAP_HEADERS
|
|||||||
doc.h)
|
doc.h)
|
||||||
|
|
||||||
add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS})
|
add_library(SPIRV ${LIB_TYPE} ${SOURCES} ${HEADERS})
|
||||||
target_link_libraries(SPIRV PRIVATE MachineIndependent)
|
|
||||||
set_property(TARGET SPIRV PROPERTY FOLDER glslang)
|
set_property(TARGET SPIRV PROPERTY FOLDER glslang)
|
||||||
set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET SPIRV PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
target_include_directories(SPIRV PUBLIC
|
target_include_directories(SPIRV PUBLIC
|
||||||
@ -79,7 +79,6 @@ glslang_add_build_info_dependency(SPIRV)
|
|||||||
|
|
||||||
if (ENABLE_SPVREMAPPER)
|
if (ENABLE_SPVREMAPPER)
|
||||||
add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
|
add_library(SPVRemapper ${LIB_TYPE} ${SPVREMAP_SOURCES} ${SPVREMAP_HEADERS})
|
||||||
target_link_libraries(SPVRemapper PRIVATE SPIRV)
|
|
||||||
set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
|
set_property(TARGET SPVRemapper PROPERTY FOLDER glslang)
|
||||||
set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET SPVRemapper PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
endif()
|
endif()
|
||||||
@ -96,10 +95,12 @@ if(ENABLE_OPT)
|
|||||||
PRIVATE ${spirv-tools_SOURCE_DIR}/include
|
PRIVATE ${spirv-tools_SOURCE_DIR}/include
|
||||||
PRIVATE ${spirv-tools_SOURCE_DIR}/source
|
PRIVATE ${spirv-tools_SOURCE_DIR}/source
|
||||||
)
|
)
|
||||||
target_link_libraries(SPIRV PRIVATE SPIRV-Tools-opt)
|
target_link_libraries(SPIRV PRIVATE MachineIndependent SPIRV-Tools-opt)
|
||||||
target_include_directories(SPIRV PUBLIC
|
target_include_directories(SPIRV PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../External>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/External>)
|
||||||
|
else()
|
||||||
|
target_link_libraries(SPIRV PRIVATE MachineIndependent)
|
||||||
endif(ENABLE_OPT)
|
endif(ENABLE_OPT)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
|
|||||||
@ -52,7 +52,6 @@ add_library(GenericCodeGen STATIC
|
|||||||
GenericCodeGen/Link.cpp)
|
GenericCodeGen/Link.cpp)
|
||||||
set_property(TARGET GenericCodeGen PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET GenericCodeGen PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
set_property(TARGET GenericCodeGen PROPERTY FOLDER glslang)
|
set_property(TARGET GenericCodeGen PROPERTY FOLDER glslang)
|
||||||
glslang_default_to_hidden_visibility(GenericCodeGen)
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# MachineIndependent
|
# MachineIndependent
|
||||||
@ -134,7 +133,6 @@ endif(ENABLE_HLSL)
|
|||||||
add_library(MachineIndependent STATIC ${MACHINEINDEPENDENT_SOURCES} ${MACHINEINDEPENDENT_HEADERS})
|
add_library(MachineIndependent STATIC ${MACHINEINDEPENDENT_SOURCES} ${MACHINEINDEPENDENT_HEADERS})
|
||||||
set_property(TARGET MachineIndependent PROPERTY POSITION_INDEPENDENT_CODE ON)
|
set_property(TARGET MachineIndependent PROPERTY POSITION_INDEPENDENT_CODE ON)
|
||||||
set_property(TARGET MachineIndependent PROPERTY FOLDER glslang)
|
set_property(TARGET MachineIndependent PROPERTY FOLDER glslang)
|
||||||
glslang_only_export_explicit_symbols(MachineIndependent)
|
|
||||||
|
|
||||||
glslang_add_build_info_dependency(MachineIndependent)
|
glslang_add_build_info_dependency(MachineIndependent)
|
||||||
|
|
||||||
@ -170,7 +168,7 @@ set_target_properties(glslang PROPERTIES
|
|||||||
POSITION_INDEPENDENT_CODE ON
|
POSITION_INDEPENDENT_CODE ON
|
||||||
VERSION "${GLSLANG_VERSION}"
|
VERSION "${GLSLANG_VERSION}"
|
||||||
SOVERSION "${GLSLANG_VERSION_MAJOR}")
|
SOVERSION "${GLSLANG_VERSION_MAJOR}")
|
||||||
target_link_libraries(glslang PRIVATE OGLCompiler MachineIndependent)
|
target_link_libraries(glslang PRIVATE OGLCompiler OSDependent MachineIndependent)
|
||||||
target_include_directories(glslang PUBLIC
|
target_include_directories(glslang PUBLIC
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
|
||||||
|
|||||||
@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
namespace glslang {
|
namespace glslang {
|
||||||
|
|
||||||
inline bool InitializePoolIndex() { return true; } // DEPRECATED: No need to call
|
bool InitializePoolIndex();
|
||||||
|
|
||||||
} // end namespace glslang
|
} // end namespace glslang
|
||||||
|
|
||||||
|
|||||||
@ -35,28 +35,34 @@
|
|||||||
#include "../Include/Common.h"
|
#include "../Include/Common.h"
|
||||||
#include "../Include/PoolAlloc.h"
|
#include "../Include/PoolAlloc.h"
|
||||||
|
|
||||||
|
#include "../Include/InitializeGlobals.h"
|
||||||
|
#include "../OSDependent/osinclude.h"
|
||||||
|
|
||||||
namespace glslang {
|
namespace glslang {
|
||||||
|
|
||||||
namespace {
|
// Process-wide TLS index
|
||||||
thread_local TPoolAllocator* threadPoolAllocator = nullptr;
|
OS_TLSIndex PoolIndex;
|
||||||
|
|
||||||
TPoolAllocator* GetDefaultThreadPoolAllocator()
|
|
||||||
{
|
|
||||||
thread_local TPoolAllocator defaultAllocator;
|
|
||||||
return &defaultAllocator;
|
|
||||||
}
|
|
||||||
} // anonymous namespace
|
|
||||||
|
|
||||||
// Return the thread-specific current pool.
|
// Return the thread-specific current pool.
|
||||||
TPoolAllocator& GetThreadPoolAllocator()
|
TPoolAllocator& GetThreadPoolAllocator()
|
||||||
{
|
{
|
||||||
return *(threadPoolAllocator ? threadPoolAllocator : GetDefaultThreadPoolAllocator());
|
return *static_cast<TPoolAllocator*>(OS_GetTLSValue(PoolIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the thread-specific current pool.
|
// Set the thread-specific current pool.
|
||||||
void SetThreadPoolAllocator(TPoolAllocator* poolAllocator)
|
void SetThreadPoolAllocator(TPoolAllocator* poolAllocator)
|
||||||
{
|
{
|
||||||
threadPoolAllocator = poolAllocator;
|
OS_SetTLSValue(PoolIndex, poolAllocator);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process-wide set up of the TLS pool storage.
|
||||||
|
bool InitializePoolIndex()
|
||||||
|
{
|
||||||
|
// Allocate a TLS index.
|
||||||
|
if ((PoolIndex = OS_AllocTLSIndex()) == OS_INVALID_TLS_INDEX)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user