Edit

kc3-lang/angle/util/windows/test_utils_win.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2019-10-20 21:44:36
    Hash : f939cb63
    Message : Revert "Reland "Add more test_utils functions."" This reverts commit 7923e234bc458eda5936b8cb4f09fa19e28c0452. Reason for revert: Fails compilation on rollers: [2097/6048] SOLINK ./lib_angle_unittests__library.cr.so FAILED: lib_angle_unittests__library.cr.so lib_angle_unittests__library.cr.so.TOC lib.unstripped/lib_angle_unittests__library.cr.so python "../../build/toolchain/gcc_solink_wrapper.py" --readelf="../../third_party/android_ndk/toolch...(too long) ld.lld: error: undefined symbol: glCreateShader >>> referenced by shader_utils.cpp >>> angle_util_static/shader_utils.o:(CompileShader(unsigned int, char const*)) in archive obj/third_party/angle/libangle_util_static.a ld.lld: error: undefined symbol: glShaderSource Original change's description: > Reland "Add more test_utils functions." > > This is a reland of 5fcfcea4a9379633a83a67fc1d94938cb31f2a9c > > Re-land uses static linking with angle_util. The root cause > of the CFI error wasn't solved. Static linking works around > the problem by not using any export rules. > > Original change's description: > > Add more test_utils functions. > > > > Includes methods for creating temporary files, deleting files, and > > reading files into a string. Also renames GetPathSeparator to mention > > it's only used for environment variables. Includes a new virtual type > > angle::Process that will be used to implement cross-platform async > > Process launching for tests. Also includes a way to specify a custom > > crash handler callback. > > > > Also adds a few unit tests for the new functionality. They are disabled > > on Android because the functions are not needed by the new test runner. > > > > Bug: angleproject:3162 > > Change-Id: I3e2c2e9837608884c98379fa0f78c9ffbe158d73 > > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1821940 > > Commit-Queue: Jamie Madill <jmadill@chromium.org> > > Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> > > Bug: chromium:1015810 > Bug: angleproject:3162 > Change-Id: I6a2c1e7b585a13ca846759f32da0777c00d7f7e6 > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1869541 > Commit-Queue: Jamie Madill <jmadill@chromium.org> > Reviewed-by: Jamie Madill <jmadill@chromium.org> TBR=ynovikov@chromium.org,jonahr@google.com,jmadill@chromium.org Change-Id: I975b2214411906cb981bffa04fa50e0a65ff8b4e No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: chromium:1015810, angleproject:3162 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1870811 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • util/windows/test_utils_win.cpp
  • //
    // Copyright 2014 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // test_utils_win.cpp: Implementation of OS-specific functions for Windows
    
    #include "util/test_utils.h"
    
    #include <stdarg.h>
    #include <windows.h>
    #include <array>
    
    #include "common/angleutils.h"
    #include "util/windows/third_party/StackWalker/src/StackWalker.h"
    
    namespace angle
    {
    namespace
    {
    static const struct
    {
        const char *name;
        const DWORD code;
    } kExceptions[] = {
    #define _(E)  \
        {         \
    #        E, E \
        }
        _(EXCEPTION_ACCESS_VIOLATION),
        _(EXCEPTION_BREAKPOINT),
        _(EXCEPTION_INT_DIVIDE_BY_ZERO),
        _(EXCEPTION_STACK_OVERFLOW),
    #undef _
    };
    
    class CustomStackWalker : public StackWalker
    {
      public:
        CustomStackWalker() {}
        ~CustomStackWalker() {}
    
        void OnCallstackEntry(CallstackEntryType eType, CallstackEntry &entry) override
        {
            char buffer[STACKWALK_MAX_NAMELEN];
            size_t maxLen = _TRUNCATE;
            if ((eType != lastEntry) && (entry.offset != 0))
            {
                if (entry.name[0] == 0)
                    strncpy_s(entry.name, STACKWALK_MAX_NAMELEN, "(function-name not available)",
                              _TRUNCATE);
                if (entry.undName[0] != 0)
                    strncpy_s(entry.name, STACKWALK_MAX_NAMELEN, entry.undName, _TRUNCATE);
                if (entry.undFullName[0] != 0)
                    strncpy_s(entry.name, STACKWALK_MAX_NAMELEN, entry.undFullName, _TRUNCATE);
                if (entry.lineFileName[0] == 0)
                {
                    strncpy_s(entry.lineFileName, STACKWALK_MAX_NAMELEN, "(filename not available)",
                              _TRUNCATE);
                    if (entry.moduleName[0] == 0)
                        strncpy_s(entry.moduleName, STACKWALK_MAX_NAMELEN,
                                  "(module-name not available)", _TRUNCATE);
                    _snprintf_s(buffer, maxLen, "    %s - %p (%s): %s\n", entry.name,
                                reinterpret_cast<void *>(entry.offset), entry.moduleName,
                                entry.lineFileName);
                }
                else
                    _snprintf_s(buffer, maxLen, "    %s (%s:%d)\n", entry.name, entry.lineFileName,
                                entry.lineNumber);
                buffer[STACKWALK_MAX_NAMELEN - 1] = 0;
                printf("%s", buffer);
                OutputDebugStringA(buffer);
            }
        }
    };
    
    void PrintBacktrace(CONTEXT *c)
    {
        printf("Backtrace:\n");
        OutputDebugStringA("Backtrace:\n");
    
        CustomStackWalker sw;
        sw.ShowCallstack(GetCurrentThread(), c);
    }
    
    LONG WINAPI StackTraceCrashHandler(EXCEPTION_POINTERS *e)
    {
        const DWORD code = e->ExceptionRecord->ExceptionCode;
        printf("\nCaught exception %lu", code);
        for (size_t i = 0; i < ArraySize(kExceptions); i++)
        {
            if (kExceptions[i].code == code)
            {
                printf(" %s", kExceptions[i].name);
            }
        }
        printf("\n");
    
        PrintBacktrace(e->ContextRecord);
    
        // Exit NOW.  Don't notify other threads, don't call anything registered with atexit().
        _exit(1);
    
        // The compiler wants us to return something.  This is what we'd do if we didn't _exit().
        return EXCEPTION_EXECUTE_HANDLER;
    }
    }  // anonymous namespace
    
    void Sleep(unsigned int milliseconds)
    {
        ::Sleep(static_cast<DWORD>(milliseconds));
    }
    
    void WriteDebugMessage(const char *format, ...)
    {
        va_list args;
        va_start(args, format);
        int size = vsnprintf(nullptr, 0, format, args);
        va_end(args);
    
        std::vector<char> buffer(size + 2);
        va_start(args, format);
        vsnprintf(buffer.data(), size + 1, format, args);
        va_end(args);
    
        OutputDebugStringA(buffer.data());
    }
    
    void InitCrashHandler()
    {
        SetUnhandledExceptionFilter(StackTraceCrashHandler);
    }
    
    void TerminateCrashHandler()
    {
        SetUnhandledExceptionFilter(nullptr);
    }
    
    void PrintStackBacktrace()
    {
        CONTEXT context;
        ZeroMemory(&context, sizeof(CONTEXT));
        RtlCaptureContext(&context);
        PrintBacktrace(&context);
    }
    }  // namespace angle