防止运行测试时优化掉未使用的静态函数

2024-04-15

我正在编写一个将利用 LLVM 的库(通过inkwell https://github.com/TheDan64/inkwell) 来 JIT 编译一些函数。这些函数需要能够回调我的代码中的一些 Rust 函数。

我让它工作,但我的单元测试不起作用,因为似乎回调函数在构建测试时被优化掉了。这些回调函数不是由 Rust 代码本身调用的,而是由动态生成的 JIT 函数调用的,所以我猜链接器认为它们未使用并删除它们。

如果我在单元测试中从 Rust 代码中调用它们,那么它们不会被删除 - 但这不是一个理想的解决方法。另请注意,当将包构建为库时,仅在构建测试时才删除这些函数。

下面是一个MVCE。

// lib.rs

use inkwell::{OptimizationLevel, context::Context};
use inkwell::execution_engine::JitFunction;

#[no_mangle]
pub extern "C" fn my_callback(x:i64) {
    println!("Called Back x={}", x);
}

type FuncType = unsafe extern "C" fn();

pub fn compile_fn() {
    let context = Context::create();
    let module = context.create_module("test");
    let execution_engine = module.create_jit_execution_engine(OptimizationLevel::None).unwrap();
    let builder = context.create_builder();

    let func_type = context.void_type().fn_type(&[], false);
    let function = module.add_function("test", func_type, None);
    let basic_block = context.append_basic_block(function, "entry");
    builder.position_at_end(basic_block);

    let cb_fn_type = context.void_type().fn_type(&[context.i64_type().into()], false);
    let cb_fn = module.add_function("my_callback", cb_fn_type, None);
    let x = context.i64_type().const_int(42, false);
    builder.build_call(cb_fn, &[x.into()], "callback");
    builder.build_return(None);
    function.print_to_stderr();
    let jit_func:JitFunction<FuncType> = unsafe { execution_engine.get_function("test").unwrap() };
    unsafe { jit_func.call() };
}

#[cfg(test)]
mod tests {
    #[test]
    fn it_works() {
        // If I uncomment this line, it works, otherwise it segfaults
        //super::my_callback(1);
        super::compile_fn();
    }
}
# Cargo.toml
[package]
name = "so_example_lib"
version = "0.1.0"
authors = ["harmic <[email protected] /cdn-cgi/l/email-protection>"]
edition = "2018"

[dependencies]
inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "master", features = ["llvm7-0"] }
// build.rs
fn main() {
    println!("cargo:rustc-link-search=/usr/lib64/llvm7.0/lib");
    println!("cargo:rustc-link-lib=LLVM-7");
}

您可以通过运行来判断该功能已被删除nm在生成的测试二进制文件上。当您运行测试时,它会出现段错误。如果你在 gdb 中运行它,你可以看到它正在尝试调用一个函数0x0000000000000000.

#0  0x0000000000000000 in ?? ()
#1  0x00007ffff7ff201f in test ()

我如何指示 Rust 不要删除这些函数?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止运行测试时优化掉未使用的静态函数 的相关文章

