https://github.com/compor/llvm-ir-cmake-utils
LLVM IR CMake utils for bitcode file manipulation by opt and friends
https://github.com/compor/llvm-ir-cmake-utils
bitcode cmake intermediate-representation llvm
Last synced: 17 days ago
JSON representation
LLVM IR CMake utils for bitcode file manipulation by opt and friends
- Host: GitHub
- URL: https://github.com/compor/llvm-ir-cmake-utils
- Owner: compor
- License: lgpl-2.1
- Created: 2016-07-27T11:07:25.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2023-10-24T12:51:31.000Z (over 2 years ago)
- Last Synced: 2023-10-24T13:41:16.492Z (over 2 years ago)
- Topics: bitcode, cmake, intermediate-representation, llvm
- Language: CMake
- Homepage:
- Size: 47.9 KB
- Stars: 57
- Watchers: 6
- Forks: 15
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# LLVM IR cmake utilities
## Introduction
A collection of helper `cmake` functions/macros that eases the generation of `LLVM` IR and the application of various
`LLVM` `opt` passes while obtaining and preserving the separate IR files that are generated by each user-defined step.
## Requirements
- [`cmake`][1] 3.0.0 or later
- [`LLVM`][2] tools:
- Currently used:
- `clang/clang++`
- `opt`
- `llvm-dis` / `llvm-as`
- `llvm-link`
- Tested with:
- 3.7 and later
## Installation
- Clone this repo (or even add it as a submodule to your project).
- In your `CMakeLists.txt` file `include(LLVMIRUtil)`.
- You are good to go!
## Quick overview
The provided `cmake` commands are expected to work in a parasitic way to targets created via `add_executable()` and
`add_library`. The "gateway" command is `llvmir_attach_bc_target()` which generates the required bitcode files.
Currently, `C/C++` are supported via `clang/clang++`, but in theory any compiler which produces `LLVM` bitcode should be
easily supported (depending how nice it plays with `cmake` too).
The `cmake` calls currently provided are:
- `llvmir_attach_bc_target()`
Attaches to an existing target that can be compiled down to `LLVM IR` and does just that, using all the related flags
and options from the main target. The existing supported targets make use of `clang/clang++`, so currently this means
that the `C/C++` language is supported. It uses `add_custom_library()` `cmake` command under the hood. This creates a
target of type `LLVMIR`.
- `llvmir_attach_opt_pass_target()`
Attaches to a target of type `LLVMIR` and applies various `opt` passes to its bitcode files, specified as arguments.
It uses `add_custom_library()` `cmake` command under the hood. This creates a target of type `LLVMIR`.
- `llvmir_attach_disassemble_target()`
Attaches to a target of type `LLVMIR` and uses `llvm-dis` to disassemble its bitcode files. It uses
`add_custom_library()` `cmake` command under the hood. This creates a target of type `LLVMIR`.
- `llvmir_attach_assemble_target()`
Attaches to a target of type `LLVMIR` and uses `llvm-as` to assemble its bitcode files. It uses `add_custom_library()`
`cmake` command under the hood. This creates a target of type `LLVMIR`.
- `llvmir_attach_link_target()`
Attaches to a target of type `LLVMIR` and uses `llvm-link` to link its bitcode files to a single bitcode file. The
output bitcode file is names after the target name. It uses `add_custom_library()` `cmake` command under the hood.
This creates a target of type `LLVMIR`.
- `llvmir_attach_library()`
Attaches to a target of type `LLVMIR` and uses the appropriate compiler to compile its bitcode files to a native
library. The output library name uses the target name according to platform rules. It uses `add_library()` `cmake`
command under the hood. This creates a target of type `LLVMIR`.
- `llvmir_attach_executable()`
Attaches to a target of type `LLVMIR` and uses the appropriate compiler to compile its bitcode files to a native
executable. The output library name uses the target name according to platform rules. It uses `add_executable()`
`cmake` command under the hood. This creates a target of type `LLVMIR`.
### Influential properties
- `LLVMIR_SHORT_NAME`
This property, if present, controls the output name for the calls that produce a single object (e.g. archive, library,
etc.):
- `llvmir_attach_link_target()`
- `llvmir_attach_library()`
- `llvmir_attach_executable()`
_CAUTION_
If you require to get raw _unoptimized_ `LLVM` IR, but with the ability to further optimize it later on and you are
compiling with `LLVM` 5 or later, you need to add the following compile options, either:
```bash
-O1 -Xclang -disable-llvm-passes
```
or
```bash
-O0 -Xclang -disable-O0-optnone
```
This is because, since `LLVM` 5, using `-O0` add the `optnone` attribute to all functions.
## Basic Usage
Have a look and toy around with the included examples in this repo. The easiest way to start is:
1. `git clone` this repo.
2. Create a directory for an out-of-source build and `cd` into it.
3. `CC=clang CXX=clang++ cmake [path to example source dir]`
4. `cmake --build .`
5. `cmake --build . --target help` to see available target and use them for bitcode generation.
[1]: https://cmake.org
[2]: www.llvm.org