summaryrefslogtreecommitdiff
path: root/source/compiler-core/slang-artifact-info.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2022-04-27 13:51:30 -0400
committerGitHub <noreply@github.com>2022-04-27 10:51:30 -0700
commit50d5a1021623a89df035a1ef78557e0f1152648d (patch)
tree46b859c764dbc6d27a679b32c025f23ee0baaa74 /source/compiler-core/slang-artifact-info.cpp
parentf9432467cac85eae6f7120cd94208f3a3dd9aa19 (diff)
Split out Artifact info (#2193)
* #include an absolute path didn't work - because paths were taken to always be relative. * Compile to a dxil library. * Added CompileProduct. * Support handling of ModuleLibrary. * CacheBehavior -> Cache * Use CompileProduct for -r references. * CompileProduct -> Artifact. * Determining an artifact type on binding. * Determine binary linkability. * Added Artifact::exists. * Added ArtifactKeep. * Small fixes. * Small improvements to Artifact. * Add zip extension. * Fix some comments. * Fix multiple adding of PublicDecoration. Make public output export for DXIL/lib. Add checking for simpleDecorations such that only added once. * Use 'whole program' to identify library build. * Move slang-artifact into compiler-core. * Split out Keep free functions. * Artifact::Keep -> ArtifactKeep. * Handle libraries as artifacts. * Add -target dxil so test infrastructure knows it needs DXC. * Linking working in DXC. * Improve handling around emit for 'export'. * Add comment around Artifact name. * Render test working with linking. * Improvements around Artifact handling. * Add ArtifactPayloadInfo. * Small tidy up around artifact. * Split out code to get info about Artifacts into artifact-info.cpp/.h * Re-add slang-artifact.cpp * Readd artifact.cpp.
Diffstat (limited to 'source/compiler-core/slang-artifact-info.cpp')
-rw-r--r--source/compiler-core/slang-artifact-info.cpp248
1 files changed, 248 insertions, 0 deletions
diff --git a/source/compiler-core/slang-artifact-info.cpp b/source/compiler-core/slang-artifact-info.cpp
new file mode 100644
index 000000000..6aaf1552c
--- /dev/null
+++ b/source/compiler-core/slang-artifact-info.cpp
@@ -0,0 +1,248 @@
+// slang-artifact-info.cpp
+#include "slang-artifact-info.h"
+
+#include "../core/slang-type-text-util.h"
+#include "../core/slang-io.h"
+
+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::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
+{
+ ArtifactKind kind;
+ UnownedStringSlice ext;
+};
+} // anonymous
+
+#define SLANG_KIND_EXTENSION(kind, ext) \
+ { ArtifactKind::kind, UnownedStringSlice::fromLiteral(ext) },
+
+static const KindExtension g_cpuKindExts[] =
+{
+#if SLANG_WINDOWS_FAMILY
+ SLANG_KIND_EXTENSION(Library, "lib")
+ SLANG_KIND_EXTENSION(ObjectCode, "obj")
+ SLANG_KIND_EXTENSION(Executable, "exe")
+ SLANG_KIND_EXTENSION(SharedLibrary, "dll")
+#else
+ SLANG_KIND_EXTENSION(Library, "a")
+ SLANG_KIND_EXTENSION(ObjectCode, "o")
+ SLANG_KIND_EXTENSION(Executable, "")
+
+#if __CYGWIN__
+ SLANG_KIND_EXTENSION(SharedLibrary, "dll")
+#elif SLANG_APPLE_FAMILY
+ SLANG_KIND_EXTENSION(SharedLibrary, "dylib")
+#else
+ SLANG_KIND_EXTENSION(SharedLibrary, "so")
+#endif
+
+#endif
+};
+
+/* static */bool ArtifactInfoUtil::isKindBinaryLinkable(Kind kind)
+{
+ switch (kind)
+ {
+ case Kind::Library:
+ case Kind::ObjectCode:
+ {
+ return true;
+ }
+ default: break;
+ }
+ return false;
+}
+
+/* static */bool ArtifactInfoUtil::isBinaryLinkable(const ArtifactDesc& desc)
+{
+ return isKindBinaryLinkable(desc.kind) &&
+ getInfo(desc.payload).isSet(ArtifactPayloadInfo::Flag::IsLinkable);
+}
+
+/* static */bool ArtifactInfoUtil::isPayloadCpuBinary(Payload payload)
+{
+ auto info = getInfo(payload);
+ return info.isSet(ArtifactPayloadInfo::Flag::IsCpuNative) && info.flavor == ArtifactPayloadInfo::Flavor::Binary;
+}
+
+/* static */bool ArtifactInfoUtil::isPayloadGpuBinary(Payload payload)
+{
+ auto info = getInfo(payload);
+ return info.isSet(ArtifactPayloadInfo::Flag::IsGpuNative) && info.flavor == ArtifactPayloadInfo::Flavor::Binary;
+}
+
+/* static */UnownedStringSlice ArtifactInfoUtil::getDefaultExtensionForPayload(Payload payload)
+{
+ 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:
+ {
+ return UnownedStringSlice();
+ }
+
+ 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;
+ }
+
+ SLANG_UNEXPECTED("Unknown content type");
+}
+
+/* static */ArtifactDesc ArtifactInfoUtil::getDescFromExtension(const UnownedStringSlice& slice)
+{
+ if (slice == "slang-module" ||
+ slice == "slang-lib")
+ {
+ return ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::SlangIR);
+ }
+
+ for (const auto& kindExt : g_cpuKindExts)
+ {
+ if (slice == kindExt.ext)
+ {
+ // We'll assume it's for the host CPU for now..
+ return ArtifactDesc::make(kindExt.kind, Payload::HostCPU);
+ }
+ }
+
+ const auto target = TypeTextUtil::findCompileTargetFromExtension(slice);
+
+ return ArtifactDesc::makeFromCompileTarget(target);
+}
+
+/* static */ArtifactDesc ArtifactInfoUtil::getDescFromPath(const UnownedStringSlice& slice)
+{
+ auto extension = Path::getPathExt(slice);
+ return getDescFromExtension(extension);
+}
+
+/* static*/ UnownedStringSlice ArtifactInfoUtil::getCpuExtensionForKind(Kind kind)
+{
+ for (const auto& kindExt : g_cpuKindExts)
+ {
+ if (kind == kindExt.kind)
+ {
+ return kindExt.ext;
+ }
+ }
+ return UnownedStringSlice();
+}
+
+UnownedStringSlice ArtifactInfoUtil::getDefaultExtension(const ArtifactDesc& desc)
+{
+ if (ArtifactInfoUtil::isPayloadCpuBinary(desc.payload))
+ {
+ return getCpuExtensionForKind(desc.kind);
+ }
+ else
+ {
+ return getDefaultExtensionForPayload(desc.payload);
+ }
+}
+
+} // namespace Slang