随机推荐

  • Jobb 崩溃 FAT 已满

    我尝试使用 jobb 库编译视频 问题是 jobb 崩溃 视频大小超过 500 MB 以下是有关此问题的一些信息 java io IOException FAT Full 459872 459873 at de waldheinz fs f
  • 检查字符串是否是编译时已知的文字字符串?

    我正在编写一个库 并且我有一个接受字典的方法 字典的值是不可信 不安全的 但密钥是可信的 如果最终用户能够输入任意密钥名称 那么可能会发生 坏事 所以当其他开发者使用这个库函数时 我想强制他们在编译时知道键名 所以这样的事情是被允许的 st
  • 不知道如何在给定私钥和消息的情况下生成 ECDSA 签名

    我正在跟进苹果的指南 https developer apple com library ios documentation DataManagement Conceptual CloutKitWebServicesReference Se
  • 两个非常相似的集合之一上的“‘dimnames’[2] 的长度不等于数组范围”

    我在两个数据框中收集了数据vols and flow 后者可以转换为矩阵 但第一个不能 as matrix vols Error in colnames lt tmp value c CanovesSamalus Llinars lengt
  • PHPExcel 一起单元格包含相同的数据问题

    当我使用 PHPExcel 类读取 ods 文件 xls 和 xlsx 都可以 并且两个单元格在一起并包含相同的数据时 第二个单元格变为空白 这是一个错误吗 这是我的代码
  • 解压...缺少参数

    我正在编写一个接受可变数量参数的函数 此外 我希望用户能够将其中一些参数保留为缺失 只考虑转动的任务 到参数列表中 这是我的第一次尝试 f lt function list 这失败了 f 1 2 Error in f 1 2 argumen
  • RSpec 和 ActiveModel

    我有一个模块 它包含 activemodel 我想使用 rspec 测试它 这是我到目前为止的设置 lib my module base rb my module rb spec my module spec rb spec helper
  • 从链接到 Oracle 的 SQL Server 编写 SQL 查询时如何指定日期文字?

    我有一个链接到 Oracle 12 1 数据库的 SQL Server 12 0 数据库 我想在 SQL Server 数据库中创建一个视图 该视图返回按日期筛选的 Oracle 表中的数据 Oracle 表在日期列上有一个索引 成功运行的
  • jQuery Uncaught TypeError:无法读取未定义的属性“fn”(匿名函数)

    全部 我下载的一些代码出现错误 这是代码 wl Alert v 1 1 description Handles alert boxes dependency jquery UI Slider fadeOutSlide plugin fn w
  • Java - 如何使用类文件?

    我是 Java 新手 想知道如何将类文件导入 netbeans 并使用它 我知道类文件是机器可读的字节代码 但我不关心幕后发生了什么 我只想将其导入到我当前的项目中并让它识别它 以便我可以使用该类 此外 类文件嵌入在 JAR 文件中 我将
  • 右对齐文本?

    我试图举一个例子来试验不同的对齐方式作为演示 左对齐 居中 右对齐 对齐和中左对齐文本都很容易 如我的演示所示 你可以看这个例子here http jsbin com avuzuf 1 edit在 JSBin 上 如何获得右对齐的文本而不弄
  • 在骨干模型上声明变量而不设置默认值

    我刚刚开始使用backbone js 我正在寻找一种在模型上声明字段而无需提供默认值的方法 它实际上仅供参考 以便当我开始创建实例时 我可以看到需要初始化哪些字段 用java之类的东西我会写 public class CartLine St
  • Doctrine OneToMany 关系错误

    我试图通过 Symfony2 2 3 0 使用 Doctrine 2 2 3 在数据库中的对象上建立一些 ManyToOne OneToMany 关系 但出现了一个奇怪的错误 以下是对象的相关部分 一种产品的许多属性 Product ORM
  • mongoengine - 忽略架构验证的额外字段

    我正在尝试查询我的数据库 目前 某些记录具有未包含在我的模型架构中的额外字段 由于错误 但我想处理这些情况 当我尝试查询数据库并将记录转换为模式时 出现以下错误 FieldDoesNotExist The field X does not
  • 从旧的 Git 提交中删除私有信息

    我有一个使用 Git 进行版本控制的项目 我想将其开源 但其中包含一些特定于其最初使用环境的私人信息 我将更改相关信息以从未包含在存储库中的配置文件加载 我意识到我应该首先这样做 但由于私人信息仍然存在于之前的提交中 我该如何将其从我的历史
  • 如何使用服务更改作用域变量?

    我有一个应用程序 应用程序内部有一个注册和登录表单 通过注册表单 当用户创建帐户时 他们会自动登录 通过登录表单 用户也可以登录 显然 我有两个控制器 一个用于注册表单 一个用于登录表单 我希望他们能够共享一个服务 logIn 因为两种形式
  • 基于 Spring Boot AMQP 的 JmsListener 在 TextMessage 上失败

    我有一个 Spring Boot 应用程序 在检索类型的 JMS 消息时遇到问题TextMessage来自 ActiveMQ 代理 如果消费者尝试从代理检索消息 它无法自动将消息转换为 TextMessage 而是将其视为 ByteMess
  • 如何从 json 字符串获取对象列表 c# Newtonsoft.json

    我正在尝试将 JSON 字符串转换为对象列表 但收到错误 无法将当前 JSON 对象反序列化为 List 类型 因为该类型需要 JSON 数组才能正确反序列化 我检索 json 它看起来像这样 Code 0 Message OK Data
  • Internet Explorer 开发人员工具如何保留导航日志?

    我正在寻找在 Internet Explorer 开发人员控制台中记录内容以保留页面刷新的方法 在 Google Chrome 和 Firefox 的 Firebug 下 这是一个选项 但我在 IE 下找不到它 我用的是IE 9 在 IE
  • 防止运行测试时优化掉未使用的静态函数

    我正在编写一个将利用 LLVM 的库 通过inkwell https github com TheDan64 inkwell 来 JIT 编译一些函数 这些函数需要能够回调我的代码中的一些 Rust 函数 我让它工作 但我的单元测试不起作用