编写代码(LLVM的第一个项目)

下面这个完整代码
它相对较短,因为它建立在LLVM 流程的基础设施上
后者替我们完成大部分工作
在这里插入图片描述

我们从程序使用cl命名空间中的llvm工具(cl代表命令行)来实现我们的命令行接口
需要调用ParseCommandLineOption函数声明cl::类型的全局变量
以显示我们的程序收单个参数,并且该函数是包含位码文件名的string类型
之后我们实例化一个LLVMContext对象,以存放于LLVM编译相关的所有数据
从而使LLVM是线程安全的
MemoryBuffer类位内存块定义的一个只读接口
ParseBitcodeFile函数将使用这个对象来读取我们的输入文件的内容,并解析文件中LLVM IR 的内容
在检查完错误并保证一切正常后,我们遍历该文件中模块的所有函数
LLVM模块的概念类似于翻译单元,其中包含所有编码到位码文件中的内容,也是LLVM层次结构中的最高实体
在它后面的函数
基本都是块
最后是指令
如果只是一个函数声明,则丢弃它,因为我们想要查找函数定义
当我们找到这些函数定义时,将打印它们的名称和它包含的基本块的数量

如果编译此程序,并使用help运行,可以查找已经准备好的LLVM命令执行功能
想要找到转换为LLVM IR 的C或C++文件,然后将其转换并使用程序进行分析:

clang -c -emit-llvm xxx.c -o xxx.bc
helloword mysource.bc

遇到个错误,这里的文件头的路径是有问题的
在这里插入图片描述
后面我改了一下
然后还是不行

#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/CommandLine.h>
#include <string>
#include<iostream>
suing namesapace llvm;
static cl::opt<std::string>FileName (cl::Positional, c ::desc ("Birtcodefile"),cl::Required);
int main(int argc char**argv)
{cl::ParseCommandLineOptions(argc,argv,"LLVM hello world\n");LLVMContext context;stad::string error;OwningPtr <MemoryBuffer> mb;Memorybuffer: :getFile(FileNmae .mb);Moudle *m=ParseBitcodeFile(mb.get(),context,&error);if(m==0){std:cerr<<"Errorreading bitcode:"<<error<<std::end:return -1;}raw os ostream o(std::cout);for (Module::conset iterator = m->getFunctionList().begin(),e=m->getFunctionList.end();i!=e;++i){if (!i->isDeclaration()){o<<i->getName()<<"has"<<i-size()<<"basic block(s). \n".;}}return 0
}

后面我才发现,需要clang++,并且我之前的那个makefile文件没有启动的
而且这个文件头问题很大,c++和c和混合
所以换个方法
在这里插入图片描述

// 引入相关LLVM头文件
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/Support/CommandLine.h>using namespace llvm;// LLVM上下文全局变量
static ManagedStatic<LLVMContext> GlobalContext;// 命令行位置参数全局变量, 这个参数的含义是需要处理的LLVM IR字节码的文件名
static cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<filename>.bc"), cl::Required);int main(int argc, char **argv) {// 诊断实例SMDiagnostic Err;// 格式化命令行参数,cl::ParseCommandLineOptions(argc, argv);// 读取并格式化LLVM IR字节码文件, 返回LLVM Module(Module是LLVM IR的顶级容器)std::unique_ptr<Module> M = parseIRFile(InputFilename, Err, *GlobalContext);// 错误处理if (!M) {Err.print(argv[0], errs());return 1;}// 遍历Module中的每一个Functionfor (Function &F:*M) {// 过滤掉那些以llvm.开头的无关函数if (!F.isIntrinsic()) {// 打印函数返回类型outs() << *(F.getReturnType());// 打印函数名outs() << ' ' << F.getName() << '(';// 遍历函数的每一个参数for (Function::arg_iterator it = F.arg_begin(), ie = F.arg_end(); it != ie; it++) {// 打印参数类型outs() << *(it->getType());if (it != ie - 1) {outs() << ", ";}}outs() << ")\n";}}
}

在这里插入图片描述
这里我测试了之前我写的文章中那个sum函数https://blog.csdn.net/m0_72827793/article/details/135894096

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

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

相关文章

