llvm 创建外部调用函数方法

news2024/12/25 10:12:02

llvm 创建外部调用函数方法

2023-02-12 15:26:19

sizaif
img

文章目录

  • llvm 创建外部调用函数方法
    • 法一:
      • 声名参数类型及函数类型
      • 在llvm IR中处理并调用函数:
      • 外部函数:
    • 法二
      • 声明函数
      • 在llvm IR中处理并函数调用
      • 外部函数

法一:

声名参数类型及函数类型

// Fun Ty
static FunctionType *_EntryStackFnTy;
static FunctionType *_TaintHandleTy;
// Fn
static Function *_EntryStackFn;
static Function *_TaintFn;

_TaintHandleTy = FunctionType::get(VoidTy, {Int32Ty, Int32Ty, Int32Ty}, true); // true可变参数 
_EntryStackFnTy = FunctionType::get(VoidTy, {Int8PtrTy,Int64Ty}, false);

第三个参数false,表示此函数不是可变参数, 若为true 则表明函数是可变参数

在llvm IR中处理并调用函数:

map<StringRef ,GlobalVariable *> fnname2gv;
IRBuilder<> *builder;

....    
void handle(Module *mod){
    builder = new IRBuilder<>(mod->getContext()); // 声明builder
    Int32Ty = IntegerType::getInt32Ty(mod->getContext());
    
    std::vector<Value*>vec_arg;
    StringRef fn_name = func->getName();
    u64 fn_name_hash = hash64_char(fn_name.str().c_str(), fn_name.size()); 
    // hash(fn_name)
    if(!fnname2gv.count(fn_name)){
        ArrayType *ty = ArrayType::get(Type::getInt8Ty(mod->getContext()), fn_name.size() + 1);
        GlobalVariable *gv = new GlobalVariable(
            *mod, ty, true, GlobalValue::InternalLinkage, nullptr,
            (funcCount > 0 ? ".funcName." + to_string(funcCount) : ".funcName"));
        ++funcCount;
        gv->setAlignment(MaybeAlign(1));
        Constant *arrayValue = ConstantDataArray::getString(mod->getContext(), fn_name, true);
        gv->setInitializer(arrayValue);
        fnname2gv[fn_name] = gvfnname;
    }
    vector<Constant *> indices;
    indices.push_back(ConstantInt::get(Int64Ty, 0));
    indices.push_back(ConstantInt::get(Int64Ty, 0));
    vec_arg.push_back(ConstantExpr::getGetElementPtr(fnname2gv[fn_name]->getValueType(),fnname2gv[fn_name],indices));
    vec_arg.push_back(ConstantInt::get(Int64Ty,fn_name_hash));
    builder->SetInsertPoint(inst);
    builder->CreateCall(_EntryStackFn,vec_arg);
}

1.对于字符串类型,无法直接将string 转换成Value*, 但GlobalStringValue类型,

所以通过构建全局变量的形式: string->StringRef->globalString->Value*

在llvm IR中传递参数应使用Value*

2.对于可变参数变量

只需要先填充counts (告知后面有几个参数,这个counts是不包含在可变参数里,需要显式声明的) ;

然后往vector里填充即可

例如:

std:vector<Value*>vec_arg;

vec_arg.push_back(ConstantInt::get(Int32Ty,2)); // counts
vec_arg.push_back(ConstantInt::get(Int32Ty,10000)); 
vec_arg.push_back(fnname2gv[fn_name]); 

外部函数:

extern "C" void entrystackFunc(char *funcName, u64 fnamehash){
    .....
}

extern "C" void _Taint_handle(int inst_type, int isOrNo, int counts, ...){
    va_list args;
    va_start(args, counts);
    for (int idx = 0; idx < counts; idx++)
    {
        auto temps_va = va_arg(args, void *); //  void * 类型接收
        u64 tmp = (u64)(temps_va); // 转换到对应的类型
    }
    va_end(args);
}

法二

声明函数

string entryFuncName("entryFunc");

