2312llvm,读写位码

如何读写LLVM位码

首先,看看一些高级LLVM术语:
1,LLVM对用户代码的主要抽象模块.它是一个包含用户编写所有函数,全局变量和指令的类.
2,Bitcode文件是LLVM模块的序化,以便以后可在不同程序中重建它.
3,LLVM使用MemoryBuffer对象来处理文件,stdin数组等数据.

示例中,使用LLVMCAPI.这是LLVM核心C++头文件之上的更稳定的抽象.如果有想同多个版本的LLVM工作的代码,CAPI非常有用,它比LLVMC++头文件稳定得多.
顺便,我在工作中广泛使用LLVM,几乎每周都会有一些LLVMC++头文件更改会破坏代码.而CAPI没有破坏代码.
首先,假设你已拉取了LLVM,构建并安装了它.一些简单的步骤可完成:

git clone https://git.llvm.org/git/llvm.git <llvm dir>
cd <llvm dir>
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=install ..
cmake --build . --target install

完成上述操作后,你就在<llvmdir>/build/install中安装了一个LLVM!
因此,对小可执行文件,使用了CMake.CMake迄今为止是与LLVM整合的最简单方法,因为它也是LLVM使用的构建系统.

project(llvm_bc_parsing_example)
cmake_minimum_required(VERSION 3.4.3)
//允许用户指定`LLVM`在系统上安装位置的选项
set(LLVM_INSTALL_DIR "" CACHE STRING "An LLVM install directory.")
if("${LLVM_INSTALL_DIR}" STREQUAL "")
message(FATAL_ERROR "LLVM_INSTALL_DIR not set! Set it to the location of an LLVM install.")
endif()
//修复路径以仅使用`Linux`约定
string(REPLACE "\\" "/" LLVM_INSTALL_DIR ${LLVM_INSTALL_DIR})
//告诉`CMake`,`LLVM`的模块在哪
list(APPEND CMAKE_MODULE_PATH ${LLVM_INSTALL_DIR}/lib/cmake/llvm)
//包括`LLVM`
include(LLVMConfig)
add_executable(llvm_bc_parsing_example main.c)
target_include_directories(llvm_bc_parsing_example PUBLIC ${LLVM_INCLUDE_DIRS})
target_link_libraries(llvm_bc_parsing_example PUBLIC LLVMBitReader LLVMBitWriter)

现在已安装好CMake,可用现有的LLVM安装目录,现在可处理实际C代码了!
因此,要使用LLVMCAPI,基本上总是需要个头文件:

#include <llvm-c/Core.h>

可执行文件需要两个额外头文件,即位码读取器和写入器:

#include <llvm-c/BitReader.h>
#include <llvm-c/BitWriter.h>

现在创建main函数.在此假设总是正好接受2个命令行参数,第一个是输入文件,第二个是输出文件.LLVM有一个系统,如果提供了叫"-"的文件,即从stdin读写stdout,所以我决定也支持它:

if (3 != argc) {fprintf(stderr, "Invalid command line!\n");return 1;
}
const char *const inputFilename = argv[1];
const char *const outputFilename = argv[2];

因此,首先解析输入文件.从stdin或文件名创建一个LLVM内存缓冲对象:

LLVMMemoryBufferRef memoryBuffer;
//检查是否要从`stdin`读取输入文件
if (('-' == inputFilename[0]) && ('\0' == inputFilename[1])) {char *message;if (0 != LLVMCreateMemoryBufferWithSTDIN(&memoryBuffer, &message)) {fprintf(stderr, "%s\n", message);free(message);return 1;}
} else {char *message;if (0 != LLVMCreateMemoryBufferWithContentsOfFile( inputFilename, &memoryBuffer, &message)) {fprintf(stderr, "%s\n", message);free(message);return 1;}
}

因此,此代码后,可用memoryBuffer读取位码文件LLVM模块中.因此,创建模块!

//现在使用内存缓冲创建的模块
LLVMModuleRef module;
if (0 != LLVMParseBitcode2(memoryBuffer, &module)) {fprintf(stderr, "Invalid bitcode detected!\n");LLVMDisposeMemoryBuffer(memoryBuffer);return 1;
}
//现在使用内存缓冲完成,因此释放掉它
LLVMDisposeMemoryBuffer(memoryBuffer);

