diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2022-08-09 11:23:40 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-09 11:23:40 -0400 |
| commit | 9df7fcb023bd5a22f35ecd609b7a50cc6634976c (patch) | |
| tree | 69692c36e664eafa2a37b5fa13ca7142f62b1844 /source/compiler-core/slang-artifact-info.cpp | |
| parent | c0733be56dc24ef0eb67b26fe0c49d3419e75773 (diff) | |
Artifact split interface and implementation (#2349)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP with hierarchical enums.
* Some small fixes and improvements around artifact desc related types.
* Improvements around hierarchical enum.
* Fixes to get Artifact types refactor to be able to execute tests.
* Attempt to better categorize PTX.
* Work around for potentially unused function warning.
* Typo fix.
* Simplify Artifact header.
* Small improvements around Artifact kind/payload/style.
* Added IDestroyable/ICastable
* Add IArtifactList.
* First impl of IArtifactUtil.
* Use the ICastable interface for IArtifactRepresentation.
* Added IArtifactRepresentation & IArtifactAssociated.
* Add SLANG_OVERRIDE to avoid gcc/clang warning.
* Fix calling convention issue on win32.
* Fix missing SLANG_OVERRIDE.
* First attempt at file abstraction around Artifact.
* Added creation of lock file.
* Move functionality for determining file paths to the IArtifactUtil.
Add casting to ICastable.
* Added some casting/finding mechanisms.
* Simplify IArtifact interface, and use Items for file reps.
* Fix problem with libraries on DXIL.
* Split out ArtifactRepresentation.
* Move ArtifactDesc functionality to ArtifactDescUtil. ArtifactInfoUtil becomes ArtifactDescUtil.
* Split implementations from the interfaces for Artifact.
* Use TypeTextUtil for target name outputting.
* Add artifact impls.
Diffstat (limited to 'source/compiler-core/slang-artifact-info.cpp')
| -rw-r--r-- | source/compiler-core/slang-artifact-info.cpp | 421 |
1 files changed, 0 insertions, 421 deletions
diff --git a/source/compiler-core/slang-artifact-info.cpp b/source/compiler-core/slang-artifact-info.cpp deleted file mode 100644 index 1d309e3c7..000000000 --- a/source/compiler-core/slang-artifact-info.cpp +++ /dev/null @@ -1,421 +0,0 @@ -// slang-artifact-info.cpp -#include "slang-artifact-info.h" - -#include "../core/slang-type-text-util.h" -#include "../core/slang-io.h" - -namespace Slang { - -/* !!!!!!!!!!!!!!!!!!!!!!!!!! ArtifactInfoUtil !!!!!!!!!!!!!!!!!!!!!!!!!!!! */ - -namespace { // anonymous -struct KindExtension -{ - ArtifactKind kind; - UnownedStringSlice ext; -}; -} // anonymous - -#define SLANG_KIND_EXTENSION(kind, ext) \ - { ArtifactKind::kind, toSlice(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::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) - { - case Kind::Library: - case Kind::ObjectCode: - { - return true; - } - default: break; - } - return false; -} - -/* static */bool ArtifactInfoUtil::isLinkable(const ArtifactDesc& desc) -{ - 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 - - // We can't *actually* link PTX or SPIR-V currently but it is in principal possible - // so let's say we accept for now - - 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; - } - - return true; - } - else if (isDerivedFrom(desc.payload, ArtifactPayload::GeneralIR)) - { - // We'll *assume* IR is linkable - return true; - } - } - return false; -} - -/* static */bool ArtifactInfoUtil::isCpuLikeTarget(const ArtifactDesc& desc) -{ - if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike)) - { - return isDerivedFrom(desc.payload, ArtifactPayload::CPULike); - } - 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; - } - - return false; -} - -/* static */ArtifactDesc ArtifactInfoUtil::getDescFromExtension(const UnownedStringSlice& slice) -{ - if (slice == "slang-module" || - slice == "slang-lib") - { - 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) - { - // 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::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) -{ - 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); - } - - if (isDerivedFrom(desc.kind, ArtifactKind::BinaryLike)) - { - 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) -{ - String name = Path::getFileName(path); - - const bool isSharedLibraryPrefixPlatform = SLANG_LINUX_FAMILY || SLANG_APPLE_FAMILY; - if (isSharedLibraryPrefixPlatform) - { - // Strip lib prefix - if (ArtifactInfoUtil::isCpuBinary(desc) && - (desc.kind == ArtifactKind::Library || - desc.kind == ArtifactKind::SharedLibrary)) - { - // If it starts with lib strip it - if (name.startsWith("lib")) - { - const String stripLib = name.getUnownedSlice().tail(3); - name = stripLib; - } - } - } - - // Strip any extension - { - auto descExt = ArtifactInfoUtil::getDefaultExtension(desc); - // Strip the extension if it's a match - if (descExt.getLength() && - Path::getPathExt(name) == descExt) - { - name = Path::getFileNameWithoutExt(name); - } - } - - return name; -} - -/* static */String ArtifactInfoUtil::getBaseName(const ArtifactDesc& desc, IFileArtifactRepresentation* fileRep) -{ - UnownedStringSlice path(fileRep->getPath()); - return getBaseNameFromPath(desc, path); -} - -/* static */String ArtifactInfoUtil::getBaseName(IArtifact* artifact) -{ - if (auto fileRep = findItem<IFileArtifactRepresentation>(artifact)) - { - return getBaseName(artifact->getDesc(), fileRep); - } - // Else use the name - return artifact->getName(); -} - -/* static */String ArtifactInfoUtil::getParentPath(IFileArtifactRepresentation* fileRep) -{ - UnownedStringSlice path(fileRep->getPath()); - return Path::getParentDirectory(path); -} - -/* static */String ArtifactInfoUtil::getParentPath(IArtifact* artifact) -{ - if (auto fileRep = findItem<IFileArtifactRepresentation>(artifact)) - { - return getParentPath(fileRep); - } - return String(); -} - -/* static */SlangResult ArtifactInfoUtil::calcPathForDesc(const ArtifactDesc& desc, const UnownedStringSlice& basePath, StringBuilder& outPath) -{ - outPath.Clear(); - - UnownedStringSlice baseName; - - // Append the directory - Index pos = Path::findLastSeparatorIndex(basePath); - if (pos >= 0) - { - outPath.append(basePath.head(pos)); - outPath.append(Path::kPathDelimiter); - - baseName = basePath.tail(pos + 1); - } - - if (baseName.getLength() == 0) - { - baseName = toSlice("unknown"); - } - - if (ArtifactInfoUtil::isCpuBinary(desc) && - (desc.kind == ArtifactKind::SharedLibrary || - desc.kind == ArtifactKind::Library)) - { - const bool isSharedLibraryPrefixPlatform = SLANG_LINUX_FAMILY || SLANG_APPLE_FAMILY; - if (isSharedLibraryPrefixPlatform) - { - outPath << "lib"; - outPath << baseName; - } - } - - // If there is an extension append it - const UnownedStringSlice ext = ArtifactInfoUtil::getDefaultExtension(desc); - - if (ext.getLength()) - { - outPath.appendChar('.'); - outPath.append(ext); - } - - return SLANG_OK; -} - -} // namespace Slang |
