Ubuntu LLVM-CLang安装以及Helloworld pass

2023-11-05

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

build

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

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

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

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

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

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

make -j2
sudo make install

由于我使用的时虚拟机,因此使用了-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.

在这里插入图片描述
在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);

修改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)

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

export LLVM_DIR=/path/to/llvm-build/lib/cmake/llvm
cmake ..
make

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

void a(){}
void b(){
	a();a();
}
void c(){
	b();a();
}
void main(){
	a();c();
}

执行

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu LLVM-CLang安装以及Helloworld pass 的相关文章

  • 使用 readability-identifier-naming 时,clang-tidy 将名称空间视为全局变量

    我正在使用 clang tidy 来检查源代码 在文件中 clang tidy我定义 Checks readability identifier naming CheckOptions key readability identifier
  • Debian 8 上的 Python numba / llvmlite - 我无法构建 llvmlite

    我尝试在 Debian 8 系统上安装 numba 如下所述 http llvmlite pydata org en latest install index html http llvmlite pydata org en latest
  • 错误:未定义模板 'llvm::yaml::MissingTrait 的隐式实例化

    我正在开发一个使用 LLVM YAML I O 库的项目 这是我正在遵循的文档 教程 https www llvm org docs YamlIO html https www llvm org docs YamlIO html 我正在尝试
  • 使用 LLVM pass 添加内在函数

    我使用 LLVM 通道向输入代码添加了一个内在函数 我能够看到内部调用 但我无法弄清楚如何将代码编译到我的目标架构 x86 64 我正在运行以下命令 clang llvm config ldflags libs all ff s o foo
  • 如何使用 Clang 编码生成未使用的声明? [复制]

    这个问题在这里已经有答案了 我正在寻找代码生成一个llvm Module来自一些 C 代码 具体来说 我将混合 Clang 生成的代码和其他来源的代码 不幸的是 铿锵CodeGenModule如果存在使用它的定义 类似乎坚持只在模块中生成声
  • 通过修改LLVM Backend来Clobber X86寄存器

    我正在尝试稍微改变 X86 目标的 LLVM 后端 以产生一些所需的行为 更具体地说 我想模拟一个像 gcc 的 fcall used 这样的标志reg option https gcc gnu org onlinedocs gcc Cod
  • 如何告诉 Clang 不要冒充其他编译器?

    我过去遇到过这个问题 LLVM 定义 GNUC https www google com search q 22 GNUC 22 LLVM bug 但它不能使用 GCC 可以使用的程序 我在 Windows 上再次遇到它 LLVM 定义 M
  • 链接不支持异常处理的代码 (C++/LLVM)

    我正在尝试使用 llvm 作为我的软件的代码生成后端 并且刚刚意识到 llvm 的编译不支持 C 异常处理 为了提高效率 然而 在我的软件中 我广泛使用异常处理 如果我将所有回调函数包装在 try catch blocks 中 这样就不需要
  • LLVM 的 amd64 输出中向量的对齐

    我正在尝试通过 LLVM 在结构内部使用向量 我的结构有以下 C 定义 struct Foo uint32 t len uint32 t data 32 attribute aligned 16 下面是一些 LLVM 代码 用于将 42 添
  • LLVM 执行哪些优化?

    我想具体了解一下LLVM的各个优化级别分别对应什么 也就是说 我想知道当我使用 llvm 或 clang 或 opt 的 0x 选项时 哪些优化过程是准确执行的 在前端之外 以及按什么顺序执行 相应工具的 man 没有提供关于此事的太多信息
  • 是否有像 pygccxml 一样的 Python Clang 包装器来包装 GCC-XML?

    很长一段时间以来 我一直在使用 pygccxml 来解析和内省我的 C 源代码 它帮助我在构建过程中进行一些巧妙的代码生成 最近我读了很多关于 LLVM 堆栈的好处 特别是 LLVM Clang 解析器给 C 编译带来的好处 我现在想知道
  • 构建 LLVM 失败并显示空错误消息

    我正在尝试构建 LLVM 3 1 和 Clang 3 1 我遵循了入门指南铿锵的网站 http clang llvm org get started html 检查必要位置的存储库 获取 Python 等 如果我安装了 Python 3 3
  • 使用带有空格的 CMake 的 include_directories 命令

    我正在使用 CMake 来构建我的项目 并且有以下行 include directories LLVM INCLUDE DIRS 评估后LLVM INCLUDE DIRS 评估为 include directories C Program
  • 如何在 Xcode 中禁用一个文件的优化

    我的 Xcode 项目依赖于另一个库 当我使用以下命令构建项目时 这会导致项目出现错误 O3 option 这些错误仅存在于一个文件中 所以我想关掉 O3 该文件的选项 是否可以 打开目标 看下Build Phases 打开Compile
  • 是否可以在 LLVM IR 代码中指定十六进制数?

    例如 error floating point constant invalid for type 3 and i8 0x80 2 从扫描的红外参考手册 http llvm org docs LangRef html simple cons
  • 如何编译LLVM Kaleidscope教程?

    我之前一直在 C 中使用 LLVM 其中包含一个 Nuget LLVM 库 我转向 C 并尝试遵循万花筒教程 https llvm org docs tutorial LangImpl03 html 不幸的是我不知道如何编译它 我保存了第三
  • C++11 的 LLVM&Clang 支持

    我有一些为 MS VC 10 编写的代码 我使用 C 11 特别是像这样的表达式 std function
  • XCode 4.2 编译器错误

    当我使用 XCode 4 2 创建新项目 例如 单视图 iOS 应用程序 时 支持文件 文件夹中的 main m 文件如下所示 import
  • 通过 cmake 链接 libc++ 时 libc++abi 的链接问题

    我正在尝试构建一个简单的 hello world C 使用 LLVM Clang 3 7 0 的程序 根据工具链的源代码构建libc 使用命令行 clang std c 14 stdlib libc fno exceptions hello
  • gcc 与 clang:符号剥离

    gcc 和 AMD Open64 opencc 都有一个 s选项 剥离符号表和重定位信息 到目前为止我还没能在 Clang LLVM 中找到相同的选项 它存在吗 您可以使用stripbinutils 中的实用程序 实际上 llvm ld 有