Function *insertentryFuncDecl(Module *mod)
{
    Int64Ty = IntegerType::getInt64Ty(mod->getContext());
    FunctionCallee c = mod->getOrInsertFunction(entryFuncName,
					 FunctionType::getVoidTy(mod->getContext()),
                     Type::getInt8PtrTy(mod->getContext()),
                     Int64Ty);
    return static_cast<Function *>(c.getCallee());
}

在llvm IR中处理并函数调用

Function *entryFunc = insertentryFuncDecl(mod);
std::vector<Value *> Args;
....
Args.push_back(...)
....
Instruction *entryCall = CallInst::Create(
    entryFunc->getFunctionType(),
    entryFunc,
    Args);
entryCall->insertBefore(inst);

外部函数

外部函数同法一中所指

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

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

相关文章

【CS224W】(task3)NetworkX工具包实践

note 节点可以为任意可哈希的对象&#xff0c;比如字符串、图像、XML对象&#xff0c;甚至另一个Graph、自定义的节点对象。通过这种方式可以自由灵活地构建&#xff1a;图为节点、文件为节点、函数为节点&#xff0c;等灵活的图形式。暂时省略&#xff1a;【B5】计算机网络图…

vue3学习资料整理

一、一个后端程序员为什么要学习前端&#xff1f; 1.网上找到的学习理由 《Java后端的我也要学Node.js 了》 https://blog.csdn.net/yusimiao/article/details/104689007 《nodejs后端开发的优缺点&#xff08;nodejs的概念与特征详解&#xff09;》 https://www.1pindao.co…

2023级浙江大学MEM提面最新经验分享

一、个人背景背景&#xff1a;本人毕业于某211大学工程管理相关专业&#xff0c;目前定居在杭州&#xff0c;在某汽车制造公司工作&#xff0c;负责研发无人驾驶项目。我申请的是浙大MEM提前批面试&#xff0c;因为通过提面优秀资格顺利上岸录取&#xff0c;之前感到对自己有帮…

Java、JSP动漫网站的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;随着科技的迅速发展&#xff0c;计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展&#xff0c;网络的规模也逐渐增大&#xff0c;网络的元素也随之不断增加&#xff0c;有的利用其通信&#xff0c;有的利用其…

【软件测试开发】Junit5单元测试框架

目录1. 注解Test 注解BeforeEach BeforeAllAfterEach AfterAll2. 断言 assertassertequalsassertTrue assertFalseassertNull assertNotNull3. 用例执行顺序方法排序&#xff0c;通过 Order 注解来排序4. 测试套件 Suite5. 参数化单参数stringsints6. 参数化多参数CsvSourceCsv…

File类

&#x1f3e1;个人主页 &#xff1a; 守夜人st &#x1f680;系列专栏&#xff1a;Java …持续更新中敬请关注… &#x1f649;博主简介&#xff1a;软件工程专业&#xff0c;在校学生&#xff0c;写博客是为了总结回顾一些所学知识点 ✈️推荐一款模拟面试&#xff0c;刷题神器…

2. SpringMVC 请求与响应

文章目录1. 请求映射路径2. 请求参数2.1 get 请求发送普通参数2.2 post 请求发送普通参数2.3 五种类型的参数传递2.4.1 普通参数2.4.2 POJO 数据类型2.4.3 嵌套 POJO 类型参数2.4.4 数组类型参数2.4.5 集合类型参数3. json 数据传输参数&#xff08;重点&#xff09;3.1 传输 j…

C语言(C预编译指令)

目录 1.undef 2.条件编译#ifdef,#else和#endif 3.#ifndef 4.#if和#elif 5.预定义宏 6.#line和#error 7.#pragma 1.undef #undef指令用于取消已定义的#define指令 #define LIMIT 400 #undef LIMIT 如果想使用一个名称但又不确定之前是否已经用过&#xff0c;为了安全起…

Python中的进程线程

文章目录前言多进程与多线程基本概念多进程multiprocessing 类对象进程池subprocess模块进程间通信多线程threading实现线程操作线程共享所有变量线程锁参考资料前言 又花了点时间学习了一下Python中的多线程与多进程的知识点&#xff0c;梳理一下供复习参考 多进程与多线程 …