一旦有了模块,就不需要内存缓冲,因此可立即释放内存.就这样!取LLVM位码文件,并反序化为LLVM模块.
因此,假设已完成了LLVM模块的所有操作,并想再次写回位码文件.
读取方法一样,查找特殊文件名"-"并相应处理:

//检查是否要把输出文件写入`stdout`
if (('-' == outputFilename[0]) && ('\0' == outputFilename[1])) {if (0 != LLVMWriteBitcodeToFD(module, STDOUT_FILENO, 0, 0)) {fprintf(stderr, "Failed to write bitcode to stdout!\n");LLVMDisposeModule(module);return 1;}
} else {if (0 != LLVMWriteBitcodeToFile(module, outputFilename)) {fprintf(stderr, "Failed to write bitcode to file!\n");LLVMDisposeModule(module);return 1;}
}

最后,清理垃圾,所以删除模块:

LLVMDisposeModule(module);

就这样!现在,可解析并写LLVM位码文件.完整的示例在此

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

漏刻有时数据可视化Echarts组件开发(44)提示框组件与返回多边形

CSS样式表 #lock_box {padding: 0;margin: 0;height: 100%;width: 100%;}.tipsBox {background: transparent url("images/tipsbg.png") top center no-repeat;width: 260px;height: 203px;box-shadow: none;}.tipsBox > p:first-child {padding-left: 35px;font…

git的安装及使用

git的安装及使用 git的安装 官网地址&#xff1a;https://git-scm.com/download/win 在任何位置输入bash或sh,进入git 设置用户名邮箱。 git config --global user.name “wfyfly” git config --global user.email 2423217861qq.com 查看配置信息 git config --list --globa…

C++核心编程思路(1):①程序的内存模型②引用的作用

文章目录 前言一、不同的存储类型变量&#xff0c;会被存储在什么区&#xff1f;①const修饰的局部变量放在栈区&#xff0c;全局变量放在只读数据区。②static修饰的全局和局部变量都放在静态区&#xff08;即数据区中的一个小区&#xff09; 二、栈区1.如果在函数A中定义了一…

基于SpringBoot和微信小程序的农场信息管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot和微信小程序的农场信息管…

2019年AMC8数学竞赛真题的典型考点和详细解析

从战争中学习战争。 对于2024年1月19日的AMC8竞赛&#xff0c;最后一个月的时间如何备考和冲刺取得更好的成绩&#xff1f;很多高分考生的经验是刷真题&#xff0c;查漏补缺。那么如何提高刷真题的效率呢&#xff1f;使用六分成长独家制作的在线真题集练习是个不错的方式&…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(四)linux安装Mysql

1.切换到你需要安装mysql的路径 cd /root/usr/ 2.在线安装 安装网上的安装方式都有很多&#xff0c;可以自己百度一下 我们这里是自己搭建测试环境&#xff0c;可以直接选择在线安装&#xff0c;命令如下&#xff1a;yum install mysql-server&#xff0c; 但是我失败了 ┭┮…

【C++11特性篇】C++11中新增的initializer_list——初始化的小利器(2)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C11系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.探究std::initializer_list是什么…

【MySQL】SQL通用语法 、介绍SQL分类

SQL通用语法 1.SQL语句可以单行或多行书写&#xff0c;以分号结尾 2.MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写。 3.注释&#xff1a; 单行注释&#xff1a; -- 或 # 多行注释: /* */ SQL分类 SQL分类主要分为4类 分别是 DDL DML DQL DCL

谷歌浏览器标签页显示内存使用率

Chrome 桌面浏览器的新更新现在可让您查看每个标签页占用了多少内存&#xff0c;这可以帮助您确定哪些标签页占用了多少内存&#xff0c;网站正在减慢您笔记本电脑的速度。 今年早些时候在 Google Chrome 中引入内存节省程序之后&#xff0c;Google 又发布了一项功能&#xff…

论文阅读:PointCLIP V2: Prompting CLIP and GPT for Powerful3D Open-world Learning

