LLVM IR:从中间文件提取struct信息_解析头文件结构体-程序员宅基地

技术标签: llvm  

LLVM IR:从中间文件提取struct信息

先放上源代码:

struct demo1 {
    
    long long A;
    long long B;

};
struct demo2 {
    
	long long C;
    long long D;
    float E;
};

int main(){
    
    struct demo1 d1;
    struct demo2 d2;
	d1.A = 1;
	d2.C = 2;
	d2.D = d1.A + d2.C;
	return 0;
}

LLVM IR:

%struct.demo1 = type { i64, i64 }
%struct.demo2 = type { i64, i64, float }

; Function Attrs: noinline nounwind optnone uwtable
define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca %struct.demo1, align 8
  %3 = alloca %struct.demo2, align 8
  store i32 0, i32* %1, align 4
  %4 = getelementptr inbounds %struct.demo1, %struct.demo1* %2, i32 0, i32 0
  store i64 1, i64* %4, align 8
  %5 = getelementptr inbounds %struct.demo2, %struct.demo2* %3, i32 0, i32 0
  store i64 2, i64* %5, align 8
  %6 = getelementptr inbounds %struct.demo1, %struct.demo1* %2, i32 0, i32 0
  %7 = load i64, i64* %6, align 8
  %8 = getelementptr inbounds %struct.demo2, %struct.demo2* %3, i32 0, i32 0
  %9 = load i64, i64* %8, align 8
  %10 = add nsw i64 %7, %9
  %11 = getelementptr inbounds %struct.demo2, %struct.demo2* %3, i32 0, i32 1
  store i64 %10, i64* %11, align 8
  ret i32 0
}

想要提取出这个信息:

%struct.demo1 = type { i64, i64 }
%struct.demo2 = type { i64, i64, float }

最开始操作的时候通过遍历Model->Basicblock->Function->Instruction发现没有找到struct的定义信息,其上级属于Model而不属于基本块Basicblock,使用方法getIdentifiedStructTypes()可以直接获取到已经定义好的结构体,返回一个vector< StructType >,然后遍历就可以对结构体进行操作,直接放核心代码(M为LLVM IR问价的Model):

//获取所有定义好的struct
	std::vector<StructType*> STy = M->getIdentifiedStructTypes();
	int struct_size = 0;
	for(auto sty : STy){
    
		struct_size = 0;
		errs() << "----------begin----------" << "\n";
		errs() << "StructName: " << sty->getName() << "\n";
		errs() << "NumElements: " << sty->getNumElements() << "\n";
		//获取所有元素
		errs() << "ElementsType: ";
		ArrayRef<Type*> ty_ary = sty->elements();
		for(auto i : ty_ary){
    
			auto element_size_bits = i->getPrimitiveSizeInBits();
			struct_size += element_size_bits;
			errs() << *i << " " << element_size_bits << "bits;";
		}
		errs() << "\nStructSize: " << struct_size << "bits\n";
		errs() << "-----------end-----------" << "\n";
	}

方法说明:
getName():获取结构体名称
getNumElements():获取结构体元素数量
elements():返回一个每一个元素的Type,使用ArrayRef存储
getPrimitiveSizeInBits():获取元素类型的字节宽度

结果如下:
输出各个元素类型以及字节宽度

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

智能推荐

如何使用 Workbench 远程连接到 MySQL 数据库 -MySQL Workbench 使用教程_mysql workbench连接数据库-程序员宅基地

文章浏览阅读1.5w次,点赞12次,收藏88次。MySQL Workbench 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具,我们可以在自己的计算机上,使用图形化界面(GUI)远程管理 MySQL 数据库。有关 MySQL 远程管理软件,你可以选择 Windows 下的 HeidiSQL,MacOS 下的 Sequel Ace 或者 MySQL 官方推出的跨平台客户端 MySQL Workbench 。如果你需要针对自己的工作流对数据库操作,定制开发,推荐一下卡拉云,详情见文末。本._mysql workbench连接数据库

