CMake build: Only export explicit symbols on macOS

Both windows and linux do this already using .def files and linker scripts, respectfully.
Mac's linker has the exported_symbols_list flag that acts similarly.

This is required as the SPIRV-Tools in dEQP now collides with the version in SwiftShader, leading to horribly cryptic crashes deep in SPIRV structures.

Change-Id: I3641744ae2439bf05468b6f10cf3da0307614534
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/32568
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 06b2c33..23710c5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -200,6 +200,15 @@
 macro(set_shared_library_export_map TARGET DIR)
     if(MSVC)
         set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " /DEF:\"${DIR}/${TARGET}.def\"")
+    elseif(APPLE)
+        # The exported symbols list only exports the API functions and
+        # hides all the others.
+        set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS "-exported_symbols_list ${DIR}/${TARGET}.exports")
+        set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_DEPENDS "${DIR}/${TARGET}.exports;")
+        # Don't allow undefined symbols, unless it's a Sanitizer build.
+        if(NOT MSAN AND NOT ASAN AND NOT TSAN AND NOT UBSAN)
+            set_property(TARGET ${TARGET} APPEND_STRING PROPERTY LINK_FLAGS " -Wl,-undefined,error")
+        endif()
     elseif(LINUX)
         # The version script only exports the API functions and
         # hides all the others.
