Creating an LLVM Backend for the Cpu0 Architecture (original) (raw)

Appendix A: Getting Started: Installing LLVM and the Cpu0 Example Code

The Cpu0 example code, lbdex, can be found at the lower left section of this website, or directly via this link:http://jonathan2251.github.io/lbd/lbdex.tar.gz.

For details on using cmake to build LLVM, refer to “Building LLVM with CMake” [1] documentation.

We will install two LLVM directories in this chapter. One is the directory~/llvm/debug/, which contains the clang and clang++ compilers used to translate C/C++ source files into LLVM IR. The other is ~/llvm/test/, which contains our Cpu0 backend program and another clang build.

Build Steps

On Linux, using multi-threading (-DLLVM_PARALLEL_COMPILE_JOBS=4) requires more than 16GB of memory. I created a 64GB swap file to avoid link failures[2] [3]. iMac systems typically do not encounter this issue.

$ cat /etc/fstab

... /swapfile swap swap default 0 0

After installing necessary packages (via brew on iMac), follow the build instructions here:https://github.com/Jonathan2251/lbd/blob/master/README.md.

Setting Up Your Mac

Install Homebrew first [4]:

% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

After installation, add the brew command to your shell’s PATH, as shown in the final message of the install script. The command typically looks like the following:

% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/cschen/.zprofile % eval "$(/opt/homebrew/bin/brew shellenv)"

For installing Homebrew in China, use the following install script instead[5].

% /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" ... % source /Users/cschen/.zprofile % brew --version Homebrew 3.6.7-28-g560f571 fatal: detected dubious ownership in repository at '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core' To add an exception for this directory, call:

    git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core

Homebrew/homebrew-core (no Git repository) fatal: detected dubious ownership in repository at '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask' To add an exception for this directory, call:

    git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask

% git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core % git config --global --add safe.directory /usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask % brew install cmake ... ==> Running brew cleanup cmake... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see man brew).

% brew install ninja

Install Icarus Verilog Tool on iMac

Install Icarus Verilog using the command brew install icarus-verilog as shown below:

% brew install icarus-verilog ==> Downloading ftp://icarus.com/pub/eda/verilog/v0.9/verilog-0.9.5.tar.gz ######################################################################## 100.0% ######################################################################## 100.0% ==> ./configure --prefix=/usr/local/Cellar/icarus-verilog/0.9.5 ==> make ==> make installdirs ==> make install /usr/local/Cellar/icarus-verilog/0.9.5: 39 files, 12M, built in 55 seconds

Install Other Tools on iMac

Install CMake and Ninja with the following command:

Install Graphviz for displaying LLVM IR nodes during debugging [7].

Information about using Graphviz with LLVM is available in the section “SelectionDAG Instruction Selection Process” of “The LLVM Target-Independent Code Generator” [8], and in the section “Viewing graphs while debugging code” of the “LLVM Programmer’s Manual” [9].

Install binutils with the following command:

// get brew by the following ruby command if you don't have installed brew 118-165-77-214:~ Jonathan$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null 118-165-77-214:~ Jonathan$ brew install binutils ==> Downloading http://ftpmirror.gnu.org/binutils/binutils-2.22.tar.gz ######################################################################## 100.0% ==> ./configure --program-prefix=g --prefix=/usr/local/Cellar/binutils/2.22 --infodir=/usr/loca ==> make ==> make install /usr/local/Cellar/binutils/2.22: 90 files, 19M, built in 4.7 minutes 118-165-77-214:~ Jonathan$ ls /usr/local/Cellar/binutils/2.22 COPYING README lib ChangeLog bin share INSTALL_RECEIPT.json include x86_64-apple-darwin12.2.0 118-165-77-214:binutils-2.23 Jonathan$ ls /usr/local/Cellar/binutils/2.22/bin gaddr2line gc++filt gnm gobjdump greadelf gstrings gar gelfedit gobjcopy granlib gsize gstrip

Setting Up Your Linux Machine

Install Icarus Verilog tool on Linux

Download Icarus Verilog as follows [10].

$ git clone http://iverilog.icarus.com/

Follow the README or INSTALL file guide to install it.

Install sh autoconf.sh dependencies and other dependencies as follows,

$ pwd $ ~/git/iverilog $ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev
libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool
patchutils bc zlib1g-dev libexpat-dev $ sh autoconf.sh

Then install Icarus Verilog using the following commands,

$ ./configure // or below if you are in shared server $ ./configure --prefix=$HOME/local $ make $ make check

Install Other Tools on Linux

Install CMake and Ninja as follows,

$ pwd $ ~/local $ wget -b https://github.com/Kitware/CMake/releases/download/v3.23.3/cmake-3.23.3-linux-x86_64.sh $ bash cmake-3.23.3-linux-x86_64.sh Do you accept the license? [yn]: y By default the CMake will be installed in: "/u/jonathanchen/local/cmake-3.23.3-linux-x86_64" Do you want to include the subdirectory cmake-3.23.3-linux-x86_64? Saying no will install in: "/u/jonathanchen/local" [Yn]: Y ... Unpacking finished successfully $ ls bin cmake-3.23.3-linux-x86_64 ...

$ sudo apt install ninja-build

Download Graphviz from [11] according to your Linux distribution. The file comparison tool KDiff3 can be downloaded from the website [6].

$ sudo apt install graphviz $ dot -V dot - graphviz version 2.40.1 (20161225.0304)

Set ~/.profile as follows,

~/.profile

~/.profile: executed by the command interpreter for login shells. ...

set PATH so it includes user's private bin if it exists

if [ -d "$HOME/local/bin" ] ; then PATH="$HOME/local/bin:$PATH" fi

set PATH for cmake

if [ -d "$HOME/local/cmake-3.23.3-linux-x86_64/bin" ] ; then PATH="$HOME/local/cmake-3.23.3-linux-x86_64/bin:$PATH" fi ...

Toolchain

List some GNU and LLVM tools as follows,

// Linux ~/git/lbd/lbdex/input$ ~/llvm/debug/build/bin/clang -fpic hello.c ~/git/lbd/lbdex/input$ man ldd ldd - print shared object dependencies ~/git/lbd/lbdex/input$ ldd a.out linux-vdso.so.1 (0x00007fffd1fe5000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2c92a82000) /lib64/ld-linux-x86-64.so.2 (0x00007f2c92e73000)

// MacOS % man otool otool-classic - object file displaying tool ... -L Display the names and version numbers of the shared libraries that the object file uses, as well as the shared library ID if the file is a shared library. % otool -L a.out a.out: /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1292.100.5)

// Linux ~/git/lbd/lbdex/input$ man objcopy objcopy - copy and translate object files ... [-O bfdname|--output-target=bfdname] ~/git/lbd/lbdex/input$ objcopy -O verilog a.out a.hex ~/git/lbd/lbdex/input$ vi a.hex @00400238 2F 6C 69 62 36 34 2F 6C 64 2D 6C 69 6E 75 78 2D 78 38 36 2D 36 34 2E 73 6F 2E 32 00 @00400254 04 00 00 00 10 00 00 00 01 00 00 00 47 4E 55 00 ...