WPF随笔(四)--窗口多屏显示及全屏_wpf 拖拽分屏后页面部分黑屏-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏29次。当有多台显示设备,比如有两台显示器时,让WPF窗体在不同显示器上呈现不同内容就显得尤为必要。同时让窗口全屏显示也能取得较好的呈现效果。一般来讲WPF项目默认都是从MainWindow开始启动的。多屏显示的思路很简单,就是遍历当前所有硬件显示设备,然后实例化不同的窗体并分别设置其位置在不同的显示设备上。遍历显示设备 public MainWindow(string sysName..._wpf 拖拽分屏后页面部分黑屏

【方案设计开发】食物温度计pcba-程序员宅基地

文章浏览阅读381次,点赞4次,收藏9次。食物温度计,在食物烹饪时,温度和时间至关重要,所以食物温度计孕育而生,当用户使用时只需将食物温度计的探头插入食物中,即刻能得到当前食物温度数据,不必用经验判断。温度校准:进入零度校准(在温度正负2度的温度范围内进入校准模式),进入校准后,C/F按键加,HOLD/CAL按键减(单位为0.1°),长按连续加减,最高可调正2度,最低可调负2度无操作10秒自动返回测温状态。测温精度:-50℃到-21℃±3℃、-20℃到-150℃±1℃、151℃到200℃±2℃、201℃到250℃±3℃、251℃到300℃±5℃。

八、树莓派LNMP安装nextcloud云盘详细教程_树莓派 nextcloud 读取硬盘-程序员宅基地

文章浏览阅读3k次。八、树莓派安装nextcloud,部署自己的云盘使用树莓派部署一个自己的云盘,来完成一些手机,电脑间的文件操作,同时,摒弃百度云盘的限速。由于是树莓派,不推荐LAMP方式,这里我们用LNMP方式。基于LNMP安装。先安装Nginx,php-fpm,MySQL。这些安装都比较简单,mysql对应是mariadb-server。直接sudo apt-get install 就好。我前面的文章..._树莓派 nextcloud 读取硬盘

C#中的DataGridView中添加按钮并操作数据_datagridview添加按钮-程序员宅基地

文章浏览阅读1.7w次,点赞25次,收藏59次。C#中的DataGridView中添加按钮并操作数据_datagridview添加按钮

axis idea 设置apache_Axis2创建WebService实例 --- 接口发布-程序员宅基地

文章浏览阅读751次。最近项目需要使用Axis2方式对外提供接口,项目是maven,在网上费尽心思的找了好久,相关maven axis2 项目搭建的文章都是前篇一律,最重要的是没有一个文章测试成功,不吐槽了,赶紧来一起来看看怎么使用Axis2创建WebService实例开发环境JDK1.8Maven 3.6IDEA准备工作将axis2-1.7.7-war.zip文件解压,解压其中axis2.war,其目录如下image..._apache axis 例子

随便推点

女生适不适合进入IT行业做Linux运维工程师?-程序员宅基地

文章浏览阅读2.4k次。 不知从何时起有那么一个不成文的理论:女生不适合做IT。在很多人看来,IT is a men’s world,女生学IT是件匪夷所思的事情。在传统的思维当中..._linux推不推荐入行

如何看懂congestion map-程序员宅基地

文章浏览阅读2.1k次,点赞6次,收藏22次。最近有一些同学问congestion map怎么看。这里详细介绍一下。congestion map可以非常直观的看到,绕线有问题的区域。另外congestion map对于及早发现flo..._congestion map

动态SLAM论文(3) — Detect-SLAM: Making Object Detection and SLAM Mutually Beneficial-程序员宅基地

文章浏览阅读1.1k次。近年来,在SLAM和目标检测方面取得了显著进展,但仍存在一系列挑战,例如在动态环境中进行SLAM和在复杂环境中检测目标。为了解决这些挑战,我们提出了一种新颖的机器人视觉系统,将SLAM与基于深度神经网络的目标检测器集成在一起,使这两个功能相互受益。所提出的系统能够在未知和动态环境中可靠高效地完成任务。实验结果表明,与最先进的机器人视觉系统相比,所提出的系统具有三个优点:_detect-slam

软件定义存储(SDS)的定义、分类及VMware VSAN剖析-程序员宅基地

文章浏览阅读320次。目前市场上都有哪些软件定义存储的产品?为什么会被认为是软件定义存储?跟软件定义存储相关的这些词汇还有什么?市场上有很多和软件定义存储相关的词汇,还有包括产品,那么它们之间到底是一个什么样的关系呢?在软件定义存储这个概念词汇出现之前,实际上最早出现的是软件定义网络。就是大家听到的SDN,后来大概是在2012年还是2013年的时候,出现了软件定义数据中心..._软件定义存储 vsan

#51CTO学院四周年# 学IT技术哪家强-程序员宅基地

文章浏览阅读151次。我要去蓝翔学挖掘机、新东方学厨师、51CTO学计算机,未来用电脑控制挖掘机炒菜! 2015-3-29日,是我与51CTO初识的日子。那时候,毕业一年,工资5K,正在深圳这样的大环境下夹缝求生。想加工资,想跳槽,可是拿不出实力,不敢轻易尝试,每天打着游戏发泄着心中的苦闷。当时,测试行业比较崇尚LR性能测试,抱着追风学习的心态百度了LR,欲下载来消磨无聊的时间,那时身为小白的..._51cto csdn 哪个平台学习好

构造IOCTL命令的学习心得-----_IO, _IOR, _IOW, _IOWR 幻数的理解_ioctl如何规避系统使用的幻数-程序员宅基地

文章浏览阅读1k次。为什么要用_IO, _IOR, _IOW,_IOWR宏呢,直接自己定义不行吗?答:对于系统支持设备的ioctl号,你可以在/usr/include下面的头文件中找到,对于你自己的设备,如果需要使用ioctl接口,则需要定义自己的ioctl号。以前的2.4中有个问题是,大家都随便定义自己的ioctl号,造成很大可能性的重复性。一个坏处是难以管理,另外一个是容易造成错误,例如如果用户本来希望打开一_ioctl如何规避系统使用的幻数

推荐文章

热门文章

相关标签