diff --git a/src/OpenGL/libEGL/libEGL.exports b/src/OpenGL/libEGL/libEGL.exports
new file mode 100644
index 0000000..9824326
--- /dev/null
+++ b/src/OpenGL/libEGL/libEGL.exports
@@ -0,0 +1,64 @@
+# EGL core functions
+_eglBindAPI
+_eglBindTexImage
+_eglChooseConfig
+_eglClientWaitSync
+_eglCopyBuffers
+_eglCreateContext
+_eglCreateImage
+_eglCreatePbufferFromClientBuffer
+_eglCreatePbufferSurface
+_eglCreatePixmapSurface
+_eglCreatePlatformPixmapSurface
+_eglCreatePlatformWindowSurface
+_eglCreateSync
+_eglCreateWindowSurface
+_eglDestroyContext
+_eglDestroyImage
+_eglDestroySurface
+_eglDestroySync
+_eglGetConfigAttrib
+_eglGetConfigs
+_eglGetCurrentContext
+_eglGetCurrentDisplay
+_eglGetCurrentSurface
+_eglGetDisplay
+_eglGetError
+_eglGetPlatformDisplay
+_eglGetProcAddress
+_eglGetSyncAttrib
+_eglInitialize
+_eglMakeCurrent
+_eglQueryAPI
+_eglQueryContext
+_eglQueryString
+_eglQuerySurface
+_eglReleaseTexImage
+_eglReleaseThread
+_eglSurfaceAttrib
+_eglSwapBuffers
+_eglSwapInterval
+_eglTerminate
+_eglWaitClient
+_eglWaitGL
+_eglWaitNative
+_eglWaitSync
+
+# Extensions
+_eglCreateImageKHR
+_eglDestroyImageKHR
+_eglGetPlatformDisplayEXT
+_eglCreatePlatformWindowSurfaceEXT
+_eglCreatePlatformPixmapSurfaceEXT
+_eglCreateSyncKHR
+_eglDestroySyncKHR
+_eglClientWaitSyncKHR
+_eglGetSyncAttribKHR
+
+# Table of function pointers to disambiguate between libraries
+_libEGL_swiftshader
+
+# Type-strings and type-infos required by sanitizers
+_ZTS*
+_ZTI*
+
diff --git a/src/OpenGL/libGLES_CM/libGLES_CM.exports b/src/OpenGL/libGLES_CM/libGLES_CM.exports
new file mode 100644
index 0000000..b6068b6
--- /dev/null
+++ b/src/OpenGL/libGLES_CM/libGLES_CM.exports
@@ -0,0 +1,212 @@
+_eglBindAPI
+_eglBindTexImage
+_eglChooseConfig
+_eglCopyBuffers
+_eglCreateContext
+_eglCreatePbufferSurface
+_eglCreatePixmapSurface
+_eglCreateWindowSurface
+_eglDestroyContext
+_eglDestroySurface
+_eglGetConfigAttrib
+_eglGetConfigs
+_eglGetCurrentContext
+_eglGetCurrentDisplay
+_eglGetCurrentSurface
+_eglGetDisplay
+_eglGetError
+_eglGetProcAddress
+_eglInitialize
+_eglMakeCurrent
+_eglQueryContext
+_eglQueryString
+_eglQuerySurface
+_eglReleaseTexImage
+_eglSurfaceAttrib
+_eglSwapBuffers
+_eglSwapInterval
+_eglTerminate
+_eglWaitGL
+_eglWaitNative
+_glActiveTexture
+_glAlphaFunc
+_glAlphaFuncx
+_glBindBuffer
+_glBindTexture
+_glBlendFunc
+_glBufferData
+_glBufferSubData
+_glClear
+_glClearColor
+_glClearColorx
+_glClearDepthf
+_glClearDepthx
+_glClearStencil
+_glClientActiveTexture
+_glClipPlanef
+_glClipPlanex
+_glColor4f
+_glColor4ub
+_glColor4x
+_glColorMask
+_glColorPointer
+_glCompressedTexImage2D
+_glCompressedTexSubImage2D
+_glCopyTexImage2D
+_glCopyTexSubImage2D
+_glCullFace
+_glDeleteBuffers
+_glDeleteTextures
+_glDepthFunc
+_glDepthMask
+_glDepthRangef
+_glDepthRangex
+_glDisable
+_glDisableClientState
+_glDrawArrays
+_glDrawElements
+_glEnable
+_glEnableClientState
+_glFinish
+_glFlush
+_glFogf
+_glFogfv
+_glFogx
+_glFogxv
+_glFrontFace
+_glFrustumf
+_glFrustumx
+_glGenBuffers
+_glGenTextures
+_glGetBooleanv
+_glGetBufferParameteriv
+_glGetClipPlanef
+_glGetClipPlanex
+_glGetError
+_glGetFixedv
+_glGetFloatv
+_glGetIntegerv
+_glGetLightfv
+_glGetLightxv
+_glGetMaterialfv
+_glGetMaterialxv
+_glGetPointerv
+_glGetString
+_glGetTexEnvfv
+_glGetTexEnviv
+_glGetTexEnvxv
+_glGetTexParameterfv
+_glGetTexParameteriv
+_glGetTexParameterxv
+_glHint
+_glIsBuffer
+_glIsEnabled
+_glIsTexture
+_glLightModelf
+_glLightModelfv
+_glLightModelx
+_glLightModelxv
+_glLightf
+_glLightfv
+_glLightx
+_glLightxv
+_glLineWidth
+_glLineWidthx
+_glLoadIdentity
+_glLoadMatrixf
+_glLoadMatrixx
+_glLogicOp
+_glMaterialf
+_glMaterialfv
+_glMaterialx
+_glMaterialxv
+_glMatrixMode
+_glMultMatrixf
+_glMultMatrixx
+_glMultiTexCoord4f
+_glMultiTexCoord4x
+_glNormal3f
+_glNormal3x
+_glNormalPointer
+_glOrthof
+_glOrthox
+_glPixelStorei
+_glPointParameterf
+_glPointParameterfv
+_glPointParameterx
+_glPointParameterxv
+_glPointSize
+_glPointSizex
+_glPolygonOffset
+_glPolygonOffsetx
+_glPopMatrix
+_glPushMatrix
+_glReadPixels
+_glRotatef
+_glRotatex
+_glSampleCoverage
+_glSampleCoveragex
+_glScalef
+_glScalex
+_glScissor
+_glShadeModel
+_glStencilFunc
+_glStencilMask
+_glStencilOp
+_glTexCoordPointer
+_glTexEnvf
+_glTexEnvfv
+_glTexEnvi
+_glTexEnviv
+_glTexEnvx
+_glTexEnvxv
+_glTexImage2D
+_glTexParameterf
+_glTexParameterfv
+_glTexParameteri
+_glTexParameteriv
+_glTexParameterx
+_glTexParameterxv
+_glTexSubImage2D
+_glTranslatef
+_glTranslatex
+_glVertexPointer
+_glViewport
+
+# Extensions
+_glPointSizePointerOES
+_glEGLImageTargetTexture2DOES
+_glEGLImageTargetRenderbufferStorageOES
+_glIsRenderbufferOES
+_glBindRenderbufferOES
+_glDeleteRenderbuffersOES
+_glGenRenderbuffersOES
+_glRenderbufferStorageOES
+_glGetRenderbufferParameterivOES
+_glIsFramebufferOES
+_glBindFramebufferOES
+_glDeleteFramebuffersOES
+_glGenFramebuffersOES
+_glCheckFramebufferStatusOES
+_glFramebufferRenderbufferOES
+_glFramebufferTexture2DOES
+_glGetFramebufferAttachmentParameterivOES
+_glGenerateMipmapOES
+_glBlendEquationOES
+_glBlendEquationSeparateOES
+_glBlendFuncSeparateOES
+_glDrawTexsOES
+_glDrawTexiOES
+_glDrawTexxOES
+_glDrawTexsvOES
+_glDrawTexivOES
+_glDrawTexxvOES
+_glDrawTexfOES
+_glDrawTexfvOES
+_eglCreateSyncKHR
+_eglDestroySyncKHR
+_eglClientWaitSyncKHR
+_eglGetSyncAttribKHR
+
+_libGLES_CM_swiftshader
+
diff --git a/src/OpenGL/libGLESv2/libGLESv2.exports b/src/OpenGL/libGLESv2/libGLESv2.exports
new file mode 100644
index 0000000..8dfb1ca
--- /dev/null
+++ b/src/OpenGL/libGLESv2/libGLESv2.exports
@@ -0,0 +1,302 @@
+
+# OpenGL ES 2.0 core functions
+_glActiveTexture
+_glAttachShader
+_glBindAttribLocation
+_glBindBuffer
+_glBindFramebuffer
+_glBindRenderbuffer
+_glBindTexture
+_glBlendColor
+_glBlendEquation
+_glBlendEquationSeparate
+_glBlendFunc
+_glBlendFuncSeparate
+_glBufferData
+_glBufferSubData
+_glCheckFramebufferStatus
+_glClear
+_glClearColor
+_glClearDepthf
+_glClearStencil
+_glColorMask
+_glCompileShader
+_glCompressedTexImage2D
+_glCompressedTexSubImage2D
+_glCopyTexImage2D
+_glCopyTexSubImage2D
+_glCreateProgram
+_glCreateShader
+_glCullFace
+_glDeleteBuffers
+_glDeleteFramebuffers
+_glDeleteProgram
+_glDeleteRenderbuffers
+_glDeleteShader
+_glDeleteTextures
+_glDepthFunc
+_glDepthMask
+_glDepthRangef
+_glDetachShader
+_glDisable
+_glDisableVertexAttribArray
+_glDrawArrays
+_glDrawElements
+_glEnable
+_glEnableVertexAttribArray
+_glFinish
+_glFlush
+_glFramebufferRenderbuffer
+_glFramebufferTexture2D
+_glFrontFace
+_glGenBuffers
+_glGenFramebuffers
+_glGenRenderbuffers
+_glGenTextures
+_glGenerateMipmap
+_glGetActiveAttrib
+_glGetActiveUniform
+_glGetAttachedShaders
+_glGetAttribLocation
+_glGetBooleanv
+_glGetBufferParameteriv
+_glGetError
+_glGetFloatv
+_glGetFramebufferAttachmentParameteriv
+_glGetIntegerv
+_glGetProgramInfoLog
+_glGetProgramiv
+_glGetRenderbufferParameteriv
+_glGetShaderInfoLog
+_glGetShaderPrecisionFormat
+_glGetShaderSource
+_glGetShaderiv
+_glGetString
+_glGetTexParameterfv
+_glGetTexParameteriv
+_glGetUniformLocation
+_glGetUniformfv
+_glGetUniformiv
+_glGetVertexAttribPointerv
+_glGetVertexAttribfv
+_glGetVertexAttribiv
+_glHint
+_glIsBuffer
+_glIsEnabled
+_glIsFramebuffer
+_glIsProgram
+_glIsRenderbuffer
+_glIsShader
+_glIsTexture
+_glLineWidth
+_glLinkProgram
+_glPixelStorei
+_glPolygonOffset
+_glReadPixels
+_glReleaseShaderCompiler
+_glRenderbufferStorage
+_glSampleCoverage
+_glScissor
+_glShaderBinary
+_glShaderSource
+_glStencilFunc
+_glStencilFuncSeparate
+_glStencilMask
+_glStencilMaskSeparate
+_glStencilOp
+_glStencilOpSeparate
+_glTexImage2D
+_glTexParameterf
+_glTexParameterfv
+_glTexParameteri
+_glTexParameteriv
+_glTexSubImage2D
+_glUniform1f
+_glUniform1fv
+_glUniform1i
+_glUniform1iv
+_glUniform2f
+_glUniform2fv
+_glUniform2i
+_glUniform2iv
+_glUniform3f
+_glUniform3fv
+_glUniform3i
+_glUniform3iv
+_glUniform4f
+_glUniform4fv
+_glUniform4i
+_glUniform4iv
+_glUniformMatrix2fv
+_glUniformMatrix3fv
+_glUniformMatrix4fv
+_glUseProgram
+_glValidateProgram
+_glVertexAttrib1f
+_glVertexAttrib1fv
+_glVertexAttrib2f
+_glVertexAttrib2fv
+_glVertexAttrib3f
+_glVertexAttrib3fv
+_glVertexAttrib4f
+_glVertexAttrib4fv
+_glVertexAttribPointer
+_glViewport
+
+# OpenGL ES 3.0 core functions
+_glReadBuffer
+_glDrawRangeElements
+_glTexImage3D
+_glTexSubImage3D
+_glCopyTexSubImage3D
+_glCompressedTexImage3D
+_glCompressedTexSubImage3D
+_glGenQueries
+_glDeleteQueries
+_glIsQuery
+_glBeginQuery
+_glEndQuery
+_glGetQueryiv
+_glGetQueryObjectuiv
+_glUnmapBuffer
+_glGetBufferPointerv
+_glDrawBuffers
+_glUniformMatrix2x3fv
+_glUniformMatrix3x2fv
+_glUniformMatrix2x4fv
+_glUniformMatrix4x2fv
+_glUniformMatrix3x4fv
+_glUniformMatrix4x3fv
+_glBlitFramebuffer
+_glRenderbufferStorageMultisample
+_glFramebufferTextureLayer
+_glMapBufferRange
+_glFlushMappedBufferRange
+_glBindVertexArray
+_glDeleteVertexArrays
+_glGenVertexArrays
+_glIsVertexArray
+_glGetIntegeri_v
+_glBeginTransformFeedback
+_glEndTransformFeedback
+_glBindBufferRange
+_glBindBufferBase
+_glTransformFeedbackVaryings
+_glGetTransformFeedbackVarying
+_glVertexAttribIPointer
+_glGetVertexAttribIiv
+_glGetVertexAttribIuiv
+_glVertexAttribI4i
+_glVertexAttribI4ui
+_glVertexAttribI4iv
+_glVertexAttribI4uiv
+_glGetUniformuiv
+_glGetFragDataLocation
+_glUniform1ui
+_glUniform2ui
+_glUniform3ui
+_glUniform4ui
+_glUniform1uiv
+_glUniform2uiv
+_glUniform3uiv
+_glUniform4uiv
+_glClearBufferiv
+_glClearBufferuiv
+_glClearBufferfv
+_glClearBufferfi
+_glGetStringi
+_glCopyBufferSubData
+_glGetUniformIndices
+_glGetActiveUniformsiv
+_glGetUniformBlockIndex
+_glGetActiveUniformBlockiv
+_glGetActiveUniformBlockName
+_glUniformBlockBinding
+_glDrawArraysInstanced
+_glDrawElementsInstanced
+_glFenceSync
+_glIsSync
+_glDeleteSync
+_glClientWaitSync
+_glWaitSync
+_glGetInteger64v
+_glGetSynciv
+_glGetInteger64i_v
+_glGetBufferParameteri64v
+_glGenSamplers
+_glDeleteSamplers
+_glIsSampler
+_glBindSampler
+_glSamplerParameteri
+_glSamplerParameteriv
+_glSamplerParameterf
+_glSamplerParameterfv
+_glGetSamplerParameteriv
+_glGetSamplerParameterfv
+_glVertexAttribDivisor
+_glBindTransformFeedback
+_glDeleteTransformFeedbacks
+_glGenTransformFeedbacks
+_glIsTransformFeedback
+_glPauseTransformFeedback
+_glResumeTransformFeedback
+_glGetProgramBinary
+_glProgramBinary
+_glProgramParameteri
+_glInvalidateFramebuffer
+_glInvalidateSubFramebuffer
+_glTexStorage2D
+_glTexStorage3D
+_glGetInternalformativ
+
+# Extensions
+_glTexImage3DOES
+_glBlitFramebufferANGLE
+_glRenderbufferStorageMultisampleANGLE
+_glDeleteFencesNV
+_glFinishFenceNV
+_glGenFencesNV
+_glGetFenceivNV
+_glIsFenceNV
+_glSetFenceNV
+_glTestFenceNV
+_glGetGraphicsResetStatusEXT
+_glReadnPixelsEXT
+_glGetnUniformfvEXT
+_glGetnUniformivEXT
+_glGenQueriesEXT
+_glDeleteQueriesEXT
+_glIsQueryEXT
+_glBeginQueryEXT
+_glEndQueryEXT
+_glGetQueryivEXT
+_glGetQueryObjectuivEXT
+_glEGLImageTargetTexture2DOES
+_glEGLImageTargetRenderbufferStorageOES
+_glIsRenderbufferOES
+_glBindRenderbufferOES
+_glDeleteRenderbuffersOES
+_glGenRenderbuffersOES
+_glRenderbufferStorageOES
+_glGetRenderbufferParameterivOES
+_glIsFramebufferOES
+_glBindFramebufferOES
+_glDeleteFramebuffersOES
+_glGenFramebuffersOES
+_glCheckFramebufferStatusOES
+_glFramebufferRenderbufferOES
+_glFramebufferTexture2DOES
+_glGetFramebufferAttachmentParameterivOES
+_glGenerateMipmapOES
+_glDrawBuffersEXT
+_glBindVertexArrayOES
+_glDeleteVertexArraysOES
+_glGenVertexArraysOES
+_glIsVertexArrayOES
+
+# Table of function pointers to disambiguate between libraries
+_libGLESv2_swiftshader
+
+# Type-strings and type-infos required by sanitizers
+_ZTS*
+_ZTI*
diff --git a/src/Vulkan/libvk_swiftshader.exports b/src/Vulkan/libvk_swiftshader.exports
new file mode 100644
index 0000000..d147e8a
--- /dev/null
+++ b/src/Vulkan/libvk_swiftshader.exports
@@ -0,0 +1,12 @@
+_vkGetInstanceProcAddr
+
+# Loader-ICD interface functions
+_vk_icdGetInstanceProcAddr
+_vk_icdNegotiateLoaderICDInterfaceVersion
+
+# Type-strings and type-infos required by sanitizers
+_ZTS*
+_ZTI*
+
+# Android HAL module info object
+#HMI