diff options
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-options.cpp | 21 | ||||
| -rw-r--r-- | source/slang/slang-options.h | 9 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 23 |
3 files changed, 49 insertions, 4 deletions
diff --git a/source/slang/slang-options.cpp b/source/slang/slang-options.cpp index ed2424224..72756d360 100644 --- a/source/slang/slang-options.cpp +++ b/source/slang/slang-options.cpp @@ -1748,13 +1748,17 @@ SlangResult OptionsParser::_expectInt(const CommandLineArg& initArg, Int& outInt return SLANG_OK; } -SlangResult OptionsParser::addReferencedModule(String path, SourceLoc loc, bool includeEntryPoint) +SlangResult createArtifactFromReferencedModule( + String path, + SourceLoc loc, + DiagnosticSink* sink, + IArtifact** outArtifact) { auto desc = ArtifactDescUtil::getDescFromPath(path.getUnownedSlice()); if (desc.kind == ArtifactKind::Unknown) { - m_sink->diagnose(loc, Diagnostics::unknownLibraryKind, Path::getPathExt(path)); + sink->diagnose(loc, Diagnostics::unknownLibraryKind, Path::getPathExt(path)); return SLANG_FAIL; } @@ -1772,7 +1776,7 @@ SlangResult OptionsParser::addReferencedModule(String path, SourceLoc loc, bool if (!ArtifactDescUtil::isLinkable(desc)) { - m_sink->diagnose(loc, Diagnostics::kindNotLinkable, Path::getPathExt(path)); + sink->diagnose(loc, Diagnostics::kindNotLinkable, Path::getPathExt(path)); return SLANG_FAIL; } @@ -1803,11 +1807,20 @@ SlangResult OptionsParser::addReferencedModule(String path, SourceLoc loc, bool nullptr); if (!fileRep->exists()) { - m_sink->diagnose(loc, Diagnostics::libraryDoesNotExist, path); + sink->diagnose(loc, Diagnostics::libraryDoesNotExist, path); return SLANG_FAIL; } } artifact->addRepresentation(fileRep); + *outArtifact = artifact.detach(); + return SLANG_OK; +} + +SlangResult OptionsParser::addReferencedModule(String path, SourceLoc loc, bool includeEntryPoint) +{ + ComPtr<IArtifact> artifact; + SLANG_RETURN_ON_FAIL( + createArtifactFromReferencedModule(path, loc, m_sink, artifact.writeRef())); SLANG_RETURN_ON_FAIL(_addLibraryReference(m_requestImpl, path, artifact, includeEntryPoint)); for (Index i = m_rawTranslationUnits.getCount(); i < m_requestImpl->getTranslationUnitCount(); diff --git a/source/slang/slang-options.h b/source/slang/slang-options.h index 3924ccb1c..7ee861879 100644 --- a/source/slang/slang-options.h +++ b/source/slang/slang-options.h @@ -2,12 +2,15 @@ #ifndef SLANG_OPTIONS_H #define SLANG_OPTIONS_H +#include "../compiler-core/slang-source-loc.h" #include "../core/slang-basic.h" namespace Slang { struct CommandOptions; +class DiagnosticSink; +class IArtifact; UnownedStringSlice getCodeGenTargetName(SlangCompileTarget target); @@ -20,5 +23,11 @@ enum class Stage : SlangUInt32; SlangSourceLanguage findSourceLanguageFromPath(const String& path, Stage& outImpliedStage); +SlangResult createArtifactFromReferencedModule( + String path, + SourceLoc loc, + DiagnosticSink* sink, + IArtifact** outArtifact); + } // namespace Slang #endif diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 8dfaf115e..18368b33b 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -861,6 +861,29 @@ Session::createSession(slang::SessionDesc const& inDesc, slang::ISession** outSe Math::Max(linkageDebugInfoLevel, target->getOptionSet().getDebugInfoLevel()); linkage->m_optionSet.set(CompilerOptionName::DebugInformation, linkageDebugInfoLevel); + // Add any referenced modules to the linkage + for (auto& option : linkage->m_optionSet.options) + { + if (option.key != CompilerOptionName::ReferenceModule) + continue; + for (auto& path : option.value) + { + DiagnosticSink sink; + ComPtr<IArtifact> artifact; + SlangResult result = createArtifactFromReferencedModule( + path.stringValue, + SourceLoc{}, + &sink, + artifact.writeRef()); + if (SLANG_FAILED(result)) + { + sink.diagnose(SourceLoc{}, Diagnostics::unableToReadFile, path.stringValue); + return result; + } + linkage->m_libModules.add(artifact); + } + } + *outSession = asExternal(linkage.detach()); return SLANG_OK; } |
