summaryrefslogtreecommitdiffstats
path: root/source/compiler-core/slang-artifact-info.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/compiler-core/slang-artifact-info.cpp')
-rw-r--r--source/compiler-core/slang-artifact-info.cpp326
1 files changed, 190 insertions, 136 deletions
diff --git a/source/compiler-core/slang-artifact-info.cpp b/source/compiler-core/slang-artifact-info.cpp
index b67adb666..f76bf45f0 100644
--- a/source/compiler-core/slang-artifact-info.cpp
+++ b/source/compiler-core/slang-artifact-info.cpp
@@ -6,86 +6,8 @@
namespace Slang {
-static ArtifactPayloadInfo::Lookup _makePayloadInfoLookup()
-{
- ArtifactPayloadInfo::Lookup values;
- memset(&values, 0, sizeof(values));
-
-
- typedef ArtifactPayload Payload;
- typedef ArtifactPayloadInfo::Flag Flag;
- typedef ArtifactPayloadInfo::Flags Flags;
- typedef ArtifactPayloadInfo::Flavor Flavor;
-
- struct Info
- {
- Payload payload;
- Flavor flavor;
- Flags flags;
- };
-
- const Info infos[] =
- {
- {Payload::None, Flavor::None, 0},
- {Payload::Unknown, Flavor::Unknown, 0},
-
- // It seems as if DXBC is potentially linkable from
- // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords#export
-
- // We can't *actually* link PTX or SPIR-V currently but it is in principal possible
- // so let's say we accept for now
-
- {Payload::DXIL, Flavor::Binary, Flag::IsGpuNative | Flag::IsLinkable},
- {Payload::DXBC, Flavor::Binary, Flag::IsGpuNative | Flag::IsLinkable},
- {Payload::SPIRV, Flavor::Binary, Flag::IsGpuNative | Flag::IsLinkable },
- {Payload::PTX, Flavor::Binary, Flag::IsGpuNative | Flag::IsLinkable },
-
- {Payload::DXILAssembly, Flavor::Assembly, 0},
- {Payload::DXBCAssembly, Flavor::Assembly, 0},
- {Payload::SPIRVAssembly, Flavor::Assembly, 0},
- {Payload::PTXAssembly, Flavor::Assembly, 0},
-
- {Payload::HostCPU, Flavor::Binary, Flag::IsCpuNative | Flag::IsLinkable},
-
- // Do we want some other Flavor for these?
- {Payload::SlangIR, Flavor::Binary, Flag::IsLinkable},
- {Payload::LLVMIR, Flavor::Binary, 0},
- {Payload::SlangAST, Flavor::Binary, 0},
-
- {Payload::X86, Flavor::Binary, Flag::IsCpuNative | Flag::IsLinkable},
- {Payload::X86_64, Flavor::Binary, Flag::IsCpuNative | Flag::IsLinkable},
- {Payload::AARCH, Flavor::Binary, Flag::IsCpuNative | Flag::IsLinkable},
- {Payload::AARCH64, Flavor::Binary, Flag::IsCpuNative | Flag::IsLinkable},
-
- {Payload::HLSL, Flavor::Source, 0},
- {Payload::GLSL, Flavor::Source, 0},
- {Payload::CPP, Flavor::Source, 0},
- {Payload::C, Flavor::Source, 0},
- {Payload::CUDA, Flavor::Source, 0},
- {Payload::Slang, Flavor::Source, 0},
-
- {Payload::DebugInfo, Flavor::Unknown, 0},
-
- {Payload::Diagnostics, Flavor::Unknown, 0},
-
- {Payload::Zip, Flavor::Container, 0},
- };
-
- for (auto info : infos)
- {
- auto& v = values.values[Index(info.payload)];
- v.flavor = info.flavor;
- v.flags = info.flags;
- }
-
- return values;
-}
-
-/* static */const ArtifactPayloadInfo::Lookup ArtifactPayloadInfo::Lookup::g_values = _makePayloadInfoLookup();
-
/* !!!!!!!!!!!!!!!!!!!!!!!!!! ArtifactInfoUtil !!!!!!!!!!!!!!!!!!!!!!!!!!!! */
-
namespace { // anonymous
struct KindExtension
{
@@ -95,7 +17,7 @@ struct KindExtension
} // anonymous
#define SLANG_KIND_EXTENSION(kind, ext) \
- { ArtifactKind::kind, UnownedStringSlice::fromLiteral(ext) },
+ { ArtifactKind::kind, toSlice(ext) },
static const KindExtension g_cpuKindExts[] =
{
@@ -120,6 +42,41 @@ static const KindExtension g_cpuKindExts[] =
#endif
};
+/* static */ bool ArtifactInfoUtil::isCpuBinary(const ArtifactDesc& desc)
+{
+ return isDerivedFrom(desc.kind, ArtifactKind::BinaryLike) && isDerivedFrom(desc.payload, ArtifactPayload::CPULike);
+}
+
+/* static */bool ArtifactInfoUtil::isText(const ArtifactDesc& desc)
+{
+ // If it's derived from text...
+ if (isDerivedFrom(desc.kind, ArtifactKind::Text))
+ {
+ return true;
+ }
+
+ // Special case PTX...
+ if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike))
+ {
+ return desc.payload == ArtifactPayload::PTX;
+ }
+
+ // Not text
+ return false;
+}
+
+/* static */bool ArtifactInfoUtil::isGpuUsable(const ArtifactDesc& desc)
+{
+ if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike))
+ {
+ return isDerivedFrom(desc.payload, ArtifactPayload::KernelLike);
+ }
+
+ // PTX is a kind of special case, it's an 'assembly' (low level text represention) that can be passed
+ // to CUDA runtime
+ return desc.kind == ArtifactKind::Assembly && desc.payload == ArtifactPayload::PTX;
+}
+
/* static */bool ArtifactInfoUtil::isKindBinaryLinkable(Kind kind)
{
switch (kind)
@@ -134,71 +91,53 @@ static const KindExtension g_cpuKindExts[] =
return false;
}
-/* static */bool ArtifactInfoUtil::isBinaryLinkable(const ArtifactDesc& desc)
+/* static */bool ArtifactInfoUtil::isLinkable(const ArtifactDesc& desc)
{
- return isKindBinaryLinkable(desc.kind) &&
- getInfo(desc.payload).isSet(ArtifactPayloadInfo::Flag::IsLinkable);
-}
+ if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike))
+ {
+ if (isDerivedFrom(desc.payload, ArtifactPayload::KernelLike))
+ {
+ // It seems as if DXBC is potentially linkable from
+ // https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-appendix-keywords#export
-/* static */bool ArtifactInfoUtil::isPayloadCpuBinary(Payload payload)
-{
- auto info = getInfo(payload);
- return info.isSet(ArtifactPayloadInfo::Flag::IsCpuNative) && info.flavor == ArtifactPayloadInfo::Flavor::Binary;
-}
+ // We can't *actually* link PTX or SPIR-V currently but it is in principal possible
+ // so let's say we accept for now
-/* static */bool ArtifactInfoUtil::isPayloadGpuBinary(Payload payload)
-{
- auto info = getInfo(payload);
- return info.isSet(ArtifactPayloadInfo::Flag::IsGpuNative) && info.flavor == ArtifactPayloadInfo::Flavor::Binary;
-}
+ return true;
+ }
+ else if (isDerivedFrom(desc.payload, ArtifactPayload::CPULike))
+ {
+ // If kind is exe or shared library, linking will arguably not work
+ if (desc.kind == ArtifactKind::SharedLibrary ||
+ desc.kind == ArtifactKind::Executable)
+ {
+ return false;
+ }
-/* static */bool ArtifactInfoUtil::isPayloadCpuTarget(Payload payload)
-{
- return isPayloadCpuBinary(payload) ||
- (payload == Payload::C || payload == Payload::CPP);
+ return true;
+ }
+ else if (isDerivedFrom(desc.payload, ArtifactPayload::GeneralIR))
+ {
+ // We'll *assume* IR is linkable
+ return true;
+ }
+ }
+ return false;
}
-/* static */UnownedStringSlice ArtifactInfoUtil::getDefaultExtensionForPayload(Payload payload)
+/* static */bool ArtifactInfoUtil::isCpuLikeTarget(const ArtifactDesc& desc)
{
- switch (payload)
- {
- case Payload::None: return UnownedStringSlice();
- case Payload::Unknown: return UnownedStringSlice::fromLiteral("unknown");
-
- case Payload::DXIL: return UnownedStringSlice::fromLiteral("dxil");
- case Payload::DXBC: return UnownedStringSlice::fromLiteral("dxbc");
- case Payload::SPIRV: return UnownedStringSlice::fromLiteral("spirv");
-
- case Payload::PTX: return UnownedStringSlice::fromLiteral("ptx");
-
- case Payload::X86:
- case Payload::X86_64:
- case Payload::AARCH:
- case Payload::AARCH64:
- case Payload::HostCPU:
+ if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike))
{
- return UnownedStringSlice();
+ return isDerivedFrom(desc.payload, ArtifactPayload::CPULike);
}
-
- case Payload::SlangIR: return UnownedStringSlice::fromLiteral("slang-ir");
- case Payload::LLVMIR: return UnownedStringSlice::fromLiteral("llvm-ir");
-
- case Payload::HLSL: return UnownedStringSlice::fromLiteral("hlsl");
- case Payload::GLSL: return UnownedStringSlice::fromLiteral("glsl");
-
- case Payload::CPP: return UnownedStringSlice::fromLiteral("cpp");
- case Payload::C: return UnownedStringSlice::fromLiteral("c");
-
- case Payload::CUDA: return UnownedStringSlice::fromLiteral("cu");
-
- case Payload::Slang: return UnownedStringSlice::fromLiteral("slang");
-
- case Payload::Zip: return UnownedStringSlice::fromLiteral("zip");
-
- default: break;
+ else if (isDerivedFrom(desc.kind, ArtifactKind::Source))
+ {
+ // We'll assume C/C++ are targetting CPU, although that is perhaps somewhat arguable.
+ return desc.payload == Payload::C || desc.payload == Payload::Cpp;
}
- SLANG_UNEXPECTED("Unknown content type");
+ return false;
}
/* static */ArtifactDesc ArtifactInfoUtil::getDescFromExtension(const UnownedStringSlice& slice)
@@ -209,6 +148,32 @@ static const KindExtension g_cpuKindExts[] =
return ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::SlangIR);
}
+ // Metal
+ // https://developer.apple.com/documentation/metal/shader_libraries/building_a_library_with_metal_s_command-line_tools
+ if (slice == toSlice("air"))
+ {
+ return ArtifactDesc::make(ArtifactKind::ObjectCode, ArtifactPayload::MetalAIR);
+ }
+ else if (slice == toSlice("metallib") || slice == toSlice("metalar"))
+ {
+ return ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::MetalAIR);
+ }
+
+ if (slice == toSlice("zip"))
+ {
+ return ArtifactDesc::make(ArtifactKind::Zip, ArtifactPayload::Unknown);
+ }
+ else if (slice == toSlice("riff"))
+ {
+ return ArtifactDesc::make(ArtifactKind::Riff, ArtifactPayload::Unknown);
+ }
+
+ if (slice == toSlice("asm"))
+ {
+ // We'll assume asm means current CPU assembler..
+ return ArtifactDesc::make(ArtifactKind::Assembly, ArtifactPayload::HostCPU);
+ }
+
for (const auto& kindExt : g_cpuKindExts)
{
if (slice == kindExt.ext)
@@ -241,16 +206,105 @@ static const KindExtension g_cpuKindExts[] =
return UnownedStringSlice();
}
+UnownedStringSlice ArtifactInfoUtil::getAssemblyExtensionForPayload(ArtifactPayload payload)
+{
+ switch (payload)
+ {
+ case ArtifactPayload::DXIL: return toSlice("dxil-asm");
+ case ArtifactPayload::DXBC: return toSlice("dxbc-asm");
+ case ArtifactPayload::SPIRV: return toSlice("spv-asm");
+ case ArtifactPayload::PTX: return toSlice("ptx");
+
+ // TODO(JS):
+ // Not sure what to do for metal - does it have an assembly name?
+
+ default: break;
+ }
+
+ // We'll just use asm for all CPU assembly type
+ if (isDerivedFrom(payload, ArtifactPayload::CPULike))
+ {
+ return toSlice("asm");
+ }
+
+ if (isDerivedFrom(payload, ArtifactPayload::GeneralIR))
+ {
+ switch (payload)
+ {
+ case ArtifactPayload::SlangIR: return toSlice("slang-ir-asm");
+ case ArtifactPayload::LLVMIR: return toSlice("llvm-ir-asm");
+ break;
+ }
+ }
+
+ return UnownedStringSlice();
+}
+
UnownedStringSlice ArtifactInfoUtil::getDefaultExtension(const ArtifactDesc& desc)
{
- if (ArtifactInfoUtil::isPayloadCpuBinary(desc.payload))
+ switch (desc.kind)
+ {
+ case ArtifactKind::Zip: return toSlice("zip");
+ case ArtifactKind::Riff: return toSlice("riff");
+ case ArtifactKind::Assembly:
+ {
+ return getAssemblyExtensionForPayload(desc.payload);
+ }
+ case ArtifactKind::Source:
+ {
+ switch (desc.payload)
+ {
+ case Payload::HLSL: return toSlice("hlsl");
+ case Payload::GLSL: return toSlice("glsl");
+
+ case Payload::Cpp: return toSlice("cpp");
+ case Payload::C: return toSlice("c");
+
+ case Payload::Metal: return toSlice("metal");
+
+ case Payload::CUDA: return toSlice("cu");
+
+ case Payload::Slang: return toSlice("slang");
+ default: break;
+ }
+ }
+ default: break;
+ }
+
+ if (ArtifactInfoUtil::isCpuLikeTarget(desc))
{
return getCpuExtensionForKind(desc.kind);
}
- else
+
+ if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike))
{
- return getDefaultExtensionForPayload(desc.payload);
+ switch (desc.payload)
+ {
+ case Payload::None: return UnownedStringSlice();
+ case Payload::Unknown: return toSlice("unknown");
+
+ case Payload::DXIL: return toSlice("dxil");
+ case Payload::DXBC: return toSlice("dxbc");
+ case Payload::SPIRV: return toSlice("spv");
+
+ case Payload::PTX: return toSlice("ptx");
+
+ case Payload::LLVMIR: return toSlice("llvm-ir");
+
+ case Payload::SlangIR:
+ {
+ return (desc.kind == ArtifactKind::Library) ? toSlice("slang-module") : toSlice("slang-ir");
+ }
+ case Payload::MetalAIR:
+ {
+ // https://developer.apple.com/documentation/metal/shader_libraries/building_a_library_with_metal_s_command-line_tools
+ return (desc.kind == ArtifactKind::Library) ? toSlice("metallib") : toSlice("air");
+ }
+ default: break;
+ }
}
+
+ return UnownedStringSlice();
}
/* static */String ArtifactInfoUtil::getBaseNameFromPath(const ArtifactDesc& desc, const UnownedStringSlice& path)