summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-compiler.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-03-28 22:14:33 -0700
committerGitHub <noreply@github.com>2022-03-28 22:14:33 -0700
commit255fd5873f65a6b01d5385c277d55612dc3cc587 (patch)
tree54eda0ae98bc9c1b30ca75e534ca203d8e03f241 /source/slang/slang-compiler.cpp
parent79b81083b75dc0abdbb8184568dbe36d082e04f3 (diff)
Allow slangc to generate exe from .slang file. (#2170)
Diffstat (limited to 'source/slang/slang-compiler.cpp')
-rw-r--r--source/slang/slang-compiler.cpp91
1 files changed, 63 insertions, 28 deletions
diff --git a/source/slang/slang-compiler.cpp b/source/slang/slang-compiler.cpp
index 39d558c01..14912d719 100644
--- a/source/slang/slang-compiler.cpp
+++ b/source/slang/slang-compiler.cpp
@@ -55,7 +55,19 @@ namespace Slang
// !!!!!!!!!!!!!!!!!!!!!! free functions for DiagnosicSink !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val)
+bool isHeterogeneousTarget(CodeGenTarget target)
+{
+ switch (target)
+ {
+ case CodeGenTarget::HostCPPSource:
+ case CodeGenTarget::HostExecutable:
+ return true;
+ default:
+ return false;
+ }
+}
+
+void printDiagnosticArg(StringBuilder& sb, CodeGenTarget val)
{
switch (val)
{
@@ -527,6 +539,7 @@ namespace Slang
case CodeGenTarget::HLSL:
case CodeGenTarget::CUDASource:
case CodeGenTarget::CPPSource:
+ case CodeGenTarget::HostCPPSource:
case CodeGenTarget::CSource:
{
return PassThroughMode::None;
@@ -555,9 +568,9 @@ namespace Slang
{
return PassThroughMode::Glslang;
}
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
+ case CodeGenTarget::HostExecutable:
{
// We need some C/C++ compiler
return PassThroughMode::GenericCCpp;
@@ -973,12 +986,11 @@ namespace Slang
{
switch (target)
{
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
- {
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
return CodeGenTarget::CPPSource;
- }
+ case CodeGenTarget::HostExecutable:
+ return CodeGenTarget::HostCPPSource;
case CodeGenTarget::PTX: return CodeGenTarget::CUDASource;
case CodeGenTarget::DXBytecode: return CodeGenTarget::HLSL;
case CodeGenTarget::DXIL: return CodeGenTarget::HLSL;
@@ -988,6 +1000,17 @@ namespace Slang
return CodeGenTarget::Unknown;
}
+ static bool _isCPUHostTarget(CodeGenTarget target)
+ {
+ switch (target)
+ {
+ case CodeGenTarget::HostCPPSource:
+ case CodeGenTarget::HostExecutable:
+ return true;
+ default:
+ return false;
+ }
+ }
SlangResult emitWithDownstreamForEntryPoints(
ComponentType* program,
@@ -1027,7 +1050,7 @@ namespace Slang
return SLANG_FAIL;
}
}
-
+
SLANG_ASSERT(compilerType != PassThroughMode::None);
// Get the required downstream compiler
@@ -1259,9 +1282,18 @@ namespace Slang
}
// If we aren't using LLVM 'host callable', we want downstream compile to produce a shared library
- if (compilerType != PassThroughMode::LLVM && target == CodeGenTarget::HostCallable)
+ if (compilerType != PassThroughMode::LLVM && target == CodeGenTarget::ShaderHostCallable)
{
- target = CodeGenTarget::SharedLibrary;
+ target = CodeGenTarget::ShaderSharedLibrary;
+ }
+
+ if (!isPassThroughEnabled(endToEndReq))
+ {
+ if (_isCPUHostTarget(target))
+ {
+ options.libraryPaths.add(Path::getParentDirectory(Path::getExecutablePath()));
+ options.libraries.add("slang-rt");
+ }
}
options.targetType = (SlangCompileTarget)target;
@@ -1527,9 +1559,9 @@ namespace Slang
case CodeGenTarget::DXIL:
case CodeGenTarget::DXBytecode:
case CodeGenTarget::PTX:
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
+ case CodeGenTarget::HostExecutable:
{
RefPtr<DownstreamCompileResult> downstreamResult;
@@ -1583,9 +1615,9 @@ namespace Slang
case CodeGenTarget::DXIL:
case CodeGenTarget::DXBytecode:
case CodeGenTarget::PTX:
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
+ case CodeGenTarget::HostExecutable:
{
RefPtr<DownstreamCompileResult> downstreamResult;
@@ -1606,6 +1638,7 @@ namespace Slang
case CodeGenTarget::HLSL:
case CodeGenTarget::CUDASource:
case CodeGenTarget::CPPSource:
+ case CodeGenTarget::HostCPPSource:
case CodeGenTarget::CSource:
{
RefPtr<ExtensionTracker> extensionTracker = _newExtensionTracker(target);
@@ -1796,7 +1829,7 @@ namespace Slang
ComPtr<ISlangBlob> blob;
if (SLANG_FAILED(result.getBlob(blob)))
{
- if (targetReq->getTarget() == CodeGenTarget::HostCallable)
+ if (targetReq->getTarget() == CodeGenTarget::ShaderHostCallable)
{
// Some HostCallable are not directly representable as a 'binary'.
// So here, we just ignore if that appears the case, and don't output an unexpected error.
@@ -1840,9 +1873,9 @@ namespace Slang
case CodeGenTarget::PTX:
// For now we just dump PTX out as hex
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
+ case CodeGenTarget::HostExecutable:
HexDumpUtil::dumpWithMarkers((const uint8_t*)blobData, blobSize, 24, writer);
break;
@@ -2453,11 +2486,12 @@ namespace Slang
case CodeGenTarget::CSource: return ".c";
case CodeGenTarget::CUDASource: return ".cu";
case CodeGenTarget::CPPSource: return ".cpp";
+ case CodeGenTarget::HostCPPSource: return ".cpp";
// What these should be called is target specific, but just use these exts to make clear for now
// for now
- case CodeGenTarget::Executable: return ".exe";
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary: return ".shared-lib";
+ case CodeGenTarget::HostExecutable: return ".exe";
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary: return ".shared-lib";
default: break;
}
return nullptr;
@@ -2475,6 +2509,7 @@ namespace Slang
switch (target)
{
case CodeGenTarget::CPPSource:
+ case CodeGenTarget::HostCPPSource:
case CodeGenTarget::CUDASource:
case CodeGenTarget::CSource:
case CodeGenTarget::DXILAssembly:
@@ -2513,9 +2548,9 @@ namespace Slang
break;
}
- case CodeGenTarget::HostCallable:
- case CodeGenTarget::SharedLibrary:
- case CodeGenTarget::Executable:
+ case CodeGenTarget::ShaderHostCallable:
+ case CodeGenTarget::ShaderSharedLibrary:
+ case CodeGenTarget::HostExecutable:
{
dumpIntermediateBinary(compileRequest, data, size, _getTargetExtension(target));
break;