diff options
Diffstat (limited to 'source/compiler-core/slang-metal-compiler.cpp')
| -rw-r--r-- | source/compiler-core/slang-metal-compiler.cpp | 177 |
1 files changed, 93 insertions, 84 deletions
diff --git a/source/compiler-core/slang-metal-compiler.cpp b/source/compiler-core/slang-metal-compiler.cpp index f8639b763..af455a0f7 100644 --- a/source/compiler-core/slang-metal-compiler.cpp +++ b/source/compiler-core/slang-metal-compiler.cpp @@ -1,102 +1,111 @@ #include "slang-metal-compiler.h" -#include "slang-gcc-compiler-util.h" + #include "slang-artifact-desc-util.h" -#include "slang-artifact-util.h" #include "slang-artifact-representation.h" +#include "slang-artifact-util.h" +#include "slang-gcc-compiler-util.h" namespace Slang { - class MetalDownstreamCompiler : public DownstreamCompilerBase +class MetalDownstreamCompiler : public DownstreamCompilerBase +{ +public: + // Because the metal compiler shares the same commandline interface with clang, + // we will use GccDownstreamCompilerUtil, which implements both gcc and clang, + // to create the inner compiler and wrap it here. + // + ComPtr<IDownstreamCompiler> cppCompiler; + String executablePath; + + MetalDownstreamCompiler(ComPtr<IDownstreamCompiler>& innerCompiler, String path) + : DownstreamCompilerBase(innerCompiler->getDesc()) + , cppCompiler(innerCompiler) + , executablePath(path) { - public: - // Because the metal compiler shares the same commandline interface with clang, - // we will use GccDownstreamCompilerUtil, which implements both gcc and clang, - // to create the inner compiler and wrap it here. - // - ComPtr<IDownstreamCompiler> cppCompiler; - String executablePath; - - MetalDownstreamCompiler(ComPtr<IDownstreamCompiler>& innerCompiler, String path) - : DownstreamCompilerBase(innerCompiler->getDesc()) - , cppCompiler(innerCompiler) - , executablePath(path) - { - } - - virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() override { return true; } - - virtual SLANG_NO_THROW SlangResult SLANG_MCALL compile(const CompileOptions& options, IArtifact** outArtifact) override - { - // All compile requests should be routed directly to the inner compiler. - return cppCompiler->compile(options, outArtifact); - } - - virtual SLANG_NO_THROW bool SLANG_MCALL canConvert(const ArtifactDesc& from, const ArtifactDesc& to) override - { - // Report that we can convert Metal IR to disassembly. - return ArtifactDescUtil::isDisassembly(from, to) && from.payload == ArtifactPayload::MetalAIR; - } - - virtual SLANG_NO_THROW SlangResult SLANG_MCALL convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) override - { - // Use metal-objdump to disassemble the Metal IR. - - ExecutableLocation exeLocation(executablePath, "metal-objdump"); - CommandLine cmdLine; - cmdLine.setExecutableLocation(exeLocation); - cmdLine.addArg("--disassemble"); - ComPtr<IOSFileArtifactRepresentation> srcFile; - SLANG_RETURN_ON_FAIL(from->requireFile(IArtifact::Keep::No, srcFile.writeRef())); - cmdLine.addArg(String(srcFile->getPath())); - - ExecuteResult exeRes; - SLANG_RETURN_ON_FAIL(ProcessUtil::execute(cmdLine, exeRes)); - auto artifact = ArtifactUtil::createArtifact(to); - artifact->addRepresentationUnknown(StringBlob::create(exeRes.standardOutput)); - *outArtifact = artifact.detach(); - return SLANG_OK; - } - }; - - static SlangResult locateMetalCompiler(const String& path, DownstreamCompilerSet* set) + } + + virtual SLANG_NO_THROW bool SLANG_MCALL isFileBased() override { return true; } + + virtual SLANG_NO_THROW SlangResult SLANG_MCALL + compile(const CompileOptions& options, IArtifact** outArtifact) override { - ComPtr<IDownstreamCompiler> innerCppCompiler; - - ExecutableLocation metalcLocation = ExecutableLocation(path, "metal"); - - String metalSDKPath = path; - -#if defined (SLANG_APPLE_FAMILY) - // Use xcrun command to find the metal compiler. - CommandLine xcrunCmdLine; - ExecutableLocation xcrunLocation("xcrun"); - xcrunCmdLine.setExecutableLocation(xcrunLocation); - xcrunCmdLine.addArg("--sdk"); - xcrunCmdLine.addArg("macosx"); - xcrunCmdLine.addArg("--find"); - xcrunCmdLine.addArg("metal"); - ExecuteResult exeRes; - if (SLANG_SUCCEEDED(ProcessUtil::execute(xcrunCmdLine, exeRes))) - { - String metalPath = exeRes.standardOutput.trim(); - metalcLocation = ExecutableLocation(ExecutableLocation::Type::Path, metalPath); - metalSDKPath = Path::getParentDirectory(metalcLocation.m_pathOrName); - } -#endif + // All compile requests should be routed directly to the inner compiler. + return cppCompiler->compile(options, outArtifact); + } - SLANG_RETURN_ON_FAIL(GCCDownstreamCompilerUtil::createCompiler(metalcLocation, innerCppCompiler)); + virtual SLANG_NO_THROW bool SLANG_MCALL + canConvert(const ArtifactDesc& from, const ArtifactDesc& to) override + { + // Report that we can convert Metal IR to disassembly. + return ArtifactDescUtil::isDisassembly(from, to) && + from.payload == ArtifactPayload::MetalAIR; + } + + virtual SLANG_NO_THROW SlangResult SLANG_MCALL + convert(IArtifact* from, const ArtifactDesc& to, IArtifact** outArtifact) override + { + // Use metal-objdump to disassemble the Metal IR. - ComPtr<IDownstreamCompiler> compiler = ComPtr<IDownstreamCompiler>( - new MetalDownstreamCompiler(innerCppCompiler, metalSDKPath)); - set->addCompiler(compiler); + ExecutableLocation exeLocation(executablePath, "metal-objdump"); + CommandLine cmdLine; + cmdLine.setExecutableLocation(exeLocation); + cmdLine.addArg("--disassemble"); + ComPtr<IOSFileArtifactRepresentation> srcFile; + SLANG_RETURN_ON_FAIL(from->requireFile(IArtifact::Keep::No, srcFile.writeRef())); + cmdLine.addArg(String(srcFile->getPath())); + + ExecuteResult exeRes; + SLANG_RETURN_ON_FAIL(ProcessUtil::execute(cmdLine, exeRes)); + auto artifact = ArtifactUtil::createArtifact(to); + artifact->addRepresentationUnknown(StringBlob::create(exeRes.standardOutput)); + *outArtifact = artifact.detach(); return SLANG_OK; } +}; - SlangResult MetalDownstreamCompilerUtil::locateCompilers(const String& path, ISlangSharedLibraryLoader* loader, DownstreamCompilerSet* set) +static SlangResult locateMetalCompiler(const String& path, DownstreamCompilerSet* set) +{ + ComPtr<IDownstreamCompiler> innerCppCompiler; + + ExecutableLocation metalcLocation = ExecutableLocation(path, "metal"); + + String metalSDKPath = path; + +#if defined(SLANG_APPLE_FAMILY) + // Use xcrun command to find the metal compiler. + CommandLine xcrunCmdLine; + ExecutableLocation xcrunLocation("xcrun"); + xcrunCmdLine.setExecutableLocation(xcrunLocation); + xcrunCmdLine.addArg("--sdk"); + xcrunCmdLine.addArg("macosx"); + xcrunCmdLine.addArg("--find"); + xcrunCmdLine.addArg("metal"); + ExecuteResult exeRes; + if (SLANG_SUCCEEDED(ProcessUtil::execute(xcrunCmdLine, exeRes))) { - SLANG_UNUSED(loader); - return locateMetalCompiler(path, set); + String metalPath = exeRes.standardOutput.trim(); + metalcLocation = ExecutableLocation(ExecutableLocation::Type::Path, metalPath); + metalSDKPath = Path::getParentDirectory(metalcLocation.m_pathOrName); } +#endif + + SLANG_RETURN_ON_FAIL( + GCCDownstreamCompilerUtil::createCompiler(metalcLocation, innerCppCompiler)); + + ComPtr<IDownstreamCompiler> compiler = + ComPtr<IDownstreamCompiler>(new MetalDownstreamCompiler(innerCppCompiler, metalSDKPath)); + set->addCompiler(compiler); + return SLANG_OK; +} +SlangResult MetalDownstreamCompilerUtil::locateCompilers( + const String& path, + ISlangSharedLibraryLoader* loader, + DownstreamCompilerSet* set) +{ + SLANG_UNUSED(loader); + return locateMetalCompiler(path, set); } + +} // namespace Slang |
