如何获取Cranelift中全局地址?

问题描述 投票:0回答:1

如何获取我用

Module::declare_data
声明的全局地址?

我知道我可以使用

Module::declare_data_in_func
创建某种引用,但我在
InstBuilder
InstBuilder::global_value
和类似方法中看到的唯一使用它的方法似乎是按值加载它。

我只是误解了

InstBuilder::global_value
的返回值,还是还有其他我错过的东西?

rust compiler-construction cranelift
1个回答
0
投票

如果我没记错的话,答案似乎是使用重定位将另一个全局变量设置为第一个全局变量的地址。

对匿名全局的匿名引用的伪 Rust 示例:

let mut module: impl Module = ...;
let mut data_description = DataDescription::new();

let global_id = module.declare_anonymous_data(false, false).unwrap();
data_description.define(...);
module.define_data(global_id, &data_description).unwrap();

data_description.clear();

let global_ptr_id = module.declare_anonymous_data(false, false).unwrap();
data_description.define_zeroinit(target_ptr_size);
let global_ref = module.declare_data_in_data(global_id, &mut data_description);
data_description.write_data_addr(0, global_ref, 0);
module.define_data(global_ptr_id, &data_description).unwrap();

这会将

global_id
标识的全局地址写入到
global_ptr_id
标识的全局数据中,然后可以从函数加载该数据。

© www.soinside.com 2019 - 2024. All rights reserved.