-
Notifications
You must be signed in to change notification settings - Fork 397
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[OpCodeCounter] Wrong result for functions #38
Comments
Thank you for testing and reporting this @xgupta , that's very much appreciated! I've just pushed a patch that should fix this (and GitHub closed this issue automatically). Please feel free to re-open if you are still seeing incorrect results. Best regards, |
robertszafa
pushed a commit
to robertszafa/llvm-sycl-passes
that referenced
this issue
Feb 17, 2023
This patch adds basic Travis support - it only installs LLVM 8 (which is the version that will initially be used for this repo). Fix Travis and add status in README.md Add passes for counting direct function calls Two following passes are added: * StaticCallCounter (counts static function calls) * DynamicCallCounter (counts dynamic function calls) Also: * documentation * updated build system * updated CI Sort alphabetically output from StaticCallCounter This makes the output deterministic and will make testing possible. Add LIT test for StaticCallCounter This patch contains one LIT test, as well as LIT configuration scripts and documentation updates Add syntax highlighting in README.md Update the comments in the existing passes Updated, added and refined comments for the exisiting passes. Also minor refactoring (e.g. avoid implicitely casting pointers to bool). Refactor the test * Moved the source file to a dedicated location (so that it can be used as both an example and an input for tests) * Added comments * Simplified the lit test (the source code was not required there) [Darwin] Add support for OS X * Fixes build on Darwin (updated compiler flags) * Adds OS X in Travis * Adds -fvisibility-inlines-hidden compiler flag to silence warnings on Darwin and for consistency LLVM build system Add the Mixed Boolean Arithmetic pass There's 5 new LIT tests that verify that this pass is working fine. Some clean-up, code re-ordering to be expected. [NFC] Add instructions for building LLVM from sources [NFC] Simplify README.md [NFC] Update status Rename the libraries * simplifies the way libraries are called * stop building static libs (currently not needed) * [NFC] removes a duplicated test [NFC] Update README.md This patch also renames the `lt` pass to `static-cc` to better reflect what it does. I'm qualifying this as NFC. Refactor and add new tests Renaming (e.g. *.c -> *.ll), more tests for CallCounter, comments. [NFC] Simplify directory structure Add the RIV pass Add the DuplicateBB pass Minor refactoring * Remove the custom RandomNumberGenerator wrapper. The one in LLVM is sufficient. * Rename Utils.{cpp|h} --> Ratio.{cpp|h}. This is both cleaner and better reflects what Ratio.{cpp|h} is for. Add new Pass Manager support for MBAAdd In this patch I also renamed MBA as MBAAdd as I'll be adding more passes using mixed boolean algebra. Add MBASub Also tests, input file, updated README.md, renamed MBA to MBAAdd. Refactor MBAAdd (use more complicated formula) This patch updates the MBAAdd pass by replacing the original formula: (1) a + b == (a ^ b) + 2 * (a & b) with a bit more involved one: (2) a + b ==(((a ^ b) + 2 * (a & b)) * 39 + 23) * 151 + 111 Since (2) is only valid for 8 bit integers, MBAAdd will now only transform add instructions when both inputs are 8 bit wide. Tests and README.md are updated accordingly. Since MBAAdd will now only work for additions of 8-bit integers, e.g. %3 = add i8 %1, %2 I had to play a bit with examples so that there are not sign-extensions to 32 bit integers (e.g. compiling with -O1). All this hopefully introduced some interesting concepts. Fix the way the return conditionin MBASub::run is calculated Thanks MattPD for pointing this out! [NFC] Refactor lt-cc-main.cpp Simplified the code, added comments, made sure that formatting adheres to LLVM coding style. Refactor StaticCallCounters and DynamicCallCounters * split lt-cc-main.cpp into StaticMain.cpp and DynamicMain.cpp * rename files to adhere to LLVM's coding style * rename variables to adhere to LLVM's coding style * remove unnecessary includes * simplified the code (e.g. removed a few command line options) * more comments * updated README.md and tests accordingly * remove the tools/lt-cc dir [NFC] Apply clang-format Add HelloWorld pass Adding HelloWorld - a reference pass with a self-contained CMakeLists.txt file. It's a rather minimal example that should be a good starting point. Updated README.md accordingly. [NFC] Update README.md [NFC] Fix typo [CMake] Simplify the scripts This is mostly non-functional-changes, apart from removing a shared library target: DynamicCallCounter. It isn't meant to be used as a shared object, so that target was redundant. [NFC] Update Credits Update the HelloWorld example Add a test that verifies registration with the new PM. Update comments with regard to the known seg-fault on Travis. I realised that I can reproduce it locally when building against packages from HomeBrew. I've update the comments accordingly. I'm still not aware of any working solutions. Update HelloWorld and the CMake flag that guards it from crashing 1. Renamed LT_TRAVIS_DISABLE to LT_LEGACY_SKIP_PIPELINE_REGISTRATION It's no obvious that it's registration within one of the pre-existing pipelines (using the legacy PM mechanism) causes 'opt' to segfault when building against LLVM from HomeBrew. The new name of the CMake variable reflects that. 2. [NFC] Updated comments in HelloWorld [NFC] Update documentaiton for the MBAAdd pass [CMake] Fix the way CMAKE_CXX_FLAGS are set CMAKE_CXX_FLAGS were set using CMAKE_CXX_FLAGS_RELEASE, which means that regardless of CMAKE_BUILD_TYPE, Release build flags were used. [NFC] Update README.md [NFC] Refactor MBAAdd and MBASub * Remove redundant variables (the instruction iterator from the 'for' loop wasn't used directly, now it is) * Updated comments, moved code around (for consistency) * Removed comments which are already present in HelloWorld (to minimise duplication) Switch StaticCallCounter to the new PM * the new PM is now the default for StaticCallCounter * switched to the new PM in StaticMain.cpp too * refactored StaticCallCounter to make it consistent with other passes already using the new PM Note that the unit tests still require to run StaticCallCounter via the legacy PM, as the passes in the new PM don't implement the print method: http://llvm.org/docs/WritingAnLLVMPass.html#the-print-method Update LIT config for clang Until now clang wasn't listed with other test tools in lit.cfg.py, which meant that it's path wasn't prepended with LT_LIT_TOOLS_DIR. In other words, the system clang was always used. This patch makes sure that clang from LT_LIT_TOOLS_DIR is used instead. Provided that LT_LIT_TOOLS_DIR is set correctly, this guarantees that clang-8 is always used. On Darwin clang installed via HomeBrew (or build from sources) doesn't know where to look for standard headers (e.g. 'stdlib.h'). The workaround implemented here uses '-isysroot'. [NFC] Refactor DynamicCallCounter and dynamic These changes are meant to simplify and clarify the code: * variable renaming * updated comments * code simplification. Update to LLVM 9 * Updated source code (rather minor changes) * Updated .travis.yml (also switched from Ubuntu Xenial to Ubuntu Bionic) * Update README.md I believe that there are missing files in the LLVM 9 package for Ubuntu (or LLVMExport.cmake script is broken). I've managed to work around in .travis.yml, but need to investigate further. I'll need to set-up an Ubuntu VM for this first. [Travis] Enable LIT testing on Linux LLVM-9 packages for Ubuntu ship with FileCheck, which means that I can now run LIT tests there too (more specifically, on Ubuntu nodes on Travis). Some tests required updating - the order of instructions on Ubuntu was different. [NFC] Simplify test/hello.ll [NFC] Update the NewInst generation in MBAAdd This is just to improve the readability [Darwin/NFC] Update the way the path for -isysroot is discovered This path is now discovered with xcrun as opposed being hard-coded. [NFC/CMake] Minor simplification * HelloWorld doesn't require link_directories - removed * HelloWorld doesn't require add_definitions - removed * LLVM 9 switched to C++14, so removed LLVM_ENABLE_CXX1Y [NFC/CMake] Remove redundant stuff [NFC] Rename variables (to upper case) and remove redundant func args [NFC/LIT] Remove redundant code [NFC] Fix format specifier in printf [NFC] Simplify MBA_add.ll and MBA_sub.ll Instead of using external input C files, I generated the input IR function and copied it verbatim (module the meta data) into the test files. This allowed me to remove the RUN line that would execute 'clang'. The tests are now better focused on what should be tested, i.e. IR --> IR transformation. Add a test for MBAAdd This patch adds a test for MBAAdd that verifies that 32-bit additions are not transformed. The original test was renamed to reflect that it only tests 8-bit additions. [NFC] Refine CMake, remove redundant suffic in LIT config [NFC] Update README.md (re switch to LLVM 9) With the switch to LLVM 9, LIT tests can now be run in the Ubuntu Travis instance too. This patch updates README accordingly. Also, the CMake variable LT_LIT_TOOLS_DIR isn't really needed, so I removed to simplify the instructions. Simplify tests for call counting passes Typo in Filename in README [NFC] Add hints about debugging Fix some incorrect directories in README.md [Travis] Remove '-va' from command line when running LIT Also make sure that apt-get update is always run before installing LLVM (apt-get can get flaky otherwise). Remove DynamicCallCounter I would like to simplify the examples and this one in particular requires breaking down. Fix bug in README.md The original command was loading the plugin using the new PM style (via `-load-pass-plugin`), yet was trying to use it through the legacy PM style (via `-hello-world`). [NFC] Update comments [NFC] Fix wrong pass names in README.md Thank you @llVim! [NFC] Add references [NFC] Documentation [Docs] Fix typo in installation instructions for Ubuntu [CI] Add *.yaml files for GitHub Actions Add InjectFuncCall pass This pass injects calls to printf (from stdio.h) into the input module. [CI] Clean-up the Travis config file * Remove workarounds that are no longer needed * Remove code that's no longer used/needed (e.g. $RUN_TESTS) * Update comments Update attributes for printf in InjectFuncCall Based on the suggestion from MattPD, I've updated the attributes that are set for `printf` in InjectFuncCall.cpp. It now matches the implementation of `inferLibFuncAttributes` in BuildLibCalls.cpp. It would be tempting to call `inferLibFuncAttributes` instead, but that hook requires an instance of TargetLibraryInfo. Although currently it _can_ be obtained through ModuleAnalysisManager, this is about to change in LLVM 10: https://reviews.llvm.org/D66428 I've also switched from `PointerType::get` to `PointerType::getUnqual` - this allows to pass fewer arguments. Kudos to MattPD for the suggestion! [CMake] Refactor the scripts This patch adds a bunch of non-functional changes: * remove code that's not needed * re-arrange a bit * add comments [CI] Make sure README.md displays the status of the master branch Refine the badge for GitHub actions so that it always displays the status of the master branch (as opposed to the branch currently being developed/pushed to). Add DynamicCallCounter pass Counts dynamic (i.e. runtime) calls to functions defined in the input module. To this end, DynamicCallCounter instruments the input module with instructions that count runtime function calls. It also adds code that prints a small report/summary after `main`. Update and add tests for DynamicCallCounter * New test that checks the output IR * More comments * Renamed the files Update tests for StaticCallCounter * Rename for consistency with DynamicCallCounter * Use LLVM IR (instead of *.c) as input Make sure DynamicCallCounter doesn't instrument empty files DynamicCallCounter should only instrument function definitions (as opposed to function declarations). Modules with no function definitions should remain unmodified. Add test/Inputs directory with re-usable input files for tests To avoid code-duplication, add test/Inputs with input IR files re-used by multiple tests. Remove hard-coded paths from tests Instead of using hard-coded paths for plugins (e.g. "..\lib"), use the CMake variable, CMAKE_LIBRARY_OUTPUT_DIRECTORY. Unify the examples for HelloWorld and InjectFuncCall Although the two passes are completely differently, it's very interesting to compare the output when applied to the same file. This patch adds a few tweaks which makes the comparison straightforward. [NFC] Update README.md Add `About` section [NFC] Update README.md * Some re-writing * Consistency * Uniform formatting Rework pipeline registration example The HelloWorld pass includes registration with the optimisation pipelines (on top of regular registration implemented for all other examples). That registration has been guarded with a CMake flag to optionally disable it. This is required on MacOS as for `opt` installed with HomeBrew, registering out-of-tree passes with optimisation pipelines leads to a seg-fault. Currently, in order for that coded to be disabled one has to specify: LT_LEGACY_SKIP_PIPELINE_REGISTRATION=On when calling CMake. In other words, the problematic code is _enabled_ by default. It would make more sense to have it _disabled_ by default so that it never causes an accidental seg-fault. With this patch, the problematic registration is disabled by default. LT_LEGACY_SKIP_PIPELINE_REGISTRATION is replaced with HELLOWORLD_OPT_PIPELINE_REG, which is to be set to ON when requesting registration with the optimisation pipelines. This was suggested by Amirahmad Khordadi in issue banach-space#8 - thank you! README.md was also updated to reflect the changes and with a few general edits. [CI/NFC] Update comments, remove unused CMake variable Add links to LLVM Dev 2019 talks [CI] Add new workflows for building LLVM 9 from sources This patch adds GitHub Actions workflows that build LLVM 9 from sources for both Ubuntu and Mac OS. In the current set-up these workflows are triggered on every push. This is required in order to generate initial data for the master branch. This is meant to be updated so that these workflows are only run on certain times. Otherwise they are too time-consuming and will eat-up all free GitHub Actions time. This patch also includes some minor refactoring for the original workflows. [CI] Make sure LLVM is build only on certain dates The GitHub Actions workflows that build LLVM sources take a lot of time and can't be run every time code is pushed. This patch updates the configuration so that these jobs run only on selected dates at specified times. [CI] Make sure LLVM is build only on certain dates - Darwin Same as previous commit. I forgot to add x86-darwin-llvm-from-sources.yml, so fixing it now. [CI] Enable auto-registration with the existing pass pipelines In order to increase test coverage, I'm enabling auto-registration with the existing optimisation pipelines. Note that this is only implemented for HelloWorld. This patch only updates GitHub Actions. I might be making similar change in travis.yml in the future. Keep in mind that this auto-registration can only be enabled on Darwin when building LLVM from sources (the reasons for this are documented in the code). [NFC] Remove redundant includes Remove auto-registration from HelloWorld Auto-registration with the existing pipelines (through `RegisterStandardPasses`) complicates HelloWorld. I'd like to keep it very simple instead. In this patch I'm removing auto-registration. I'll create a dedicated pass for that and submit in a separate patch. Additionally, I've made a few NFCs (code clean-up). Add OpcodeCounter pass It's a relatively simple pass, only slightly more complicated than HelloWorld. However, I'd like to use it to showcase how to auto-register passes. I think that it is worthwhile to have a dedicated, non-trivial example for this. HelloWorld will remain as a basic reference example. Fix links in README.md [NFC] Move the definition of AnalysisKey StaticCallCounter::Key This is just a consistency fix Rewrite the RIV pass The original implementation of RIV had a few issues: * it contained bugs (FP values weren't excluded as they should) * it didn't take into account global variables * it didn't have a new PM interface * the sample input file was too complex * the comments in the implementation were confusing * the documentation in README.md didn't highlight the key features * there was only 1 test This patch addresses all of the above points. In particular, it emphasises that RIV is the only pass in llvm-tutor that relies on another pass from LLVM. In particular, it leverages LLVM's dominance analysis. Fix RIV pass 1. Use FAM.getResult<DominatorTreeAnalysis>(F) instead of FAM.getCachedResult<DominatorTreeAnalysis>(F). The latter should only be used when the results are already available. This only affect the new PM implementation. 2. When adding a global variable to an RIV set, make sure to add the global itself rather than just the underlying value. 3. All names should start with an upper case (global -> Global) [NewPM] Prevent RIV from printing the results unconditionally For the legacy PM one has to pass `-analyze` on the command line for the results of an analysis pass to be printed. Unfortunately there's no equivalent flag for the new PM. In order to test RIV with the new PM, I've set it up so that it would print the results unconditionally. That's not desirable though, so I'm reverting that behaviour. Rewrite the DuplicateBB pass This patch rewrites DuplicateBB: * label duplicated blocks so that it's clear which block have been injected by DuplicateBB, e.g. `lt-if-then-0` and `lt-else-0` for the 0th BasicBlock that's duplicated * simplify the implementation (e.g. split into more functions, use more meaningful variable names, no command-line arguments) * make sure that global variables are not used for the injected `if-then-else` construct (and be explicit about it) * add new PM implementation * add more tests * add a simplified sample input * improved documentation Add tests for DuplicateBB These tests verify various corner cases. Also, they illustrate the expected output in those cases. [NewPM] Add auto-registration for OpcodeCounter This patch updates the OpcodeCounter example to use auto-registration when using the new PM implementation. AFAIK, with the new PM one can either choose the auto-registration or the command-line registration. Contrary to the legacy PM, it's not possible to use both for the same pass. Update DuplicateBB (including the description) Make DuplicateBB name all the newly inserted basic blocks. [Travis] Stop reporting results from Travis My Travis instance has started acting up. I'm not sure whether that's Travis or my Travis config. GitHub Actions is fine, so definitely not llvm-tutor. I'm turning off notifications from Travis while I investigate. [Travis] Refactor the config The multi-os Travis config has recently started failing on Darwin with no apparent reason, i.e. there have been no changes in the build scripts that could trigger this. This is the (rather vague) error message from Travis: "An error occurred while generating the build script." https://travis-ci.org/github/banach-space/llvm-tutor/jobs/665338881 This patch updates the Travis script so that: * instead of building on multiple os'es, multiple compilers are used (gcc and clang) * the os is set to Linux Bionic Build in Debug _and_ Release Until now all CI configs used the default build type. This patch will make Travis build both Debug (the default) and Release. This patch made me realise that I had a small bug in DuplicateBB that manifested itself only when building in release, as then LLVM's STATISTIC macro generates a variable that's always set to 0. DuplicateBB is updated accordingly. [NFC] Remove duplicated test auto_registration.ll is identical to auto_registration_legacy_pm.ll [NFC] Update comments in DuplicateBB Add the MergeBB pass [NFC] Add documentation for MergeBB [NFC] Make sure that tests use %t As per https://llvm.org/docs/CommandGuide/lit.html#substitutions, %t is a common substitution used for temporary file name unique to the test. Make sure that all tests use %t instead of some arbitrary names. This is important as otherwise tests might be re-using files generated by other tests. [CMake] Remove unused variable definition Upgrade to LLVM 10 The `LT_OPT_PIPELINE_REG` CMake flag and the corresponding workaround for pass auto-registration has been removed. The corresponding issue in LLVM has been fixed: llvm/llvm-project@52c1d20 [NFC] Add more LLVM examples to references [CMake] Update how include paths are set for `static` Instead of relying on `INTERFACE_INCLUDE_DIRECTORIES` (set implicitly by `target_include_directories`), call `target_include_directories` for `static` and set the include path explicitly. [NFC] Updte README.md * Remove a note that no longer applies after the LLVM-10 update * Update links to code (i.e. fix line numbers) This patch also adds empty lines before lists and code blocks. This change: * makes my local Markdown viewer happier, * doesn't affect how README.md is displayed on GitHub * seems to be consistent with MarkdDown good practices Switch from DenseMap to MapVector in StaticCallCounter llvm::MapVector, as opposed to to llvm::DenseMap, guarantees that the iteration order is identical to the insertion order. This simplifies the implementation. The tests for StaticCallCounter had to be updated as well. Although the order of results is now deterministic, the results are no longer ordered alphabetically when printing. Previously they were ordered to guarantee determinism of the results. README.md was updated accordingly. [NFC] Update docs/comments for StaticCallCounter This patch adds documentation and tests for the StaticCallCounter pass. Some minor refactoring of the code was also done (to unify the style across the codebase). Simplify CMake for static This patch refactors CMakeLists.txt for `static` so that it's more straightforward and explicit (about it's dependencies). [NFC] Unify how passes are registered This simply updates how arguments are commented (a fix to adhere with LLVM's coding style). [CI] Clone only release/10.x branch and no history When building LLVM from sources (in GitHub actions), only clone the release/10x branch and ignore the history. This should speed up the builds. [CI] Run cron jobs more often The GitHub actions limit for Open Source projects has been lifted, so switching to more frequent builds. [CI] Add GitHub actions for Windows Builds and runs HelloWorld. LLVM is built from sources with Ninja as generator. [CI] Build LLVM on Ubuntu and Darwin every day [NFC] Make sure that llvm-tutor builds without warnings Item 1: Some comments triggered -Wcomment as I used `\` at the end of a comment line (which is interpreted as line-continuation). I've fixed that so that the warning is no longer triggered. Item 2: LLVM's `setAlignment(unsigned)` has been deprecated: https://github.com/llvm/llvm-project/blob/release/10.x/llvm/include/llvm/IR/GlobalObject.h#L81 I've switched to `setAlignment(MaybeAlign)` instead. Thank you @orestisf for drawing my attention to these! I've also made some improvements to comments. [NFC] Add a link to clang-tutor [Docs] Explain the difference between analysis and transformation Until now it wasn't really clear which pass falls into which category and what the difference is. This has been inspired by my recent discussion with @samolisov, thank you! Add a link to the Obfuscator plugin from clang-tutor cmake: specify 'SYSTEM' setting to disable warnings https://cmake.org/cmake/help/latest/command/include_directories.html: > If the SYSTEM option is given, the compiler will be told the > directories are meant as system include directories on some platforms. > Signalling this setting might achieve effects such as the compiler > skipping warnings, or these fixed-install system files not being > considered in dependency calculations - see compiler docs. [NFC] Update instructions in README.md As discussed in banach-space#12, when loading libraries on Linux, one has to specify the directory. The current working directory is not searched by dlopen. Improve the documentation * added missing `-analyze` when describing RIV * refined the comparison between Analysis and Transformation passes Add Dockerfile + Update README.md * added Dockerfile and a Github Docker image workflow * llvm-tutor uses clang to emit ll files from source files. When building LLVM from source we have to specify that we need clang to be built by setting LLVM_ENABLE_PROJECTS=clang cmake flag. Add tests for existing LLVM passes This patch adds tests for certain LLVM passes, which are relatively straightforward, yet demonstrate some very interesting compiler concepts. The tests help to understand/demonstrate the underlying pass. [NFC] Small updated to README.md Update section title Add clarification regarding LLVM_DEBUG and STATISTIC This is in relation to banach-space#20. minor change to commands to fix warnings on linux (banach-space#17) minor change to commands to fix warnings on linux opt with -S produce .ll output and without that produce .bc output so change commands accordingly where .ll file needed. Linux systems after building llvm-tutor produce .so libraries while mac os produces .dylib so change accordingly in commands for linux. Some places <source-dir> is missing while specifying input files so fix them. Add documentation Fix banach-space#19 Fix Ratio::parser The online documentation for parse method is incorrect: * https://llvm.org/docs/CommandLine.html#writing-a-custom-parser The suggested signature is: ``` bool parse(cl::Option &O, StringRef ArgName, const std::string &ArgValue, unsigned &Val); ``` However, from parser::parse in CommandLine.h: ``` bool parse(Option &O, StringRef ArgName, StringRef Arg, DataType &V) ``` Note that the 3rd argument should be a StringRef rather than std::string. Change "Linux 18.04" to "Ubuntu 18.04" in README.md (banach-space#21) Switch llvm-tutor to LLVM 11 This patch updates llvm-tutor for the recently released LLVM 11. It includes minor updates to the implementation of the passes, as well as documentation and CI scripts. Note that starting from LLVM 11 the requirement for CMake has changed. LLVM (and also llvm-tutor) now requires CMake 3.13.4, which may mean that some users will have to download CMake manually. For example, Ubuntu 18.04 only offers 3.10.2. I hope that this won't be a big problem - CMake is relatively easy to install: https://cmake.org/download/. [NFC] Minor update in docs Fix an issue with brew update/brew upgrade I've only experienced this in GitHub Actions (hence only the GitHub Actions files is updated). It manifested itself as follows: ``` fatal: 'origin' does not appear to be a git repository fatal: Could not read from remote repository. ``` This patch implements a workaround from here: * actions/runner-images#1811 Update references Remove some old stuff. Added a great presentation by Jonathan Smith that I haven't had the chance to watch until today. Refine auto-registration for OpcodeCounter OpcodeCounter is meant to be a reference example for how to register a pass with one of the existing pipelines. However, * there were no tests for this * there was no standard registration for the new PM (i.e. via `-passes=opcode-counter`) * README.md was out-of-date This patch updates the relevant code and adds a new test dedicated to auto-registration. [NFC] Update the CMake version required in the HelloWorld example I forgot to update this when switching to LLVM 11. This is mostly for consistency sake. Update the LLVM version in the Windows CMake script My CI on Windows has been failing for various reasons for the past few months and I didn't notice this when updating llvm-tutor to LLVM 11. Support for Windows remains "experimental". Update msbuild GH action This is required, as per microsoft/setup-msbuild#33. [NFC] Update GH action for Windows for testing While I'm trying to fix building on Windows, I need this action to run on every push. Revert "[NFC] Update GH action for Windows for testing" This reverts commit 0071fcd. I've experimented a bit, but didn't get too far. Now the origina commit is a nuisance when testing feature branches (builds on Windows and fails as expected), hence reverting. Add a printing pass, OpcodeCounterPrinter, for OpcodeCounter I've learnt about the printing passes from this presentation by Jonathan Smith (aka @jvs_tech): * https://www.youtube.com/watch?v=MagR2KY8MQI&t It's a neat trick with which the behaviour of analyses passes is consistent across pass managers (with respect to printing the results). OpcodeCounter is the first pass in *llvm-tutor* that's updated to use a printing pass. I've also updated the documentation as IMO this should be the recommended way of writing such passes for the new PM. The pass registration and tests are updated accordingly. Fix the implementation of OpcodeCounterPrinter This patch just fixes a silly typo. I'm a bit surprised that pretty much everything just worked fine. Add a printing pass for StaticCallCounter The tests are updated accordingly. This patch also simplifies the implementation of `static`. I also took the liberty of renaming the tests. I think that now filenames are more descriptive. Add a printing pass for RIV Switch from pip to pip3 Python 2 has reached end-of-life. This means that one should be using pip3 instead of pip as well. [GH] Remove the workaround for Darwin I've been hitting various brew-related issues in GitHub Actions on Darwin. I couldn't find a good fix, but I noticed that these were triggered by the workarounds that I was using there. I removed the workarounds and everything seems to work fine. I may need to re-visit this, but for now I'm merging this. [GA] Remove LT_OPT_PIPELINE_REG from build scripts This CMake flag hasn't been supported for a while. I forgot to delete it earlier. [GA][NFC] Remove a call to `ls` This call was originally added to aid debugging. It is no longer needed. [NFC] Fix compiler warnings A few non-functional changes and minor improvements guided by various compiler warnings (extracted from the CI jobs). Adding in one patch as their are really minor. [GA] Add a workflow for statically registered passes I'm currently implementing support for statically registered plugins on a branch. However, I need this workflow in order to test that feature branch. There seems to be no way of adding workflows on feature branches only. [GA] Switch to manual trigger for statically registered plugins This workflow is currently for testing only. AFAIK, there's no way of making it work with manual triggers before enabling it in some other way first (e.g. trigger on _push_). Hence, I enabled it first so that it's triggered on _push_. In this patch I switch to manual trigger. [GA] Fix paths [GA] Fix test path [GA] Update how static registration is tested I have now updated the feature branch, so this action needs to be updated accordingly. [CI] Add a manual trigger to one of the actions I'm not entirely sure whether this will work, but I'm under the impression that this needs to be updated on the main repository branch before it can be tested. [CMake] Add a workaround for banach-space#25 Because of the problem reported in banach-space#25, on Ubuntu Bionic we can't just request LLVM 11.0.0 (or LLVM 11.0.1) with `find_package`. Instead, we jsut add an extra check to make sure that LLVM's major version is indeed 11. llvm-tutor will happily work with both LLVM 11.1.0 and LLVM 11.0.1. However, on Darwin there's only LLVM 11.0.0 and on Ubuntu Bionic only LLVM 11.1.0. So either we use: * find_package(LLVM 11.0.0 REQUIRED CONFIG) on Darwin * find_package(LLVM 11.1.0 REQUIRED CONFIG) on Ubuntu Bionic or, we opt in for the solution implemented in this patch. Both are just workarounds. [CI] Make sure that we use LLVM 11.0.1 rather than 11.1.0 The release/11.x branch of llvm-project has recently been update and now contains LLVM 11.1.0. Until recently it's been LLVM 11.0.0. This is fine, but llvm-tutor should just stick to one version. In order to guarantee this, use tags rather than branches to get a particular version of LLVM. I switched to `git clone --depth 10`. 10 is an arbitrary number here - big enough to guarantee that the `llvmorg-11.0.1` tag is also downloaded. Add logic for static registration of plugins In llvm-tutor we mostly use dynamic plugins. This patch adds documentation, a bash script and a CI action to demonstrate static plugin registration as an alternative to dynamic plugins. The following presentation provides a great introduction into this subject: 2020 LLVM Developers’ Meeting: S. Guelton “Building Compiler Extension for LLVM 10.0.1” https://www.youtube.com/watch?v=PkfTHdoUzT8&ab_channel=LLVM The keep the script relatively simple, static_registration.sh bash will only port the MBASub plugin. I've also updated the GitHub action configuration that I've set-up for testing this. [CMake] Make sure that we use LLVM 11.0.1 rather than 11.1.0 This is similar to 99e499b, but specifically for the Windows CMake script. Disclaimer: Windows support is experimental. Add include for CommandLine in StaticMain [GA] Add triggers to workflows Make x86-Darwin and x86-Ubuntu workflows run on PRs to master and on manual triggers. Add floating-point comparison analysis, printer, and transformation passes [NFC] Update the docs and add some comments Add necessary libraries to `static` executable If you link against a dylib build (e.g. when building in debug mode) you'll need these. [GA] Update the CMake invocation to build with shared libs [GA] Don't build shared libs for static plugins With `BUILD_SHARED_LIBS=On` (set when building LLVM), static plugin registration fails. I tested with: * LLVM_BYE_LINK_INTO_TOOLS set to On and Off * LLVM_MBASUB_LINK_INTO_TOOLS set to On and Off This makes sense, `BUILD_SHARED_LIBS` and e.g. `LLVM_BYE_LINK_INTO_TOOLS` are mutually exclusive (one is for shared linking and the other for static). I should revisit this in the future and perhaps prepare a patch for LLVM to make CMake catch this. Add tests for FindFCmpEq + minor refactor Add tests for FindFCmpEq to check that all comparisons that are _not supported_ are indeed ignored by the pass. I've also moved a few bits around to make the implementation more consistent with other passes. These are NFCs. [GA] Improve testing for static registration Adds the following: * `-S` when running the sanity check so that the output in GitHub actions is human-readable (as opposed to being binary) * `-DLLVM_BUILD_EXAMPLES` so that the test for MBASub is indeed run (rather than being `UNSUPPORTED`) [GA] Refine configs for actions that depend on pre-build packages Added a cron trigger - this is to defend against unexpected changes to the pre-build packages (e.g. unexpected switch from LLVM 11.0.0 to LLVM 11.1.0). Update the branch for pull-request based triggers from `master` to `main` (llvm-tutor switched to `main` a while back). Update llvm-tutor to LLVM 12 Most notable changes: 1. The DIE pass was removed in https://reviews.llvm.org/D87933. DCE provides similar functionality and is used instead. 2. 'willreturn' was introduced in https://reviews.llvm.org/D62801. It means that the corresponding function is guaranteed to return (i.e. there are no infinite loops or calls to e.g. `abort` or `exit`). This means that it can be safely removed by the DCE pass. Without the `willreturn` attribute the DCE pass skips the corresponding function. 3. Multiple fixes in README.md that I noticed while updating it. [Travis] Make sure that `lit` is run using Python 3 (instead of Python 2) LLVM has recently switched to Python 3, i.e. Python 2 is no longer supported. This also applies to `lit`, the Python script to runs LIT tests: * https://github.com/llvm/llvm-project/blob/release/12.x/llvm/utils/lit/lit.py This change is required to make sure that in Travis CI environment, `lit` is run using Python 3 rather than Python 2. [NFC] Update CI links in README.md [GA] Allow `workflow dispatch` for the docker configuration Update the docker set-up * Update the docker script from LLVM 11 to LLVM 12 (I missed it when upgrading other files). * Switch the GitHub action file for Docker from tracking `master` to tracking `main` (again, missed it when updating the primary branch) Add a docker file for Fedoro llvm-tutor does not work in Fedora yet, but the docker file seems fine and will be used for testing. I've also renamed the Ubunty docker set-up/file. This is for consistency. Added check for /usr/lib64 for fix issue in Fedora 33 Add note about OptNone The registration with the new pass manager requires that `OptNone` is not present for functions. Make sure that clang-compiled BC files don't have OptNone Switch to Fedora 34 IIUC, * Fedora 32 comes with LLVM 10, * Fedora 33 comes with LLVM 11, and * Fedora 34 provides LLVM 12. So we need Fedora 34 rather than 32. I've also cleaned-up the docker file a bit. Improve sanity checks in CMake This is just a minor improvement to CMake after banach-space@a139213. I'm also adding some comments. Fix Ubuntu actions The Ubuntu GitHub actions started unexpectedly failing. Adding `python3-setuptools` to the list of installed packages fixes the issue. Update the documentation and implementation of `OpcodeCounter` In banach-space#35, `-O1` was added to the instructions for building `input_for_cc.bc` (i.e. the sample input for the `OpcodeCounter` pass). Unfortunately, `-O1` causes all instructions to be optimized away and hence there's nothing to print for the `OpcodeCounter` pass. This patch fixes that by restoring the original instruction for building `input_for_cc.bc` . In order to work around `optnone` (the original rationale behind adding `-O1` in the previous patch), `isRequired()` [1] is added to the implementation of `OpcodeCounter.` Fixes banach-space#38 [1] https://llvm.org/docs/WritingAnLLVMNewPMPass.html#required-passes Fix banach-space#40 Background and solution identical to the previous patch. Add -disable-output option for running FindFCmpEq Add Dockerfile and GH workflow for Arch Linux Apart from having a CI for yet another flavour of Linux, I wanted to see whether I can reproduce the failure reported in banach-space#39. That's not the case, so I suggest that we close banach-space#39. Mod: Phi only have two incoming edges Fix comment in DuplicateBB.cpp Update the branch names in all links in README.md from master to main Fix a typo in HelloWorld/CMakeLists.txt Add "-c" arg in README.md and tools/StaticMain.cpp when expecting llvm bitcode output If there isn't "-c" argument, clang will generate an error "clang-12: error: -emit-llvm cannot be used when linking". [Docs] Add more detail on `optnone` Fix a typo in lib/OpcodeCounter.cpp Fix two typos in OpcodeCounter.cpp Fix banach-space#50 Add "Run the pass through opt - New PM" for InjectFuncCall [GH Actions] Fix how LLVM 12 is installed With LLVM 13 being released, `brew install llvm` means `brew install llvm@13` rather than `brew install llvm@12`. And llvm-tutor is still based on LLVM 12. Bump llvm-tutor to LLVM 13 Quick summary of the changes: 1. ORC Jit has become the default JIT engine used in `lli`, see: * "[lli] Make -jit-kind=orc the default JIT engine" * https://reviews.llvm.org/D98931 * https://releases.llvm.org/13.0.0/docs/ReleaseNotes.html#changes-to-the-llvm-tools However, in LLVM 13 it's a bit broken, see * https://bugs.llvm.org/show_bug.cgi?id=52030. This means that in tests that use `lli`, we need to specify `-jit-kind=mcjit` Once we switch to LLVM 14, we can delete remove this flag. 2. `-enable-new-pm` in `opt` now defaults to 1, which means that we need `-enable-new-pm=0` to make sure that the legacy pass manager is used instead of the new pass manager. Some tests only work with the legacy pass manager (e.g. the ones that use call-site alwaysinline). Tests are updated accordingly. Fix Darwin workflow Switch away from the deprecated `CreateLoad` Fix banach-space#53 Update Fedora Dockerfile to fix build Latest Fedora 35 release has LLVM 13 package Add an Ubuntu Docker configuration This patch adds a Docker file for building llvm-tutor on Ubuntu using the pre-build binary packages from https://apt.llvm.org/. A GitHub action is also added to run this configuration. I'm adding this as this configuration seems to be broken and I need an easy way to reproduce it. I suspect that the Ubuntu packages might be missing some dependency. Fix Ubuntu configuration The `apt` packages for Ubuntu have recently been updated to include MLIR. This has triggered an update in the LLVM CMake modules and `libmlir-13` is now required to be installed alongside other LLVM packaged (otherwise CMake configuration fails). I've added a couple more LLVM packages (`libmlir-13-dev` and `libllvm13`), just to be on the safe side. To make things a bit easier for myself, I've switched from Ubuntu 18.04 to 20.04. I think that this is rather safe given that 20.04 is almost 2 years old. Fix GA file (use `{opt|clang}-13` instead of `{clang|opt}`) Fix Ubuntu docker file (incorrect LLVM installation dir) Updat Travis links [CI] Update the Travis config Update the Ubuntu dependencies Fixed typo Simplify a heredoc in static_registration.sh Replace `git://` with `https://` See https://github.blog/2021-09-01-improving-git-protocol-security-github/ for context. Make HelloWorld pass required Fix docs for running lli in LLVM 13 and add an end-to-end test for DynamicCallCounter (banach-space#65) * Fix docs for running lli in LLVM 13 The default JIT engine, ORC JIT, used by lli in LLVM 13 is broken. This commit updates the docs for running lli using MCJIT, reflecting changes already made in the tests. * Create an end-to-end test for DynamicCallCounter An end-to-end test consumes a C file as input, so that it verifies invocations of clang, opt, and lli. * Update commands for DynamicCallCounter Make two updates on the commands for running DynamicCallCounter: - Remove redundant parameters for invoking clang. - Fix the invocation of opt for legacy PM. Extend GitHub actions Make the basic GitHub actions use both GCC and Clang, and to build both Release and Debug. just a couple of typo fixes! add enable-new-pm=0 to enable legacy pass manager Add a note about the LLVM 14 switch Refine find_package Update to LLVM 14 Bump Fedora version Remove scripts for Windows I've not had the time to resurrect the Windows support, so instead I am removing all Windows specific files that are left. Otherwise, folks might assume that Windows is supported (unfortunately, it is not). [CI] Bump Ubuntu version to 20.04
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
It is expected :
=================================================
LLVM-TUTOR: OpcodeCounter results for
main
OPCODE #N TIMES USED
load 2
br 4
icmp 1
add 1
ret 1
alloca 2
store 4
call 4
What is happening:
Printing analysis 'OpcodeCounter Pass' for function 'main':
LLVM-TUTOR: OpcodeCounter results
OPCODE #TIMES USED
ret 1
I think main should print all instructions opcodes.
$LLVM_DIR/bin/opt --version
LLVM (http://llvm.org/):
LLVM version 12.0.0
Optimized build.
Default target: x86_64-pc-linux-gnu
Host CPU: bdver4
The text was updated successfully, but these errors were encountered: