Prevent LTO from eliminating cross-library virtual methods. libEGL has to call virtual methods on objects created withing libGLESv2, and vice-versa. Clang's aggressive link-time-optimization considers calls to these methods unreachable, because they're not defined within the same linkage unit. So when they do get called, we're hitting UD instructions. It can be fixed by marking these classes with [[clang::lto_visibility_public]] attributes: https://clang.llvm.org/docs/LTOVisibility.html Bug chromium:720933 Change-Id: I87f9b09921a1b2d443121efcdb5525ff4cb5797b Reviewed-on: https://swiftshader-review.googlesource.com/9688 Tested-by: Nicolas Capens <capn@google.com> Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/libGLESv2/BUILD.gn b/src/OpenGL/libGLESv2/BUILD.gn index 46a9bfe..59f4f6d 100644 --- a/src/OpenGL/libGLESv2/BUILD.gn +++ b/src/OpenGL/libGLESv2/BUILD.gn
@@ -25,6 +25,7 @@ cflags = [ "/wd4201", # nameless struct/union "/wd4324", # structure was padded due to alignment specifier + "/wd5030", # attribute is not recognized ] defines += [
diff --git a/src/OpenGL/libGLESv2/Context.h b/src/OpenGL/libGLESv2/Context.h index 3a7431a..a6c6e71 100644 --- a/src/OpenGL/libGLESv2/Context.h +++ b/src/OpenGL/libGLESv2/Context.h
@@ -426,12 +426,12 @@ GLint packSkipImages; }; -class Context : public egl::Context +class [[clang::lto_visibility_public]] Context : public egl::Context { public: Context(egl::Display *display, const Context *shareContext, EGLint clientVersion); - virtual void makeCurrent(egl::Surface *surface); + void makeCurrent(egl::Surface *surface) override; virtual EGLint getClientVersion() const; void markAllStateDirty(); @@ -673,7 +673,7 @@ void clearStencilBuffer(const GLint value); void drawArrays(GLenum mode, GLint first, GLsizei count, GLsizei instanceCount = 1); void drawElements(GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLsizei instanceCount = 1); - void finish(); + void finish() override; void flush(); void recordInvalidEnum(); @@ -690,9 +690,9 @@ GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, bool filter, bool allowPartialDepthStencilBlit); - virtual void bindTexImage(egl::Surface *surface); - virtual EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel); - virtual egl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel); + void bindTexImage(egl::Surface *surface) override; + EGLenum validateSharedImage(EGLenum target, GLuint name, GLuint textureLevel) override; + egl::Image *createSharedImage(EGLenum target, GLuint name, GLuint textureLevel) override; egl::Image *getSharedImage(GLeglImageOES image); Device *getDevice();
diff --git a/src/OpenGL/libGLESv2/libGLESv2.vcxproj b/src/OpenGL/libGLESv2/libGLESv2.vcxproj index 767c43e..5750080 100644 --- a/src/OpenGL/libGLESv2/libGLESv2.vcxproj +++ b/src/OpenGL/libGLESv2/libGLESv2.vcxproj
@@ -135,7 +135,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <BrowseInformation>true</BrowseInformation> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> </ClCompile> <Link> @@ -165,7 +165,7 @@ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <BrowseInformation>true</BrowseInformation> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> </ClCompile> <Link> @@ -202,7 +202,7 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <IntrinsicFunctions>false</IntrinsicFunctions> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> </ClCompile> <Link> @@ -240,7 +240,7 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <IntrinsicFunctions>false</IntrinsicFunctions> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> <MultiProcessorCompilation>true</MultiProcessorCompilation> </ClCompile> <Link> @@ -279,7 +279,7 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <IntrinsicFunctions>false</IntrinsicFunctions> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> </ClCompile> <Link> <AdditionalDependencies>dxguid.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies> @@ -315,7 +315,7 @@ <WholeProgramOptimization>true</WholeProgramOptimization> <IntrinsicFunctions>false</IntrinsicFunctions> <TreatWarningAsError>true</TreatWarningAsError> - <DisableSpecificWarnings>%(DisableSpecificWarnings)</DisableSpecificWarnings> + <DisableSpecificWarnings>5030;%(DisableSpecificWarnings)</DisableSpecificWarnings> </ClCompile> <Link> <AdditionalDependencies>dxguid.lib;WS2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>