编写代码(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中的每一个Function
    for (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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unicode里的表意文字描述符

「表意文字描述符&#xff08;Ideographic Description Characters&#xff09;」区块位于U2FF0-U2FFF范围内&#xff0c;共占据十六个编码空间&#xff0c;但由于实际上只有十二个符号&#xff0c;所以U2FFC-U2FFF的四个位置并没有编排任何符号。 由于汉字的数量庞大&#xff…

绘制角色弧光图

原文&#xff1a;Eva Deverell. 2020. Character Arc Plot & Kurt Vonnegut’s Story Shapes. https://www.eadeverell.com/character-arc/ 一、什么是角色弧 “角色弧”&#xff0c;or“角色发展弧”、“情感弧”&#xff0c;是角色在整个故事中经历的变化的总和。通常主…

APP inventor零基础移动应用开发

1.Android平台简介 Android由谷歌和开放手机联盟共同创建的一款针对手机的开源软件工具包 主要特色 ---开放性 – 丰富的硬件选择 – 开发商不受任何限制 – 无缝集成互联网服务 App Inventor是由Google公司开发的一款在线开放的Android编程工具软件&#xff0c;通过图形化…

寒假作业-day9

创建新项目 选择芯片 开启调试 配置时钟 时钟树的配置 工程管理 打开项目 编写代码

LeetCode、338. 比特位计数【简单,位运算】

文章目录 前言LeetCode、338. 比特位计数【中等&#xff0c;位运算】题目链接与分类思路位运算移位处理前缀思想实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java…

txt 文本文档中空格替换

txt 文本文档中空格替换 1. 原始 txt2. 替换References 1. 原始 txt 2. 替换 编辑 -> 替换 (Ctrl H) 查找内容 (‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌) ​​​ 替换为 ( ) References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

DHCP 动态主机配置协议

目录 1 动态主机配置协议 DHCP 1.1 DHCP 使用客户服务器方式 1.2 DHCP 工作方式 1.3 DHCP 中继代理 (relay agent) 1.4 租用期 (lease period) 1.5 DHCP 协议的工作过程 1 动态主机配置协议 DHCP 动态主机配置协议 DHCP (Dynamic Host Configuration Protocol) 提供了即插…

Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

【实战】一、Jest 前端自动化测试框架基础入门(中) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(二)

文章目录 一、Jest 前端自动化测试框架基础入门5.Jest 中的匹配器toBe 匹配器toEqual匹配器toBeNull匹配器toBeUndefined匹配器和toBeDefined匹配器toBeTruthy匹配器toBeFalsy匹配器数字相关的匹配器字符串相关的匹配器数组相关的匹配器异常情况的匹配器 6.Jest 命令行工具的使…

综合项目---博客

一.运行环境 192.168.32.132 Server-Web linux Web 192.168.32.133 Server-NFS-DNS linux NFS/DNS 基础配置 1.配置主机名静态ip 2.开启防火墙并配置 3.部分开启selinux并配置 4.服务器之间通过阿里云进行时间同步 5.服务器之间实现ssh免密…

图神经网络与图表示学习: 从基础概念到前沿技术

目录 前言1 图的形式化定义和类型1.1 图的形式化定义1.2 图的类型 2 图表示学习2.1 DeepWalk: 融合语义相似性与图结构2.2 Node2Vec: 灵活调整随机游走策略2.3 LINE: 一阶与二阶邻接建模2.4 NetMF: 矩阵分解的可扩展图表示学习2.5 Metapath2Vec: 异构图的全面捕捉 3 图神经网络…

红队打靶练习:DEVGURU: 1

目录 信息收集 1、arp 2、nmap 3、dirsearch WEB web信息收集 8585端口 漏洞利用 提权 系统信息收集 横向渗透 get flag 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:20:80:1b, IPv4: 192.168.10…

【白话前端】快速区分webGL,webGPU,unity3D和UE4

在3D图形渲染的渲染领域&#xff0c;很多友友们对上述概念傻傻分不清&#xff0c;站在前端开发角度&#xff0c;我用简单语言说下&#xff0c;结论在文章最后。 一、四者都能进行3D图形渲染 它们之间有一些区别&#xff0c;下面我将对它们进行简单的区分&#xff1a; WebGPU&a…

iTop-4412 裸机程序(二十一)- 蜂鸣器与PWM

目录 0.源码1. 蜂鸣器2. iTop-4412 蜂鸣器原理图3. PWM相关寄存器4. 关键源码 0.源码 GitHub&#xff1a;https://github.com/Kilento/4412NoOS 1. 蜂鸣器 蜂鸣器的原理相对简单&#xff0c;学过单片机的同学应该比较了解。我们一般通过引脚输出PWM的输出频率和占空比来控制…

用Python探秘2024年春晚刘谦魔术:两步揭开神秘面纱

在2024年的春晚舞台上&#xff0c;刘谦的魔术表演再次引发了全国观众的热议。他的每一个动作、每一次变换都充满了神秘与未知&#xff0c;让人在惊叹的同时也好奇其背后的秘密。今天&#xff0c;我们将用Python来模拟实现刘谦的一个魔术&#xff0c;并尝试通过两步揭秘其背后的…

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示

标题:探究t-table在Vue.js中的实现与运用 ,可用于数据分析表格展示 一、引言 在当今的Web开发中,表格是一种常见的界面元素,用于展示和操作数据。Vue.js是一款流行的JavaScript框架,具有响应式数据绑定和组件化的特点。在Vue.js中,t-table是一种常用的表格组件,具有高度…

王树森《RNN Transformer》系列公开课

本课程主要介绍NLP相关&#xff0c;包括RNN、LSTM、Attention、Transformer、BERT等模型&#xff0c;以及情感识别、文本生成、机器翻译等应用 ShusenWang的个人空间-ShusenWang个人主页-哔哩哔哩视频 (bilibili.com) &#xff08;一&#xff09;NLP基础 1、数据处理基础 数…

C语言函数入门

在C语言中&#xff0c;函数意味着功能模块。一个典型的C语言程序&#xff0c;就是由一个个的功能模块拼接起来的整体。也因为如此&#xff0c;C语言被称为模块化语言。 对于函数的使用者&#xff0c;可以简单地将函数理解为一个黑箱&#xff0c;使用者只管按照规定给黑箱一些输…

中年中产程序员从西安出发到海南三亚低成本吃喝万里行:西安-南宁-湛江-雷州-徐闻-博鳌-陵水-三亚-重庆-西安(2.游玩过程)

文章大纲 出发时间&#xff1a;Day1-1月25日星期四&#xff0c;西安飞南宁路途中&#xff1a;Day2-1月26日星期五&#xff0c;南宁-湛江-住雷州&#xff08;曾经支教过的地方&#xff09;【晚上买徐闻到海安新港】路途中&#xff1a;Day3-1月27日星期六&#xff0c;雷州-徐闻渡…

【每日一题】LeetCode——反转链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…