手工将一个 llvm IR 汇编代码解析成为 bitcode 文件

1,原始c语言文件

sum.c

int sum(int a, int b)
{return a+b;
}

2,编译成为 LLVM-IR 汇编语言

clang sum.c -emit-llvm -S -c -o sum.ll

3,手工把 llvm IR 汇编语言解析成 bitcode

3.1,源码

gen_llvm_ir.cpp

#include <llvm/ADT/SmallVector.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/CallingConv.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Instructions.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/Bitcode/ReaderWriter.h>
#include <llvm/Support/FileSystem.h>
#include <llvm/Support/ToolOutputFile.h>
using namespace llvm;//手工解析 sum.ll 成为 bitcode
Module *makeLLVMModule() 
{Module *mod = new Module("sum.ll", getGlobalContext());SmallVector<Type*, 2> FuncTyArgs;FuncTyArgs.push_back(IntegerType::get(mod->getContext(), 32));FuncTyArgs.push_back(IntegerType::get(mod->getContext(), 32));FunctionType *FuncTy = FunctionType::get(IntegerType::get(mod->getContext(), 32), FuncTyArgs, false);// define function sum return type;Function *funcSum =	Function::Create(FuncTy, GlobalValue::ExternalLinkage, "sum", mod);//define Function objectfuncSum->setCallingConv(CallingConv::C);Function::arg_iterator args = funcSum->arg_begin();// define arguments of sum()Value *int32_a = args++;int32_a->setName("a");// name the first argumentValue *int32_b = args++;int32_b->setName("b");// name the second argumentBasicBlock *labelEntry = BasicBlock::Create(mod->getContext(), "entry", funcSum, 0);// define entry of function AllocaInst *ptrA = new AllocaInst(IntegerType::get(mod->getContext(), 32), "a.addr", labelEntry); // %a.addr = alloca i32, align 4ptrA->setAlignment(4);AllocaInst *ptrB = new AllocaInst(IntegerType::get(mod->getContext(), 32), "b.addr", labelEntry); // %b.addr = alloca i32, align 4ptrB->setAlignment(4);StoreInst *st0 = new StoreInst(int32_a, ptrA, false, labelEntry);// store i32 %a, i32* %a.addr, align 4st0->setAlignment(4);StoreInst *st1 = new StoreInst(int32_b, ptrB, false, labelEntry);// store i32 %b, i32* %b.addr, align 4st1->setAlignment(4);LoadInst *ld0 = new LoadInst(ptrA, "", false, labelEntry);// %0 = load i32* %a.addr, align 4ld0->setAlignment(4);LoadInst *ld1 = new LoadInst(ptrB, "", false, labelEntry);// %1 = load i32* %b.addr, align 4ld1->setAlignment(4);BinaryOperator *addRes = BinaryOperator::Create(Instruction::Add, ld0, ld1,	"add", labelEntry);//%add = add msw i32 %0, %1ReturnInst::Create(mod->getContext(), addRes, labelEntry);// ret i32 %addreturn mod;
}int main(int argc, char **argv) 
{Module *Mod = makeLLVMModule();std::string ErrorInfo;std::unique_ptr<tool_output_file> Out(new tool_output_file("./sum.bc", ErrorInfo, sys::fs::F_None));if (!ErrorInfo.empty()) {errs() << ErrorInfo << "\n";return -1;}WriteBitcodeToFile(Mod, Out->os());Out->keep();return 0;
}

Makefile

LLVM_CONFIG ?= llvm-config
#CXX := clang++
ifndef VERBOSE
QUIET :=@
endifSRC_DIR ?= $(PWD)
LDFLAGS += $(shell $(LLVM_CONFIG) --ldflags) 
COMMON_FLAGS = -Wall -Wextra
CXXFLAGS += $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags)
LCXX :=$(shell $(LLVM_CONFIG) --cxxflags)
CPPFLAGS += $(shell $(LLVM_CONFIG) --cppflags) -I$(SRC_DIR)CLANGLIBS = \-Wl,--start-group \-lclang \-lclangFrontend \-lclangDriver \-lclangSerialization \-lclangParse \-lclangSema \-lclangAnalysis \-lclangEdit \-lclangAST \-lclangLex \-lclangBasic \-Wl,--end-groupLLVMLIBS = $(shell $(LLVM_CONFIG) --libs)PROJECT = gen_llvm_ir
PROJECT_OBJECTS = gen_llvm_ir.odefault: $(PROJECT)%.o : $(SRC_DIR)/%.cpp@echo Compiling $*.cpp$(QUIET)$(CXX) -c $(CPFLAGS) $(CXXFLAGS) $<$(PROJECT) : $(PROJECT_OBJECTS) @echo Linking $@$(QUIET)$(CXX) -o $@ $(LDFLAGS) $^ $(CLANGLIBS) $(LLVMLIBS) -lncurses.PHONY: clean
clean:$(QUIET)rm -f $(PROJECT) $(PROJECT_OBJECTS).PHONY: echo
echo:@echo "CXX 	is	$(CXX)"@echo "LDFLAGS 	is	$(LDFLAGS)}"@echo "CXXFLAGS	is	$(CXXFLAGS)"@echo "CPPFLAGS	is	$(CPPFLAGS)"@echo "SRC_DIR	is	$(SRC_DIR)"