JUC并发编程与源码分析

一、本课程前置知识及要求说明 二、线程基础知识复习 三、CompletableFuture 四、说说Java"锁"事 8锁案例原理解释: 五、LockSupport与线程中断 六、 Java内存模型之JMM 七、volatile与JMM 八、CAS 九、原子操作类之18罗汉增强 十、聊聊ThreadLocal 十一、Java对…

离线数据仓库

1 数据仓库建模 1.1 建模工具 PowerDesigner/SQLYog/EZDML… 1.2 ODS层 &#xff08;1&#xff09;保持数据原貌不做任何修改&#xff0c;起到备份数据的作用。 &#xff08;2&#xff09;数据采用压缩&#xff0c;减少磁盘存储空间&#xff08;例如&#xff1a;压缩采用LZO&…

seata源码-全局事务回滚服务端源码

这篇博客来记录在发起全局事务回滚时&#xff0c;服务端接收到netty请求是如何处理的 1. 发起全局事务回滚请求 在前面的博客中&#xff0c;有说到过&#xff0c;事务发起者在发现分支事务执行异常之后&#xff0c;会提交全局事务回滚的请求到netty服务端&#xff0c;这里是发…

Python 解决dilb和face_recognition第三方包安装失败

目录 dilb和face_recognition第三方包安装失败 亲测有效的解决方法&#xff1a;whl安装方式 dilb和face_recognition第三方包安装失败 场景复现&#xff1a;因为需要用到dlibface_recognition&#xff0c;基于OpenCV做一些人脸识别的项目&#xff0c;在Pycharm中进行pip清华…

图解LeetCode——剑指 Offer 24. 反转链表

一、题目 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制&#xff1a; 0 < 节点个数 < 5000 三、…

Linux | Linux卸载和安装MySQL(Ubuntu版)

最近又来到了Linux学习了&#xff0c;原因是要接触云服务器相关知识&#xff0c; 所以博主整理了一些关于Linux的知识&#xff0c; 欢迎各位朋友点赞收藏&#xff0c;天天开心丫&#xff0c;快乐写代码&#xff01; Linux系列文章请戳 Linux教程专栏 目录 一、卸载MySQL 1…

Angular4 中 ckeditor5 插件的使用

Angular4 中 ckeditor5 插件的使用 0 环境、新建项目 环境&#xff1a; Windows10Angular/cli1.4.10&#xff08;安装 Angular 的过程略过&#xff0c;Angular4 版本比较古老&#xff0c;这也导致项目安装插件及其他操作比较麻烦&#xff09; 1. ckeditor5 官方用法 基础用…

邂逅TypeScript基础语法

文章目录p26认识TypeScriptTypeScript的编译环境ts初体验ts环境搭建变量的定义p27number类型booleanArrayObjectSymbolanyunknownvoidnevertuple联合ts中文文档学习-非官方网站 p26 认识TypeScript TypeScript的编译环境 ts初体验 ts环境搭建 第二种方式 webpack.config…

论文阅读_图像生成文本_CLIP

name_en: Learning Transferable Visual Models From Natural Language Supervision name_ch: 从自然语言监督中学习可迁移的视觉模型 paper_addr: http://arxiv.org/abs/2103.00020 doi: 10.48550/arXiv.2103.00020 date_read: 2023-02-09 date_publish: 2021-02-26 tags: [‘…

【1138. 字母板上的路径】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为 board ["abcde", "fghij", "klmno", "pq…

文本比对工具【UltraCompare附安装包】Mac和Windows下载使用

UltraCompare 强大的文件&#xff0c;文件夹&#xff0c;PDF, Word和Excel比较。文件夹同步&#xff0c;二进制/十六进制比较。下载一个免费的全功能试用版&#xff0c;看看为什么。适用于Windows、Mac和Linux。 文章目录软件功能1、文本比较2、快速二进制比较3、智慧二进制比较…