Monday, January 23, 2017

Installing and Using LLVM Clang on Linux

Here are the specs (Hardware and software) of my machine
RAM: 8GB
Proc : Intel Core i7-4510U @ 2.00GHz
Linux mint 18 Cinnamon
word size - 64 bit
Kernel - 4.4.0-21-generic
swap Size - 10GB
HDD :  150GB

There are two ways of installing
1. Install from apt-get
2. Building from src files using tar.gz
Make sure to check this requirements.
GNU Make3.79, 3.79.1 Makefile/build processor
GCC >=4.8.0 C/C++ compiler
python >=2.7 Automated test suite
zlib >=1.2.3.4 Compression library //it worked without this

1. Install from apt-get

 $ sudo apt-get clang-3.9 llvm-3.9

Reference:  http://apt.llvm.org

2.  Building LLVM 3.9.1 from Source

  1. Download two tar file for llvm & clang from here
  2. Extract both the files inside some folder // say llvm
  3. Rename llvm-3.9.1.src folder as llvm-3.9 //LLVM_SRC
  4. Rename cfe-3.9.1.src folder as clang and move inside folder llvm-3.9/tools
  5. Create a folder llvm/llvm-build and cd llvm-build // LLVM_OBJ
  6. cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE="Release" -DLLVM_ENABLE_ASSERTIONS=On /home/rajz/install/llvm/llvm-3.9
  7. // after some time
  8. make -j2
  9. //after some more time
  10. sudo make install
  11. opt --version 
  12. clang --version 
  13. //Done
References: 
1. http://llvm.org/docs/GettingStarted.html
2. https://www.youtube.com/watch?v=4iVc204omI0
3. http://llvm.org/docs/CMake.html

Writing a Sample Pass using LLVM
1. Source folder for LLVM:
    ~/install/llvm/llvm-3.9
2. Build folder for LLVM:
    ~/install/llvm/llvm-build
3. Create a CMakeLists.txt file as below
   add_llvm_loadable_module( LLVMSample
        Sample.cpp
        PLUGIN_TOOL
        opt
        )
4. Create the Sample.cpp as below
#include "llvm/IR/Function.h"
#include "llvm/Pass.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
struct Sample : public FunctionPass {
  static char ID;
  Sample() : FunctionPass(ID) {}

  bool runOnFunction(Function &F) override {
    errs() << "Sample: ";
    errs().write_escaped(F.getName()) << '\n';
    return false;
  }
}; // end of struct Sample
} // end of anonymous namespace

char Sample::ID = 0;
static RegisterPass X("sample", "Sample Hello World Pass ",
                              false /* Only looks at CFG */,
                              false /* Analysis Pass */);
5. Sample pass folders at:
    ~/install/llvm/llvm-3.9/lib/Analysis/Sample (contains Sample.cpp and CMakeLists.txt)
    ~/install/llvm/llvm-build/lib/Analysis/Sample (contains only the CMakeLists.txt)
6. Append a line in ~/install/llvm/llvm-3.9/lib/Analysis/CMakeLists.txt

       add_subdirectory(Sample)

7. Created shared library at ~/install/llvm/llvm-build/lib/LLVMSample.so

       $ cd ~/install/llvm/llvm-build
       $ make

8. To run analysis on a test1.c program:
    $ clang -S -O0 -emit-llvm test1.c -o test1.ll
    $ opt -load ~/install/llvm/llvm-build/lib/LLVMSample.so -disable-output -sample test1.ll

Reference
1. http://llvm.org/docs/WritingAnLLVMPass.html
2. AMR, PA TAs

Last Post !! Moved to new site

As I am getting old 😋, it seem like I can not remember many of my earlier tech encounters. This is the place I was logging so that I refer ...