From 4321929879c1ed5b87ff95a99ca7da91e28d18fd Mon Sep 17 00:00:00 2001 From: Ellie Hermaszewska Date: Fri, 8 Dec 2023 19:24:34 +0800 Subject: 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 --- source/slang-llvm/slang-llvm-filecheck.cpp | 188 +++++++++++++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 source/slang-llvm/slang-llvm-filecheck.cpp (limited to 'source/slang-llvm/slang-llvm-filecheck.cpp') 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 +#include +#include + +#include +#include +#include +#include +#include + +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(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(&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(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 fileCheck(new slang_llvm::LLVMFileCheck); + + if (auto ptr = fileCheck->castAs(intfGuid)) + { + fileCheck.detach(); + *out = ptr; + return SLANG_OK; + } + + return SLANG_E_NO_INTERFACE; +} -- cgit v1.2.3