1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
// slang-pass-through.h
#pragma once
//
// This file gathers together declarations for utility code
// related to the concept of "pass-through" compilation.
//
// Note that in the Slang codebase there is an unfortunate
// conflation of terminology (and a resulting conflation
// in a lot of the implementation logic) between the cases
// of true *pass-through* compilation and the logic related
// to *downstream* compilers:
//
// * While the Slang compiler is architected to support direct
// generation of binary output code (e.g., there is support
// for emitting SPIR-V directly from Slang IR), many targets
// are supported by first generating intermediate source code
// from Slang IR and then invoking a *downstream* compiler on
// that intermediate source code to produce output binaries.
// This is an important kind of compilation flow that Slang
// was designed to support.
//
// * In contrast, true *pass-through* compilation is a legacy
// feature of `slangc` that exists almost entirely to support
// some of the earliest test cases that were written for the
// compiler. In true pass-through mode, `slangc` skips invoking
// large parts of the Slang compiler (the entire front-end,
// along with all of the back-end up to the point that intermediate
// source code would be generated) and then uses the *input*
// source as if it was the *intermediate* code for the "last mile"
// of code generation (invoking a downstream compiler). This
// feature can and *should* be deprecate and removed, because
// the complexity it creates for the rest of the compiler is
// no longer worth it.
//
// This file may contain a mix of declarations used for one or
// both of the above purposes, just because the terminology used
// in the codebase isn't always precise or clear. Over time the
// declarations here can and should be more clearly partitioned
// so that we can distinguish the essential (downstream compilation)
// parts, and the parts that should eventually get removed (true
// pass-through compilation).
//
#include "../core/slang-string.h"
#include "slang-target.h"
namespace Slang
{
enum class PassThroughMode : SlangPassThroughIntegral
{
None = SLANG_PASS_THROUGH_NONE, ///< don't pass through: use Slang compiler
Fxc = SLANG_PASS_THROUGH_FXC, ///< pass through HLSL to `D3DCompile` API
Dxc = SLANG_PASS_THROUGH_DXC, ///< pass through HLSL to `IDxcCompiler` API
Glslang = SLANG_PASS_THROUGH_GLSLANG, ///< pass through GLSL to `glslang` library
SpirvDis = SLANG_PASS_THROUGH_SPIRV_DIS, ///< pass through spirv-dis
Clang = SLANG_PASS_THROUGH_CLANG, ///< Pass through clang compiler
VisualStudio = SLANG_PASS_THROUGH_VISUAL_STUDIO, ///< Visual studio compiler
Gcc = SLANG_PASS_THROUGH_GCC, ///< Gcc compiler
GenericCCpp = SLANG_PASS_THROUGH_GENERIC_C_CPP, ///< Generic C/C++ compiler
NVRTC = SLANG_PASS_THROUGH_NVRTC, ///< NVRTC CUDA compiler
LLVM = SLANG_PASS_THROUGH_LLVM, ///< LLVM 'compiler'
SpirvOpt = SLANG_PASS_THROUGH_SPIRV_OPT, ///< pass thorugh spirv to spirv-opt
MetalC = SLANG_PASS_THROUGH_METAL,
Tint = SLANG_PASS_THROUGH_TINT, ///< pass through spirv to Tint API
SpirvLink = SLANG_PASS_THROUGH_SPIRV_LINK, ///< pass through spirv to spirv-link
CountOf = SLANG_PASS_THROUGH_COUNT_OF,
};
void printDiagnosticArg(StringBuilder& sb, PassThroughMode val);
/// Given a target returns the required downstream compiler
PassThroughMode getDownstreamCompilerRequiredForTarget(CodeGenTarget target);
/// Given a target returns a downstream compiler the prelude should be taken from.
SourceLanguage getDefaultSourceLanguageForDownstreamCompiler(PassThroughMode compiler);
/* Report an error appearing from external compiler to the diagnostic sink error to the diagnostic
sink.
@param compilerName The name of the compiler the error came for (or nullptr if not known)
@param res Result associated with the error. The error code will be reported. (Can take HRESULT -
and will expand to string if known)
@param diagnostic The diagnostic string associated with the compile failure
@param sink The diagnostic sink to report to */
void reportExternalCompileError(
const char* compilerName,
SlangResult res,
const UnownedStringSlice& diagnostic,
DiagnosticSink* sink);
} // namespace Slang
|