随机推荐

  • frpc windows客户端启动报EOF的问题

    frpc windows客户端使用启动命令 frpc exe c frpc ini启动时会报错EOF 如下图 此时查看frpc log日志 可以发现报错为 也就是连接frps服务端失败了 可以在frpc ini配置文件中添加一行配置 也就是
  • tomcat 配置环境变量

    最近换电脑 备注一下 tomcat 环境变量配置 1 官网下载 tomcat 并解压 tomcat官网 https tomcat apache org 选择要下载的版本 下载 根据自己的电脑环境选择下载 笔者电脑是64位windows 下载
  • 基于邻接矩阵的广度优先搜索遍历

    数据结构实验图论一 基于邻接矩阵的广度优先搜索遍历 Time Limit 1000MS Memory limit 65536K 题目描述 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列
  • Mybatis常用代码

    以下使用的数据库是Mysql Mybatis字段类型映射 在resultMap 中定义数据库字段对应的字段类型
  • C++ 类 :有参数构造函数与无参数构造函数使用注意事项

    构造函数的作用是在创建类的对象时进行类对象初始化的 在 C 中 每个类都有且必须有构造函数 如果用户没有自行编写构造函数 则 C 自动提供一个无参数的构造函数 称为默认构造函数 这个默认构造函数不做任何初始化工作 一旦用户编写了构造函数 则
  • BufferReader与BufferInputStream 区别及用法

    以reader结尾的都是以字符方式读入 而以stream结尾的都是字节形式 import java io BufferedReader import java io FileInputStream import java io IOExce
  • can差分线阻抗_CAN最全知识点汇总

    最近在学习CAN通讯 花费好多时间搜索资料 网络上大多数资料都是泛泛而谈 或者只是将CAN标准的文字罗列出来 看起来不够直观 不过 也找到了一些写的很好的资料 我将这些资料中对CAN知识点描述比较好的部分汇总起来并在某些地方添加一些例子 方
  • Redis模糊匹配并删除Key

    文章目录 1 登录可以连接Redis的机器 安装Redis 2 执行以下命令 删除模糊匹配到的Key 3 案例 4 相关文章 1 登录可以连接Redis的机器 安装Redis 详情请参见redis cli连接 2 执行以下命令 删除模糊匹配
  • 《python数据分析与挖掘实战》笔记第4章

    文章目录 第4章 数据预处理 4 1 数据清洗 4 1 1 缺失值处理 4 1 1 异常值处理 4 2 数据集成 4 2 1 实体识别 4 2 2 冗余属性识别 4 3 数据变换 4 3 1 简单函数变换 4 3 2 规范化 4 3 3 连
  • HDS存储链路的一个问题

    新上线的HDS AMS1000 由于光纤交换机还未到位 于是先采用两块光纤卡与存储直连的方式连接 安装配置时一切正常 第二天回到公司 进行性能测试时 发现dd copy的速度只能到100M s的速度 真是晕死 more 于是开始查原因 在d
  • 使用公式与格式控制Excel快速实现计划甘特图

    项目中都会遇到做任务计划的需求 有的客户要求需要有甘特图的形式 本文介绍如何使用excel 单元格实现甘特图显示 调整任务时间自动填充单元格填色实现甘特图效果 废话不多说 先看效果 准备工作先创建两列开始时间与完成时间 这样有一个时间区间了
  • 共享库的兼容性

    1 共享库的更新 1 由于Bug的修正 新功能的增加 性能的提升 共享库需要不断的更新版本 2 共享库的更新可以被分为两类 兼容性更新和不兼容更新 3 不兼容更新 共享库改变了原有的接口 使用该共享库原有接口的程序可能不能运行或者运行不正常
  • java连接sqlserver2005 tcp 有时超时,sqlserver 2005连接超时采用bat命令解决

    将以下内容保存为 openSql bat 双击运行即可 echo SQL Server Ports echo Enabling SQLServer default instance port 1433 netsh firewall set
  • MoveIt编程实现笛卡尔空间机械臂运动

    前两篇文章是关于在关节空间中进行机械臂的运动控制 MoveIt简单编程实现关节空间机械臂运动 逆运动学 MoveIt简单编程实现关节空间机械臂运动 正运动学 通过对关节空间下的机器人6个轴进行控制 每个轴的变化都是通过插补进行完成运动 六个
  • vue从node服务器获取文件,前端全栈入门(1)Vue+nodejs(express) 实现文件上传

    Vue Nodejs 实现图片上传 图片上传在平时的业务开发中应该算是个标配的需求 这里分享下使用Vue和Nodejs简单的实现下该需求 流程图 简单画一个 使用 vue cli 创建一个最简单的 vue 项目 确保 vue cli 是最新
  • 2019,那些属于飞桨的重要时刻

    2019已经悄然落幕 在过去一年中 飞桨加速崛起 在产品性能上高效迭代 并屡次斩获多项大奖 其取得的成绩有目共睹 这也意味着飞桨正领衔中国深度学习框架迎来高光时刻 现在 让我们一起来回顾一下2019关于飞桨的那些重要记忆 01 核心发布 一
  • CPU的原理

    其实CPU主要就是做运算 那么运算的本质其实就是加减乘除 也就是说你在电脑上做得任何操作 对于计算机来说 都是加减乘除 晶体管的组成 首先CPU有个很重要的电子元件 晶体管 晶体管由半导体组成 大概长下面这样 我们把1称为输入端 3称为输出
  • dorabox靶场writeup

    靶场搭建 这里我直接采用Windows下的wamp集成环境 直接将靶场源码下载到本地 解压到网站根目录即可 网站源码下载地址 https github com Acmesec DoraBox 数据库的配置 修改conn php的数据库连接账
  • c语言字 字符串转换成数组_C语言基础--数组

    数组的定义 为什么要使用数组 单一的变量很难满足需求 这个时候多变量的集合数组出现了 数组的定义 类型 数组名 数组大小 int 类型可以是int double float char 这些基本数据类型中的任意一种 数组的初始化 int 数组
  • Ubuntu LLVM-CLang安装以及Helloworld pass

    1 LLVM project安装 参考https github com llvm llvm project以及https github com whjthu llvm examples 1 Ubuntu版本为 Linux version 5