An open API service indexing awesome lists of open source software.

https://github.com/assetripper/assetripper.translation.llvmir

Convert LLVM IR to .NET CIL
https://github.com/assetripper/assetripper.translation.llvmir

cil dotnet llvm llvm-ir

Last synced: 2 months ago
JSON representation

Convert LLVM IR to .NET CIL

Awesome Lists containing this project

README

          

# AssetRipper.Translation.LlvmIR

This project transpiles LLVM IR to .NET CIL. This enables robust, automated translation of C and C++ to low-level C#. Translated code is highly performant, AOT compatible, cross-platform, and semantically accurate.

## Compiling small projects to LLVM IR with Clang

While this project is intended to handle any LLVM IR, it works best when the input is generated on Windows with the following Clang command:

```
clang -g -fno-discard-value-names -fstandalone-debug -S -emit-llvm {inputFile} -o {outputFile}
```

This ensures that debug information is included and that parameter names are preserved, which helps with generating code that is more readable.

## Compiling large projects to LLVM IR with CMake on Windows

### Install [Ninja](https://ninja-build.org/)

Use `ninja --version` to verify that it's been added to the PATH.

### Environmental variables

Clang on Windows can have trouble finding the Windows SDK and Visual Studio libraries and includes. You can set the `LIB` and `INCLUDE` environmental variables to help it find them. Adjust the paths below to match your installation.

```powershell
$env:LIB="C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\lib\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64"
$env:INCLUDE="C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt"
```

This is an example of an error you might see if Clang cannot find the necessary libraries:

```
-- Check for working C compiler: C:/Program Files/LLVM/bin/clang.exe - broken
CMake Error at C:/Program Files/CMake/share/cmake-4.2/Modules/CMakeTestCCompiler.cmake:67 (message):
The C compiler

"C:/Program Files/LLVM/bin/clang.exe"

is not able to compile a simple test program.
```

### Run CMake

```
cmake -G "Ninja" \
-S ./path-to-directory-with-source-files/ \
-B ./path-to-build-output-directory/ \
-DCMAKE_C_COMPILER=clang \
-DCMAKE_CXX_COMPILER=clang++ \
-DCMAKE_C_FLAGS="-DNOMINMAX" \
-DCMAKE_CXX_FLAGS="-DNOMINMAX" \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON
```

This will generate a `compile_commands.json` file in the build output directory, which is necessary for a future step.

#### Flags

* `-DNOMINMAX` ensures that the `min` and `max` macros do no interfere with compilation.

### Compile the project normally

```
cmake --build ./path-to-build-output-directory/ --config Debug
```

This ensures that any generated files get generated.

### Compile the project to LLVM IR

```
LargeProjectCompiler.exe ./path-to/compile_commands.json
```

Use `--help` to see additional options.

## NuGet tool

There are [plans](https://github.com/AssetRipper/AssetRipper.Translation.LlvmIR/issues/44) to ship this as a NuGet tool for easy installation and usage.