diff options
| author | Tim Foley <tfoley@nvidia.com> | 2017-07-19 09:36:35 -0700 |
|---|---|---|
| committer | Tim Foley <tfoley@nvidia.com> | 2017-07-19 18:15:37 -0700 |
| commit | 3f48e1c0d84bf4909954154ad147559656e87516 (patch) | |
| tree | 0b93a109d51e6565560ad785519a863386490e2a /source/slang/compiler.cpp | |
| parent | a2b8b4c20632d79721052abd232fe2d1bdf2700d (diff) | |
Try to improve handling of failures during compilation
The change is mostly about trying to make sure the compiler "fails safe" when it encounters an internal assumption that isn't met.
Most internal errors will now throw exceptions (yes, exceptions are evil, but this will work for now), and these get caught in `spCompile` so that they don't propagate to the user (they just see a message that compilation aborted due to an internal error).
Subsequent changes are going to need to work on diagnosing as many of these situations as possible, so that users can at least know what construct in their code was unexpected or unhandled by the compiler.
Diffstat (limited to 'source/slang/compiler.cpp')
| -rw-r--r-- | source/slang/compiler.cpp | 63 |
1 files changed, 44 insertions, 19 deletions
diff --git a/source/slang/compiler.cpp b/source/slang/compiler.cpp index 85e78e85b..e16b9dec7 100644 --- a/source/slang/compiler.cpp +++ b/source/slang/compiler.cpp @@ -188,12 +188,21 @@ namespace Slang } #ifdef _WIN32 - void* GetD3DCompilerDLL() + HMODULE loadD3DCompilerDLL(CompileRequest* request) + { + char const* libraryName = "d3dcompiler_47"; + HMODULE d3dCompiler = LoadLibraryA(libraryName); + if (!d3dCompiler) + { + request->mSink.diagnose(CodePosition(), Diagnostics::failedToLoadDynamicLibrary, libraryName); + } + return d3dCompiler; + } + + HMODULE getD3DCompilerDLL(CompileRequest* request) { // TODO(tfoley): let user specify version of d3dcompiler DLL to use. - static HMODULE d3dCompiler = LoadLibraryA("d3dcompiler_47"); - // TODO(tfoley): handle case where we can't find it gracefully - assert(d3dCompiler); + static HMODULE d3dCompiler = loadD3DCompilerDLL(request); return d3dCompiler; } @@ -203,11 +212,13 @@ namespace Slang static pD3DCompile D3DCompile_ = nullptr; if (!D3DCompile_) { - HMODULE d3dCompiler = (HMODULE)GetD3DCompilerDLL(); - assert(d3dCompiler); + HMODULE d3dCompiler = getD3DCompilerDLL(entryPoint->compileRequest); + if (!d3dCompiler) + return List<uint8_t>(); D3DCompile_ = (pD3DCompile)GetProcAddress(d3dCompiler, "D3DCompile"); - assert(D3DCompile_); + if (!D3DCompile_) + return List<uint8_t>(); } auto hlslCode = emitHLSLForEntryPoint(entryPoint); @@ -274,18 +285,20 @@ namespace Slang #endif String dissassembleDXBC( - CompileRequest*, + CompileRequest* compileRequest, void const* data, size_t size) { static pD3DDisassemble D3DDisassemble_ = nullptr; if (!D3DDisassemble_) { - HMODULE d3dCompiler = (HMODULE)GetD3DCompilerDLL(); - assert(d3dCompiler); + HMODULE d3dCompiler = getD3DCompilerDLL(compileRequest); + if (!d3dCompiler) + return String(); D3DDisassemble_ = (pD3DDisassemble)GetProcAddress(d3dCompiler, "D3DDisassemble"); - assert(D3DDisassemble_); + if (!D3DDisassemble_) + return String(); } if (!data || !size) @@ -351,12 +364,21 @@ namespace Slang } #endif - HMODULE getGLSLCompilerDLL() + HMODULE loadGLSLCompilerDLL(CompileRequest* request) { + char const* libraryName = "slang-glslang"; // TODO(tfoley): let user specify version of glslang DLL to use. - static HMODULE glslCompiler = LoadLibraryA("slang-glslang"); - // TODO(tfoley): handle case where we can't find it gracefully - assert(glslCompiler); + HMODULE glslCompiler = LoadLibraryA(libraryName); + if (!glslCompiler) + { + request->mSink.diagnose(CodePosition(), Diagnostics::failedToLoadDynamicLibrary, libraryName); + } + return glslCompiler; + } + + HMODULE getGLSLCompilerDLL(CompileRequest* request) + { + static HMODULE glslCompiler = loadGLSLCompilerDLL(request); return glslCompiler; } @@ -369,11 +391,13 @@ namespace Slang static glslang_CompileFunc glslang_compile = nullptr; if (!glslang_compile) { - HMODULE glslCompiler = getGLSLCompilerDLL(); - assert(glslCompiler); + HMODULE glslCompiler = getGLSLCompilerDLL(slangCompileRequest); + if (!glslCompiler) + return 1; glslang_compile = (glslang_CompileFunc)GetProcAddress(glslCompiler, "glslang_compile"); - assert(glslang_compile); + if (!glslang_compile) + return 1; } String diagnosticOutput; @@ -561,7 +585,8 @@ namespace Slang break; default: - throw "unimplemented"; + SLANG_UNEXPECTED("unhandled code generation target"); + break; } return result; |
