diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-05-14 17:50:00 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-05-14 17:50:00 -0400 |
| commit | d4316c88457a32f1169b2d7d82053ccbc05fa7ed (patch) | |
| tree | cbc87350b9ef2f5be31ebc20783e08b895767779 /source/slang/slang-include-system.cpp | |
| parent | 79d106fac18f5792fcac448a0b037aa834fa6042 (diff) | |
FXC as DownstreamCompiler (#1844)
* #include an absolute path didn't work - because paths were taken to always be relative.
* WIP Fxc as downstream compiler.
* First pass FXC downstream compiler working.
* GCC compile fix.
* Fix FXC parsing issue.
* Special case filesystem access.
* Use StringUtil getSlice.
* Fix isses with not emitting source for FXC.
* Small fixes for DXBC handling.
Diffstat (limited to 'source/slang/slang-include-system.cpp')
| -rw-r--r-- | source/slang/slang-include-system.cpp | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/source/slang/slang-include-system.cpp b/source/slang/slang-include-system.cpp deleted file mode 100644 index 891d376f6..000000000 --- a/source/slang/slang-include-system.cpp +++ /dev/null @@ -1,158 +0,0 @@ -// slang-include-system.cpp -#include "slang-include-system.h" - -#include "../core/slang-io.h" -#include "../core/slang-string-util.h" - -namespace Slang -{ - -SlangResult IncludeSystem::findFile(SlangPathType fromPathType, const String& fromPath, const String& path, PathInfo& outPathInfo) -{ - String combinedPath; - - if (fromPath.getLength() == 0 || Path::isAbsolute(path)) - { - // If the path is absolute or the fromPath is empty, the combined path is just the path - combinedPath = path; - } - else - { - // Get relative path - ComPtr<ISlangBlob> combinedPathBlob; - SLANG_RETURN_ON_FAIL(m_fileSystemExt->calcCombinedPath(fromPathType, fromPath.begin(), path.begin(), combinedPathBlob.writeRef())); - combinedPath = StringUtil::getString(combinedPathBlob); - if (combinedPath.getLength() <= 0) - { - return SLANG_FAIL; - } - } - - // This checks the path exists - SlangPathType pathType; - SLANG_RETURN_ON_FAIL(m_fileSystemExt->getPathType(combinedPath.begin(), &pathType)); - if (pathType != SLANG_PATH_TYPE_FILE) - { - return SLANG_E_NOT_FOUND; - } - - // Get the uniqueIdentity - ComPtr<ISlangBlob> uniqueIdentityBlob; - SLANG_RETURN_ON_FAIL(m_fileSystemExt->getFileUniqueIdentity(combinedPath.begin(), uniqueIdentityBlob.writeRef())); - - // If the rel path exists -> a uniqueIdentity MUST exists too - String uniqueIdentity(StringUtil::getString(uniqueIdentityBlob)); - if (uniqueIdentity.getLength() <= 0) - { - // Unique identity can't be empty - return SLANG_FAIL; - } - - outPathInfo = PathInfo::makeNormal(combinedPath, uniqueIdentity); - return SLANG_OK; -} - -String IncludeSystem::simplifyPath(const String& path) -{ - ComPtr<ISlangBlob> simplifiedPath; - if (SLANG_FAILED(m_fileSystemExt->getSimplifiedPath(path.getBuffer(), simplifiedPath.writeRef()))) - { - return path; - } - return StringUtil::getString(simplifiedPath); -} - -SlangResult IncludeSystem::findFile(String const& pathToInclude, String const& pathIncludedFrom, PathInfo& outPathInfo) -{ - outPathInfo.type = PathInfo::Type::Unknown; - - // If it's absolute we only have to try and find if it's there - no need to look at search paths - if (Path::isAbsolute(pathToInclude)) - { - // We pass in "" as the from path, so ensure no from path is taken into account - // and to allow easy identification that this is in effect absolute - return findFile(SLANG_PATH_TYPE_DIRECTORY, UnownedStringSlice::fromLiteral(""), pathToInclude, outPathInfo); - } - - // Try just relative to current path - { - SlangResult res = findFile(SLANG_PATH_TYPE_FILE, pathIncludedFrom, pathToInclude, outPathInfo); - // It either succeeded or wasn't found, anything else is a failure passed back - if (SLANG_SUCCEEDED(res) || res != SLANG_E_NOT_FOUND) - { - return res; - } - } - - // Search all the searchDirectories - for (auto sd = m_searchDirectories; sd; sd = sd->parent) - { - for (auto& dir : sd->searchDirectories) - { - SlangResult res = findFile(SLANG_PATH_TYPE_DIRECTORY, dir.path, pathToInclude, outPathInfo); - if (SLANG_SUCCEEDED(res) || res != SLANG_E_NOT_FOUND) - { - return res; - } - } - } - - return SLANG_E_NOT_FOUND; -} - -SlangResult IncludeSystem::loadFile(const PathInfo& pathInfo, ComPtr<ISlangBlob>& outBlob) -{ - if (m_sourceManager) - { - // See if this an already loaded source file - SourceFile* sourceFile = m_sourceManager->findSourceFileRecursively(pathInfo.uniqueIdentity); - - // If not create a new one, and add to the list of known source files - if (!sourceFile) - { - ComPtr<ISlangBlob> foundSourceBlob; - if (SLANG_FAILED(m_fileSystemExt->loadFile(pathInfo.foundPath.getBuffer(), foundSourceBlob.writeRef()))) - { - return SLANG_E_CANNOT_OPEN; - } - - sourceFile = m_sourceManager->createSourceFileWithBlob(pathInfo, foundSourceBlob); - m_sourceManager->addSourceFile(pathInfo.uniqueIdentity, sourceFile); - - outBlob = foundSourceBlob; - return SLANG_OK; - } - else - { - if (sourceFile->getContentBlob()) - { - outBlob = sourceFile->getContentBlob(); - return SLANG_OK; - } - - ComPtr<ISlangBlob> foundSourceBlob; - if (SLANG_FAILED(m_fileSystemExt->loadFile(pathInfo.foundPath.getBuffer(), foundSourceBlob.writeRef()))) - { - return SLANG_E_CANNOT_OPEN; - } - - sourceFile->setContents(foundSourceBlob); - outBlob = foundSourceBlob; - return SLANG_OK; - } - } - else - { - // If we don't have the source manager, just load - return m_fileSystemExt->loadFile(pathInfo.foundPath.getBuffer(), outBlob.writeRef()); - } -} - -SlangResult IncludeSystem::findAndLoadFile(const String& pathToInclude, const String& pathIncludedFrom, PathInfo& outPathInfo, ComPtr<ISlangBlob>& outBlob) -{ - SLANG_RETURN_ON_FAIL(findFile(pathToInclude, pathIncludedFrom, outPathInfo)); - SLANG_RETURN_ON_FAIL(loadFile(outPathInfo, outBlob)); - return SLANG_OK; -} - -} // namespace Slang |
