diff options
Diffstat (limited to 'source/compiler-core/slang-visual-studio-compiler-util.cpp')
| -rw-r--r-- | source/compiler-core/slang-visual-studio-compiler-util.cpp | 151 |
1 files changed, 103 insertions, 48 deletions
diff --git a/source/compiler-core/slang-visual-studio-compiler-util.cpp b/source/compiler-core/slang-visual-studio-compiler-util.cpp index df3285608..449b0f973 100644 --- a/source/compiler-core/slang-visual-studio-compiler-util.cpp +++ b/source/compiler-core/slang-visual-studio-compiler-util.cpp @@ -2,35 +2,45 @@ #include "slang-visual-studio-compiler-util.h" #include "../core/slang-common.h" -#include "slang-com-helper.h" -#include "../core/slang-string-util.h" #include "../core/slang-string-slice-pool.h" +#include "../core/slang-string-util.h" +#include "slang-com-helper.h" // if Visual Studio import the visual studio platform specific header #if SLANG_VC -# include "windows/slang-win-visual-studio-util.h" +#include "windows/slang-win-visual-studio-util.h" #endif #include "../core/slang-io.h" - #include "slang-artifact-desc-util.h" #include "slang-artifact-diagnostic-util.h" -#include "slang-artifact-util.h" #include "slang-artifact-representation-impl.h" +#include "slang-artifact-util.h" namespace Slang { -static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifactRepresentation* lockFile, List<ComPtr<IArtifact>>& outArtifacts) +static void _addFile( + const String& path, + const ArtifactDesc& desc, + IOSFileArtifactRepresentation* lockFile, + List<ComPtr<IArtifact>>& outArtifacts) { - auto fileRep = OSFileArtifactRepresentation::create(IOSFileArtifactRepresentation::Kind::Owned, path.getUnownedSlice(), lockFile); + auto fileRep = OSFileArtifactRepresentation::create( + IOSFileArtifactRepresentation::Kind::Owned, + path.getUnownedSlice(), + lockFile); auto artifact = ArtifactUtil::createArtifact(desc); artifact->addRepresentation(fileRep); outArtifacts.add(artifact); } -/* static */SlangResult VisualStudioCompilerUtil::calcCompileProducts(const CompileOptions& options, ProductFlags flags, IOSFileArtifactRepresentation* lockFile, List<ComPtr<IArtifact>>& outArtifacts) +/* static */ SlangResult VisualStudioCompilerUtil::calcCompileProducts( + const CompileOptions& options, + ProductFlags flags, + IOSFileArtifactRepresentation* lockFile, + List<ComPtr<IArtifact>>& outArtifacts) { SLANG_ASSERT(options.modulePath.count); @@ -44,35 +54,67 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa { StringBuilder builder; const auto desc = ArtifactDescUtil::makeDescForCompileTarget(options.targetType); - SLANG_RETURN_ON_FAIL(ArtifactDescUtil::calcPathForDesc(desc, modulePath.getUnownedSlice(), builder)); + SLANG_RETURN_ON_FAIL( + ArtifactDescUtil::calcPathForDesc(desc, modulePath.getUnownedSlice(), builder)); _addFile(builder, desc, lockFile, outArtifacts); } if (flags & ProductFlag::Miscellaneous) { - - _addFile(modulePath + ".ilk", ArtifactDesc::make(ArtifactKind::BinaryFormat, ArtifactPayload::Unknown, ArtifactStyle::None), lockFile, outArtifacts); + + _addFile( + modulePath + ".ilk", + ArtifactDesc::make( + ArtifactKind::BinaryFormat, + ArtifactPayload::Unknown, + ArtifactStyle::None), + lockFile, + outArtifacts); if (options.targetType == SLANG_SHADER_SHARED_LIBRARY) { - _addFile(modulePath + ".exp", ArtifactDesc::make(ArtifactKind::BinaryFormat, ArtifactPayload::Unknown, ArtifactStyle::None), lockFile, outArtifacts); - _addFile(modulePath + ".lib", ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::HostCPU, targetDesc), lockFile, outArtifacts); + _addFile( + modulePath + ".exp", + ArtifactDesc::make( + ArtifactKind::BinaryFormat, + ArtifactPayload::Unknown, + ArtifactStyle::None), + lockFile, + outArtifacts); + _addFile( + modulePath + ".lib", + ArtifactDesc::make(ArtifactKind::Library, ArtifactPayload::HostCPU, targetDesc), + lockFile, + outArtifacts); } } if (flags & ProductFlag::Compile) { - _addFile(modulePath + ".obj", ArtifactDesc::make(ArtifactKind::ObjectCode, ArtifactPayload::HostCPU, targetDesc), lockFile, outArtifacts); + _addFile( + modulePath + ".obj", + ArtifactDesc::make(ArtifactKind::ObjectCode, ArtifactPayload::HostCPU, targetDesc), + lockFile, + outArtifacts); } if (flags & ProductFlag::Debug) { // TODO(JS): Could try and determine based on debug information - _addFile(modulePath + ".pdb", ArtifactDesc::make(ArtifactKind::BinaryFormat, ArtifactPayload::PdbDebugInfo, targetDesc), lockFile, outArtifacts); + _addFile( + modulePath + ".pdb", + ArtifactDesc::make( + ArtifactKind::BinaryFormat, + ArtifactPayload::PdbDebugInfo, + targetDesc), + lockFile, + outArtifacts); } return SLANG_OK; } -/* static */SlangResult VisualStudioCompilerUtil::calcArgs(const CompileOptions& options, CommandLine& cmdLine) +/* static */ SlangResult VisualStudioCompilerUtil::calcArgs( + const CompileOptions& options, + CommandLine& cmdLine) { SLANG_ASSERT(options.modulePath.count); @@ -112,17 +154,17 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa switch (options.debugInfoType) { - default: + default: { // Multithreaded statically linked runtime library cmdLine.addArg("/MD"); break; } - case DebugInfoType::None: + case DebugInfoType::None: { break; } - case DebugInfoType::Maximal: + case DebugInfoType::Maximal: { // Multithreaded statically linked *debug* runtime library cmdLine.addArg("/MDd"); @@ -140,44 +182,46 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa switch (options.optimizationLevel) { - case OptimizationLevel::None: + case OptimizationLevel::None: { // No optimization - cmdLine.addArg("/Od"); + cmdLine.addArg("/Od"); break; } - case OptimizationLevel::Default: + case OptimizationLevel::Default: { break; } - case OptimizationLevel::High: + case OptimizationLevel::High: { cmdLine.addArg("/O2"); break; } - case OptimizationLevel::Maximal: + case OptimizationLevel::Maximal: { cmdLine.addArg("/Ox"); break; } - default: break; + default: break; } switch (options.floatingPointMode) { - case FloatingPointMode::Default: break; - case FloatingPointMode::Precise: + case FloatingPointMode::Default: break; + case FloatingPointMode::Precise: { // precise is default behavior, VS also has 'strict' // - // ```/fp:strict has behavior similar to /fp:precise, that is, the compiler preserves the source ordering and rounding properties of floating-point code when - // it generates and optimizes object code for the target machine, and observes the standard when handling special values. In addition, the program may safely - // access or modify the floating-point environment at runtime.``` + // ```/fp:strict has behavior similar to /fp:precise, that is, the compiler preserves + // the source ordering and rounding properties of floating-point code when it generates + // and optimizes object code for the target machine, and observes the standard when + // handling special values. In addition, the program may safely access or modify the + // floating-point environment at runtime.``` cmdLine.addArg("/fp:precise"); break; } - case FloatingPointMode::Fast: + case FloatingPointMode::Fast: { cmdLine.addArg("/fp:fast"); break; @@ -188,8 +232,8 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa switch (options.targetType) { - case SLANG_SHADER_SHARED_LIBRARY: - case SLANG_HOST_SHARED_LIBRARY: + case SLANG_SHADER_SHARED_LIBRARY: + case SLANG_HOST_SHARED_LIBRARY: { // Create dynamic link library if (options.debugInfoType == DebugInfoType::None) @@ -204,12 +248,12 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa cmdLine.addPrefixPathArg("/Fe", modulePath, ".dll"); break; } - case SLANG_HOST_EXECUTABLE: + case SLANG_HOST_EXECUTABLE: { cmdLine.addPrefixPathArg("/Fe", modulePath, ".exe"); break; } - default: break; + default: break; } // Object file specify it's location - needed if we are out @@ -244,12 +288,12 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa { ComPtr<IOSFileArtifactRepresentation> fileRep; - // TODO(JS): + // TODO(JS): // Do we want to keep the file on the file system? It's probably reasonable to do so. SLANG_RETURN_ON_FAIL(sourceArtifact->requireFile(ArtifactKeep::Yes, fileRep.writeRef())); cmdLine.addArg(fileRep->getPath()); } - + // Link options (parameters past /link go to linker) cmdLine.addArg("/link"); @@ -288,7 +332,9 @@ static void _addFile(const String& path, const ArtifactDesc& desc, IOSFileArtifa return SLANG_OK; } -static SlangResult _parseSeverity(const UnownedStringSlice& in, ArtifactDiagnostic::Severity& outSeverity) +static SlangResult _parseSeverity( + const UnownedStringSlice& in, + ArtifactDiagnostic::Severity& outSeverity) { typedef ArtifactDiagnostic::Severity Severity; @@ -311,7 +357,10 @@ static SlangResult _parseSeverity(const UnownedStringSlice& in, ArtifactDiagnost return SLANG_OK; } -static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const UnownedStringSlice& line, ArtifactDiagnostic& outDiagnostic) +static SlangResult _parseVisualStudioLine( + SliceAllocator& allocator, + const UnownedStringSlice& line, + ArtifactDiagnostic& outDiagnostic) { typedef IArtifactDiagnostics::Diagnostic Diagnostic; @@ -328,8 +377,8 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown outDiagnostic.stage = ArtifactDiagnostic::Stage::Compile; - const char*const start = line.begin(); - const char*const end = line.end(); + const char* const start = line.begin(); + const char* const end = line.end(); UnownedStringSlice postPath; // Handle the path and line no @@ -409,7 +458,8 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown return SLANG_FAIL; } - const UnownedStringSlice errorSection = UnownedStringSlice(postPath.begin(), postPath.begin() + errorColonIndex); + const UnownedStringSlice errorSection = + UnownedStringSlice(postPath.begin(), postPath.begin() + errorColonIndex); Index errorCodeIndex = errorSection.lastIndexOf(' '); if (errorCodeIndex < 0) { @@ -417,17 +467,20 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown } // Extract the code - outDiagnostic.code = allocator.allocate(errorSection.begin() + errorCodeIndex + 1, errorSection.end()); + outDiagnostic.code = + allocator.allocate(errorSection.begin() + errorCodeIndex + 1, errorSection.end()); if (asStringSlice(outDiagnostic.code).startsWith(UnownedStringSlice::fromLiteral("LNK"))) { outDiagnostic.stage = Diagnostic::Stage::Link; } // Extract the bit before the code - SLANG_RETURN_ON_FAIL(_parseSeverity(UnownedStringSlice(errorSection.begin(), errorSection.begin() + errorCodeIndex).trim(), outDiagnostic.severity)); + SLANG_RETURN_ON_FAIL(_parseSeverity( + UnownedStringSlice(errorSection.begin(), errorSection.begin() + errorCodeIndex).trim(), + outDiagnostic.severity)); // Link codes start with LNK prefix - postError = UnownedStringSlice(postPath.begin() + errorColonIndex + 1, end); + postError = UnownedStringSlice(postPath.begin() + errorColonIndex + 1, end); } outDiagnostic.text = allocator.allocate(postError); @@ -435,7 +488,9 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown return SLANG_OK; } -/* static */SlangResult VisualStudioCompilerUtil::parseOutput(const ExecuteResult& exeRes, IArtifactDiagnostics* diagnostics) +/* static */ SlangResult VisualStudioCompilerUtil::parseOutput( + const ExecuteResult& exeRes, + IArtifactDiagnostics* diagnostics) { diagnostics->reset(); @@ -466,7 +521,7 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown return SLANG_OK; } -/* static */SlangResult VisualStudioCompilerUtil::locateCompilers( +/* static */ SlangResult VisualStudioCompilerUtil::locateCompilers( const String& path, ISlangSharedLibraryLoader* loader, [[maybe_unused]] DownstreamCompilerSet* set) @@ -484,4 +539,4 @@ static SlangResult _parseVisualStudioLine(SliceAllocator& allocator, const Unown return SLANG_OK; } -} +} // namespace Slang |
