diff options
| author | Ellie Hermaszewska <ellieh@nvidia.com> | 2023-12-08 19:24:34 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-08 19:24:34 +0800 |
| commit | 4321929879c1ed5b87ff95a99ca7da91e28d18fd (patch) | |
| tree | ae1460dcb652981468e6fa4897e87b697f2bda33 /source/slang-llvm/slang-llvm-filecheck.cpp | |
| parent | 9903688ccc0793259d43f95cae88bd1a8e178824 (diff) | |
WIP: CMake (#3326)
* More robust input and output selection in generator tools
* Add cmake build system
* Get slang-test running with cmake
* Bump lz4 and miniz dependencies
* Make cmake build more declarative
* Correct preprocessor logic in slang.h
* Add cuda test to compute/simple
* Remove empty cmake files
* output placement for cmake, and commenting
* Correct include paths in spirv-embed-generator
* Format cmake with gersemi
* Make cmake build clerer
* Neaten header generation
Also work around https://gitlab.kitware.com/cmake/cmake/-/issues/18399
by introducing correct_generated_properties to set the GENERATED flag in
the correct scope
* remove unused files
* use 3.20 to set GENERATOR property properly
* spelling
* more flexible linker arg setting
* replace slang-static with obj collection
* Set rpath and linker path correctly
* neaten generated file generation
* tests working with cmake build
* fix premake5 build
* comment and neaten cmake
* remove unnecessary dependency
* Build aftermath example only when aftermath is enabled
* Add slang-llvm and other dependencies
* Put modules alongside binaries
* Find slang-glslang correctly
* Better option handling
* comments
* add llvm build test
* Better option handling
* cmake wobble
* use UNICODE and _UNICODE
* remove other workflows
* use ccache
* neaten
* limit parallel for llvm build
* use ninja for build
* Windows and Darwin slang-llvm builds
* cache key
* verbose llvm build
* cl on windows
* sccache and cl.exe
* use cl.exe
* Correct package detection
* less verbosity
* Simplify miniz inclusion
* fix build with sccache
* Neaten llvm building
* neaten
* Neaten slang-llvm fetching
* more surgical workarounds
* Add ci action
* Get version from git
* better variable naming
* add missing include
* clean up after premake in cmake
* more docs on cmake build
* ci wobble
* add imgui target
* more selective source
* do not download swiftshader
* Some missing dependencies
* only build llvm on dispatch
* Disable /Zi in CI where sccache is present
* simplify
* set PIC for miniz
* set policies before project
* reengage workaround
* more runs on ci
* Add cmake presets
* Add cpack
* move iterator debug level to preset
* Correct lib flag
* simplify action
* Neaten cmake init
* Add todo
* Add simple test wrapper
* Add tests to workflow presets
* rename packing preset
* Correctly set definitions
* docs
* correct preset names
* Make slang-test depend on test-server/test-process
* neaten
* use workflow in actions
* install docs
* Correct module install dir
* debug dist workflow
* Install headers
* neaten header globbing
* Neaten dependency handling
* make lib and bin variables
* Do not set compiler for vs builds, unnecessary
* docs
* allow setting explicit source for target
* maintain archive subdir
* cmake docs
* install headers
* place targets into folders
* cmake docs
* nest external projects in folder
* remove name clash
* Neater external packages
* meta targets in folder structure
* cleaner slang-glslang dll
* Add missing static directive to slang-no-embedded-stdlib
* more robust module copying
* make slang-test the startup project
* folder tweak
* Make FETCH_BINARY the default on all platforms
* Set DEBUG_DIR
* add natvis files to source
* skip spirv tests
* remove test step from debug dist
* Add build to .gitignore
* redo warnings to be more like premake
* Update imgui
* clean more premake files
* Disable PCH for glslang, gcc throws a warning
* Add /MP for msvc builds
* warning wobble
* Add script to build llvm
* Add slang-llvm and generators components
* Build slang-llvm in ci
* comments
* fetch llvm with git
* better abi approximation for cache
* better sccache key
* formatting
* Correct logic around disabling problematic debug info for ccache
* exclude gcc and clang from windows ci
* Make dist workflows use system llvm
* naming
* restore normal dist builds
* formatting
* run tests in ci
* Correct slang-llvm url setting
* Rely on the system to find the test tool library
* actions matrix wiggle
* cope with OSX ancient bash
* Correct compilers on windows
* more ci debugging
* Correct rpath handling on OSX
* neaten
* correct path to slang-llvm
* Correct rpath separator on osx
* Find slang-llvm correctly
* smoke tests only on osx
* ci wobble
* Give MacOS module a dylib suffix
* get swiftshader correctly
* cope with bsd cp
* remove debug output
* full tests on osx
* ci wobble
* Add some vk tests to expected failures
* simplify ci
* ci wobble
* exclude dx12 tests from github ci
* remove cmake code for building llvm
* warnings
* warnings as errors for cl
* spirv-tools in path
* add aarch64 ci build
* Add SLANG_GENERATORS_PATH option for prebuilt generators
* neaten
* Correct generator target name
* remove yaml anchors because github actions does not support them
* Demote CMake in docs
Also add info on cross compiling
* Restore premake CI
* use minimal ci for cmake
* Write miniz_export for premake build
and .gitignore it
* Mention build config tool options in docs
* Remove redefined macro for miniz
* regenerate vs project
Diffstat (limited to 'source/slang-llvm/slang-llvm-filecheck.cpp')
| -rw-r--r-- | source/slang-llvm/slang-llvm-filecheck.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/source/slang-llvm/slang-llvm-filecheck.cpp b/source/slang-llvm/slang-llvm-filecheck.cpp new file mode 100644 index 000000000..bd71eac05 --- /dev/null +++ b/source/slang-llvm/slang-llvm-filecheck.cpp @@ -0,0 +1,188 @@ +// This file contains a definition of LLVMFileCheck, an implementaion for +// IFileCheck. + +#include <llvm/ADT/SmallString.h> +#include <llvm/Support/raw_ostream.h> +#include <llvm/FileCheck/FileCheck.h> + +#include <slang.h> +#include <slang-com-helper.h> +#include <slang-com-ptr.h> +#include <core/slang-com-object.h> +#include <tools/slang-test/filecheck.h> + +namespace slang_llvm +{ + +using namespace llvm; +using namespace Slang; + +class LLVMFileCheck : IFileCheck, ComBaseObject +{ +public: + // ICastable + virtual SLANG_NO_THROW void* SLANG_MCALL castAs(const Guid& guid) override; + + // IUnknown + SLANG_COM_BASE_IUNKNOWN_ALL + void* getInterface(const Guid& guid); + void* getObject(const Guid& guid); + + // IFileCheck + virtual TestResult SLANG_MCALL performTest( + const char* programName, + const char* rulesFilePath, + const char* fileCheckPrefix, + const char* stringToCheck, + const char* stringToCheckName, + ReportDiagnostic testReporter, + void* reporterData, + bool colorDiagnosticOutput) noexcept override; + +private: + // Everything we need to pass through LLVM back to our diagnostic handler + struct ReporterData + { + ReportDiagnostic reportFun; + // User data from the caller of performTest + void* data; + bool colorDiagnosticOutput; + const char* programName; + TestMessageType testMessageType; + }; + + static void fileCheckDiagHandler(const SMDiagnostic& diag, void* reporterData); +}; + +class DisplayedStringOStream : public raw_string_ostream +{ +public: + DisplayedStringOStream(std::string& s): raw_string_ostream(s){} + virtual bool is_displayed() const override { return true; }; +}; + +void LLVMFileCheck::fileCheckDiagHandler(const SMDiagnostic& diag, void* dataPtr) +{ + const ReporterData& reporterData = *reinterpret_cast<ReporterData*>(dataPtr); + std::string s; + DisplayedStringOStream o(s); + o.enable_colors(reporterData.colorDiagnosticOutput); + diag.print(reporterData.programName, o); + reporterData.reportFun(reporterData.data, TestMessageType::TestFailure, s.c_str()); +} + +TestResult LLVMFileCheck::performTest( + const char* const programName, + const char* const rulesFilePath, + const char* const fileCheckPrefix, + const char* const stringToCheck, + const char* const stringToCheckName, + const ReportDiagnostic testReporter, + void* const userReporterData, + const bool colorDiagnosticOutput) noexcept +{ + // + // Set up our FileCheck session + // + FileCheckRequest fcReq; + fcReq.CheckPrefixes = {fileCheckPrefix}; + FileCheck fc(fcReq); + + // + // Set up the LLVM source manager for diagnostic output from our input buffers + // + SourceMgr sourceManager; + auto rulesTextOrError = MemoryBuffer::getFile(rulesFilePath, true); + if(std::error_code err = rulesTextOrError.getError()) + { + const std::string message = "Unable to load FileCheck rules file: " + err.message(); + testReporter(userReporterData, TestMessageType::RunError, message.c_str()); + return TestResult::Fail; + } + SmallString<4096> rulesBuffer; + StringRef rulesStringRef = fc.CanonicalizeFile(*rulesTextOrError.get(), rulesBuffer); + sourceManager.AddNewSourceBuffer( + MemoryBuffer::getMemBuffer(rulesStringRef, rulesFilePath), + SMLoc()); + + SmallString<4096> inputBuffer; + const auto inputStringMB = MemoryBuffer::getMemBuffer( + StringRef(stringToCheck), + stringToCheckName, + false); + const StringRef inputStringRef = fc.CanonicalizeFile(*inputStringMB.get(), inputBuffer); + sourceManager.AddNewSourceBuffer( + MemoryBuffer::getMemBuffer(inputStringRef, stringToCheckName), + SMLoc()); + + // Initialize this with a 'RunError' failure type. We'll "downgrade" this to + // 'TestFailure' once we've done the FileCheck setup. + ReporterData reporterData{ + testReporter, + userReporterData, + colorDiagnosticOutput, + programName, + TestMessageType::RunError}; + sourceManager.setDiagHandler(fileCheckDiagHandler, static_cast<void*>(&reporterData)); + + auto checkPrefix = fc.buildCheckPrefixRegex(); + if(fc.readCheckFile(sourceManager, rulesStringRef, checkPrefix)) + { + // FileCheck failed to find or understand any FileCheck rules in + // the input file, automatic fail, and reported to the diag handler . + return TestResult::Fail; + } + + // We've done the FileCheck setup, so make sure that any diagnostics + // reported on from here are just a regular test failure. + reporterData.testMessageType = TestMessageType::TestFailure; + if(!fc.checkInput(sourceManager, inputStringRef)) + { + // An ordinary failure, the FileCheck rules didn't match + return TestResult::Fail; + } + + return TestResult::Pass; +} + +void* LLVMFileCheck::castAs(const Guid& guid) +{ + if (auto ptr = getInterface(guid)) + { + return ptr; + } + return getObject(guid); +} + +void* LLVMFileCheck::getInterface(const Guid& guid) +{ + if (guid == ISlangUnknown::getTypeGuid() || + guid == ICastable::getTypeGuid() || + guid == IFileCheck::getTypeGuid()) + { + return static_cast<IFileCheck*>(this); + } + return nullptr; +} + +void* LLVMFileCheck::getObject(const Guid& guid) +{ + SLANG_UNUSED(guid); + return nullptr; +} + +} // namespace slang_llvm + +extern "C" SLANG_DLL_EXPORT SlangResult createLLVMFileCheck_V1(const SlangUUID& intfGuid, void** out) +{ + Slang::ComPtr<slang_llvm::LLVMFileCheck> fileCheck(new slang_llvm::LLVMFileCheck); + + if (auto ptr = fileCheck->castAs(intfGuid)) + { + fileCheck.detach(); + *out = ptr; + return SLANG_OK; + } + + return SLANG_E_NO_INTERFACE; +} |
