UBUNTU LLVM-CLANG安装以及HELLOWORLD PASS

UBUNTU LLVM-CLANG安装以及HELLOWORLD PASS

标签: LLVM初学  llvm

 

1.LLVM PROJECT安装

参考https://github.com/llvm/llvm-project以及https://github.com/whjthu/llvm-examples

1. Ubuntu版本为:
Linux version 5.3.0-42-generic
gcc version 7.4.0
ubuntu~18.04.1
2. LLVM project源码下载
GitHub源码:https://github.com/llvm/llvm-project
使用git clone https://github.com/llvm/llvm-project.git进行下载
下载速度过慢的话可以使用码云,例如我的码云:
git clone https://gitee.com/jkkkl33/llvm-project.git

3.编译安装
下载完毕后cd llvm-project进入文件夹,新建build文件夹:

mkdir build
cd build
  • 1
  • 2

build

cmake -G <generator> [options] ../llvm
  • 1

generator和options内容见GitHub页面,作者给出了一些常用选项。
如果想在Linux上安装release版本,则使用(此时在/llvm-project/build下):

cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm/
  • 1

若想安装带有libcxx 和libcxxabi的release版本,则使用

cmake -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi" -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release ../llvm/
  • 1

个人推荐第二种,之前使用第一种时出现了cmake时找不到头文件的报错,查询无果,换成第二种之后正常(我是新手)。
之后

make -j2
sudo make install
  • 1
  • 2

由于我使用的时虚拟机,因此使用了-j2,各位可根据自己硬件条件修改,到此编译安装完成。

2. HELLO PASS

仅记录操作,无代码解析。
在~/llvm-project/llvm/lib/Transforms目录下建立文件夹function-pass,在function-pass文件夹下建立build、MyFunctionPass两个文件夹,创建CMakeLists.txt文件,修改文件内容如下:

cmake_minimum_required(VERSION 3.4)

find_package(LLVM REQUIRED CONFIG)
add_definitions(${LLVM_DEFINITIONS})
include_directories(${LLVM_INCLUDE_DIRS})
link_directories(${LLVM_LIBRARY_DIRS})
set(CMAKE_CXX_STANDARD 14)

add_subdirectory(MyFunctionPass)  # Use your pass name here.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述
在MyFunctionPass文件夹内创建MyFunctionPass.cpp、CMakeLists.txt两个文件,修改MyFunctionPass.cpp内容为:

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"

using namespace llvm;

namespace {
    class MyFunctionPass : public FunctionPass {
    public:
        static char ID;

        MyFunctionPass() : FunctionPass(ID) {}

        virtual bool runOnFunction(Function &F) { 
            outs() << "Hello: ";
            outs().write_escaped(F.getName()) << "\n";
            return false;
        }
    };
}

char MyFunctionPass::ID = 0;

static RegisterPass<MyFunctionPass> X("myfunction", "My Function Pass");
static void registerPass(const PassManagerBuilder &,
                         legacy::PassManagerBase &PM) {
  PM.add(new MyFunctionPass());
}

static RegisterStandardPasses
    RegisterTheSpindlePass(PassManagerBuilder::EP_EarlyAsPossible, registerPass);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

修改CMakeLists.txt内容为:

add_library(MyFunctionPass MODULE
    # List your source files here.
    MyFunctionPass.cpp
)

# Use C++11 to compile your pass (i.e., supply -std=c++11).
target_compile_features(MyFunctionPass PRIVATE cxx_range_for cxx_auto_type)

# LLVM is (typically) built with no C++ RTTI. We need to match that;
# otherwise, we'll get linker errors about missing RTTI data.
set_target_properties(MyFunctionPass PROPERTIES
    COMPILE_FLAGS "-fno-rtti"
)

# Get proper shared-library behavior (where symbols are not necessarily
# resolved when the shared library is linked) on OS X.
if(APPLE)
    set_target_properties(MyFunctionPass PROPERTIES
        LINK_FLAGS "-undefined dynamic_lookup"
    )
endif(APPLE)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述
build环节:
进入~/llvm-project/llvm/lib/Transforms/function-pass/build,执行

export LLVM_DIR=/path/to/llvm-build/lib/cmake/llvm
cmake ..
make
  • 1
  • 2
  • 3

执行结果
执行结果
此时/function-pass/build/MyFunctionPass中会出现libMyFunctionPass.so
测试环节:
在build文件中新建待测试文件,例如我新建了test.c,内容如下:

void a(){}
void b(){
	a();a();
}
void c(){
	b();a();
}
void main(){
	a();c();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

执行

clang -Xclang -load -Xclang MyFunctionPass/libMyFunctionPass.so test.c
  • 1

结果为
在这里插入图片描述
到此pass结束

 
版权声明:本文为lpn19961107原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lpn19961107/article/details/105060604

posted on 2022-10-01 01:35  zxddesk  阅读(317)  评论(0编辑  收藏  举报

导航