滑动小短剧影视微信小程序源码/带支付收益等模式

仿抖音滑动小短剧影视微信小程序源码&#xff0c;带支付收益等模式、支持无限滑动&#xff1b;高性能滑动、预加载、视频预览&#xff0c;支持剧情介绍&#xff0c;集合壁纸另外仿抖音滑动效果&#xff1b;支持会员模式&#xff0c;支持用户单独购买等等多功能。 丰富的后台设…

Vscode 在汇编文件中添加调试断点

Vscode 在汇编文件中添加调试断点 vscode默认不支持汇编文件添加断点, 可以在设置里面打开

开发自定义标记应用程序

开发自定义标记应用程序 问题陈述 Larry Williams 是ABC Inc.公司的CEO,他希望公司能够拥有一个交互式网站以向访问网站的用户表示问候并显示当前时间。他还希望最终用户能够指定主页的背景颜色。您是公司的网站管理员。Larry要您修改网站的主页,以便向最终用户显示自定义问…

19 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 中等 相关标签 相关企业 提示 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 这段代码使用了双指针的方法&#xff0c;其中一个指针先走 n 步&#xff0c;然后两个指针一起走&#xff0c;直到第一…

Java强训day20(选择题编程题)

选择题 编程题 题目1 import java.util.Scanner;public class Main { public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();StringBuffer ss new StringBuffer(s);System.out.println(ss.reverse());sc.close();} }

数学建模:K-means聚类手肘法确定k值(含python实现)

原理 当K-means聚类的k值不被指定时&#xff0c;可以通过手肘法来估计聚类数量。   在聚类的过程中&#xff0c;随着聚类数的增大&#xff0c;样本划分会变得更加精细&#xff0c;每个类别的聚合程度更高&#xff0c;那么误差平方和&#xff08;SSE&#xff09;会逐渐变小&am…

有趣儿的组件(HTML/CSS)

分享几个炫酷的组件&#xff0c;起飞~~ 评论区留爪&#xff0c;继续分享哦~ 文章目录 1. 按钮2. 输入3. 工具提示4. 单选按钮5. 加载中 1. 按钮 HTML&#xff1a; <button id"btn">Button</button>CSS&#xff1a; button {padding: 10px 20px;text-tr…

Python中多种生成随机密码超实用实例

前言 密码是信息安全的基石&#xff0c;它用于保护我们的账户、数据和隐私。为了确保密码足够强大&#xff0c;需要生成随机密码。在本文中&#xff0c;将讨论多种Python方法&#xff0c;用于生成随机密码的实用示例和技巧。 目录 ​编辑 前言 密码生成的要求 使用secrets…

给你介绍一款适合教培行业的手机软件,很好用,关键还是免费的

给你介绍一款适合教培行业的手机软件&#xff0c;很好用&#xff0c;关键还是免费的&#xff0c;DT浏览器不同于普通意义上的浏览器&#xff0c;DT的含义就是数据资料的意思&#xff0c;更专注于资料的收集和管理&#xff0c;是一款资料管理类的浏览器&#xff0c;也是一款面向…

【教3妹学编程-算法题】大于等于顺序前缀和的最小缺失整数

2哥 : 叮铃铃&#xff0c;3妹&#xff0c;过年干嘛呢&#xff0c;是不是逛吃逛吃&#xff0c;有没有长胖呢。 3妹&#xff1a;切&#xff0c;我妈张罗着要给我相亲呢。 2哥 : 相亲&#xff1f;哈哈哈哈 3妹&#xff1a;别笑了&#xff0c;我妈说跟我年龄相等的人都已经孩子上小…

autojs通过正则表达式获取带有数字的text内容

视频连接 视频连接 参考 参考 var ctextMatches(/\d/).findOne()console.log("当前金币"c.text()) // 获取当前金币UiSelector.textMatches(reg) reg {string} | {Regex} 要满足的正则表达式。 为当前选择器附加控件"text需要满足正则表达式reg"的条件。 …

(2024,扩散,多概念擦除,概念无关表示生成,权重解耦)扩散模型中可分离的多概念擦除

Separable Multi-Concept Erasure from Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1. G-CiRs 3.2. 权重解耦&#…