https://arxiv.org/abs/2211.11682 0 Abstract 大规模的预训练模型在视觉和语言任务的开放世界中都表现出了良好的表现。然而&#xff0c;它们在三维点云上的传输能力仍然有限&#xff0c;仅局限于分类任务。在本文中&#xff0c;我们首先协作CLIP和GPT成为一个统一的3D开放世…

科大讯飞(深圳)测开面试真题

一面&#xff08;测试组长面&#xff09; 1、上家公司项目以及团队的规模是怎么样的&#xff1f; 2、你负责的项目整体的流程是怎么样的&#xff1f; 3、自动化实施过程中&#xff0c;是如何和业务测试进行沟通的&#xff1f; 4、在上家公司你已经是专职做自动化了&#xf…

医药行业的数据安全革新者:上海迅软DSE成功案例揭秘

随着网络化办公在医药企业中不断的深入应用&#xff0c;企业内部的药品保密配方、研发成果、技术资料等重要信息都散布在电脑或流转于网络之中&#xff0c;同时各种内部系统又集中存放着大量的敏感数据&#xff0c;一旦这些数据资产发生泄密&#xff0c;将对企业的持续运营造成…

基础IO --- 下

目录 1. 理解文件系统中inode的概念 1.1. 了解磁盘 1.1.1. 认识磁盘 1.1.2. 磁盘的物理结构 1.1.3. 简单了解磁盘如何读写数据的 1.1.4. 磁头和盘面没有物理上的接触 1.1.5. 扇区的了解 1.1.6. 如何在物理上找到一个具体的扇区 1.2. 站在OS的角度看待磁盘 1.2.1. …

uniapp websocket 消息队列 例子

UniApp的localStorage可以用来存储和读取数据&#xff0c;但它本身并不是一个消息队列。消息队列是一种用于在应用程序之间传递消息的技术&#xff0c;它具有特定的特性&#xff0c;如消息的持久化、消息的顺序性、消息的消费等。 如果你想在UniApp中实现类似消息队列的功能&a…

springboot中的一些重要的注解

RestController和Controller的区别 返回值不同&#xff1a; RestController注解用于RESTful风格的控制器&#xff0c;它的方法默认返回JSON或XML格式的数据&#xff0c;不会进行视图渲染。通常用于构建Web服务API。Controller注解用于传统的MVC控制器&#xff0c;它的方法通常…

OSG中几何体的绘制(一)

本章主要介绍一些几何体的绘制方法。绘制几何体在场景中是非常常见的&#xff0c;也是最基本的。在很多应用程序中可以看到相当复杂的场景&#xff0c;但不管场景有多复杂&#xff0c;它们都是由少数几个基本的图形元素构建而成的。只要想想达芬奇那些伟大的作品也是由铅笔和画…

leetcode上升的温度再复习-笛卡尔积(交叉连接)-日期加减函数

重新做上升的温度这一题的时候&#xff0c;看到之前很多的题解&#xff0c;这里结合一些题解看看有什么能学到的&#xff0c;其实这一题我现在返回来看&#xff0c;刚开始看依旧没有思路&#xff0c;还是看了题解才有想法。 理一下学习的思路:这一题就是需要通过连接解题&…

Docker部署wordpress和Jenkins

准备机器&#xff1a; 192.168.58.151 &#xff08;关闭防火墙和selinux&#xff09; 安装好docker服务 &#xff08;详细参照&#xff1a;http://t.csdnimg.cn/usG0s 中的国内源安装docker&#xff09; 部署wordpress: 创建目录&#xff1a; [rootdocker ~]# mkdi…

Unity 使用Input.GetAxis(“Horizontal/Vertical“)移动鼠标没反应的原因

在Unity中&#xff0c;当我们使用Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")通过鼠标移动的返回数值以控制物体移动或其它操作时&#xff0c;却没有反应&#xff0c;令人费解。 首先我们获取返回数值并打印&#xff1a; float horizontal …

TensorFlow神经网络中间层的可视化

TensorFlow神经网络中间层的可视化 TensorFlow神经网络中间层的可视化1. 训练网络并保存为.h5文件2. 通过.h5文件导入网络3. 可视化网络中间层结果&#xff08;1&#xff09;索引取层可视化&#xff08;2&#xff09;通过名字取层可视化 TensorFlow神经网络中间层的可视化 1. …