3.2,测试

注意:

使用 llvm-dis 出来的 sum.ll 文件中,最后的%add = add i32 %0, %1中,没有nsw关键字。

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

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

相关文章

Sora:AI视频模型的无限可能与挑战

随着人工智能技术的突飞猛进&#xff0c;AI视频模型已成为科技领域的新焦点。OpenAI推出的AI视频模型Sora&#xff0c;凭借其卓越的技术性能和前瞻性&#xff0c;为AI视频领域的发展揭开了新的篇章。本文将从技术解析、应用场景、未来展望、伦理与创意以及用户体验与互动五个方…

iOS小技能:苹果书签打包教程【WebClip描述文件(WebClip Configuration Profile)】

文章目录 引言I WebClip描述文件1.1 属性说明1.2 利用Apple Configurator 2生成描述文件II 部署方式和签名2.1 对 .mobileconfig 文件进行签名2.2 部署方式引言 WebClip描述文件(WebClip Configuration Profile)是一种用于iOS设备的简易配置文件,它可以在你的iOS设备(如iP…

Xilinx高级调试方法--远程调试

Xilinx高级调试方法--远程调试 1 虚拟电缆调试2 FPGA设计2.1 扩展配置接口 3 PCIe-XVC驱动3.1 PCIe-XVC驱动3.2 XVC-Server 4 Vivado Design Suite4.1 同一台主机4.2 不同主机 本文主要介绍Xilinx的一些高级调试方法&#xff0c;以及如何使用Xilinx的相关IP。 1 虚拟电缆调试 …

数据结构(二)——线性表

二、线性表 2.1线性表的定义和基本操作 2.1.1 线性表的基本概念 线性表&#xff1a;是具有相同数据类型的 n 个数据元素的有限序列。(Eg:所有的整数按递增次序排列&#xff0c;不是顺序表&#xff0c;因为所有的整数是无限的)其中n为表长&#xff0c;当n0时线性表是一个空表…

DBSCAN的简要介绍和示例代码(对一维数据进行聚类)

一、简要介绍 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种常用的密度聚类算法&#xff0c;适用于发现任意形状的聚类簇&#xff0c;并且可以有效处理噪声数据。以下是关于DBSCAN的简要介绍&#xff1a; 密度概念&#…

AI领域再出“王炸“----Claude3是否会成为下一个“神“

目录 一.Claude3最新发布 二.Claude3支持20万token 三.Claude3在未公开算法上取得重大突破 1.Claude 3读懂博士论文 2.量子跃迁集成&#xff1a; Claude 3智商&#xff1a;101 测试方法 测试细节 通过Karpathy挑战 Claude 3自画像&#xff0c;突破本我 从洛杉矶排到…

UR机器人装箱姿态

1.官网手册上并没有给出该打包位姿 2.一般厂家发回来的机器人都会有这个打包程序 可以运行这个程序&#xff0c;如果有的话。 3.打包点位 如果没有这个这个&#xff0c;也可以直接按下面点位来&#xff0c;都是差不多的点位&#xff0c;可以放到包装箱中的 这个是UR10的 这个…

Vulnhub靶机:Billu_b0x

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Billu_b0x&#xff08;192.168.56.107&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhu…

智慧城市中的数据力量:大数据与AI的应用

目录 一、引言 二、大数据与AI技术的融合 三、大数据与AI在智慧城市中的应用 1、智慧交通 2、智慧环保 3、智慧公共安全 4、智慧公共服务 四、大数据与AI在智慧城市中的价值 1、提高城市管理的效率和水平 2、优化城市资源的配置和利用 3、提升市民的生活质量和幸福感…

【简单模拟】第十三届蓝桥杯省赛C++ B组《刷题统计》(c++)

1.题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。 他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。 请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n 题&#xff1f; 2.输入格式 输入一行包含三个整数 a,b 和 n。…

Vue+腾讯地图-实现关键词输入提示功能

不废话&#xff0c;上代码~~~ 效果图&#xff1a; 1、先去腾讯地图后台创建自己的应用获取到应用的 Key 腾讯地图后台地址&#xff1a;腾讯位置服务 - 立足生态&#xff0c;连接未来 创建应用的 Key 如下&#xff1a; 2、在项目中添加腾讯地图API的js插件&#xff0c;如…

CCF-A推荐会议 安全界顶会ACM CCS‘24 4月29日第二轮投稿!共建更安全的数字世界!

会议之眼 快讯 第31届ACM CCS (ACM Conference on Computer and Communications Security)即计算机和通信安全会议将于 2024 年 10月14日-18日在美国盐湖城举行&#xff01;CCS是美国计算机协会(ACM)安全、审计与控制特别兴趣小组(SIGSAC)主办的一年一度的重要会议。是SIGSAC的…

Mint_21.3 drawing-area和goocanvas的FB笔记(三)

一、改变goocanvas线条自动画线时间间隔 通过系统SIGALRM信号触发&#xff0c;每秒画一条线对于慢温湿度等慢变信号可以应付&#xff0c;但对于快速信号1秒的间隔就太慢了。可以改变方式&#xff0c;通过另外的线程&#xff0c;完成要做的任务。 1. 线程的回调函数 myfunc 2…

Python读取influxDB数据库

1. influxDB连接 首先用InfluxDBStudio软件连接influxDB数据库来查看所有表&#xff1a; 2. 写sql语句来查询数据 然后和平时写sql查询语句一样&#xff0c;先创建连接client&#xff0c;然后调用其query函数来查询获取数据 self.client influxdb.InfluxDBClient(hostinflu…

抖店怎么做起来?2024新版操作逻辑,做项目要做一米宽万米深

我是王路飞。 不知不觉间&#xff0c;我已经在抖音电商这条赛道深耕走过了四年。 这四年里&#xff0c;我们有了自己的黑标品牌旗舰&#xff0c;有了自己的仓库配套周边&#xff0c;有了自己的模式体系人员&#xff0c;有了数不清的类目和产品操作经验。 收获着身后团队伙伴…

PXE网络启动实战(第二篇 使用WDS启动WIN10PE)

目录 一、PE光盘结构分析 二、WIM格式的部署 三、安装配置Windows部署服务 1.准备虚拟机 2.复制WinPE的ISO文件到服务器 3.将Win10PE的WIM释放出来 4.配置服务器,设置固定IP地址 5.安装DHCP、DNS服务

EdgeX Foundry - 连接 MQTT 设备

文章目录 一、概述1.安装说明2.MQTT 设备模拟器2.1.模拟器设计2.2.Spring Boot 程序源码2.2.1.MQTT2.2.2.JsonUtils2.2.3.Device 2.3.程序配置 二、连接 MQTT 设备1.docker-comepse2.设备配置文件3.启动 EdgeX Foundry4.访问 UI4.1. consul4.2. EdgeX Console 5.创建 MQTT 设备…

由数据范围反推算法复杂度以及算法内容

一般ACM或者笔试题的时间限制是1秒或2秒。 在这种情况下&#xff0c;C代码中的操作次数控制在 1 0 7 ∼ 1 0 8 10^7\sim10^8 107∼108为最佳。 下面给出在不同数据范围下&#xff0c;代码的时间复杂度和算法该如何选择&#xff1a; n ≤ 30 n\leq30 n≤30&#xff0c;指数级别…

2024年字节跳动+京东+美团面试总结,程序员经验分享

现在的IT行业竞争压力越来越大&#xff0c;尤其是Android开发行业。而很多Android程序员却每天都在重复CRUD,原地徘徊&#xff01; 今年年初&#xff0c;你就想改变现状&#xff0c;于是在网上刷了大量面试题&#xff0c;强行记下之后&#xff0c;开始参加面试&#xff01;但是…

微信小程序开发系列(七)·如何实现小程序页面的快速跳转、小程序样式·尺寸单位rpx以及全局样式和局部样式的区别

微信小程序开发_时光の尘的博客-CSDN博客 目录 1. 小程序样式和组件介绍 2. 如何实现页面的快速跳转 3. 小程序样式尺寸单位rpx 3.1 使用px 3.2 使用rpx 4. 全局样式和局部样式 4.1 全局样式 4.2 局部样式 1. 小程序样式和组件介绍 在开发 Web网站的时候&am…