mirror of
https://github.com/pezkuwichain/revive.git
synced 2026-04-22 02:07:55 +00:00
94ec34c4d5
Separate between compilation and linker phases to allow deploy time linking and back-porting era compiler changes to fix #91. Unlinked contract binaries (caused by missing libraries or missing factory dependencies in turn) are emitted as raw ELF object. Few drive by fixes: - #98 - A compiler panic on missing libraries definitions. - Fixes some incosistent type forwarding in JSON output (empty string vs. null object). - Remove the unused fallback for size optimization setting. - Remove the broken `--lvm-ir` mode. - CI workflow fixes. --------- Signed-off-by: Cyrill Leutwiler <bigcyrill@hotmail.com> Signed-off-by: xermicus <bigcyrill@hotmail.com> Signed-off-by: xermicus <cyrill@parity.io>
68 lines
2.6 KiB
Rust
68 lines
2.6 KiB
Rust
//! Translates the storage operations.
|
|
|
|
use crate::polkavm::context::runtime::RuntimeFunction;
|
|
use crate::polkavm::context::Context;
|
|
use crate::PolkaVMArgument;
|
|
use crate::PolkaVMLoadStorageWordFunction;
|
|
use crate::PolkaVMLoadTransientStorageWordFunction;
|
|
use crate::PolkaVMStoreStorageWordFunction;
|
|
use crate::PolkaVMStoreTransientStorageWordFunction;
|
|
|
|
/// Translates the storage load.
|
|
pub fn load<'ctx>(
|
|
context: &mut Context<'ctx>,
|
|
position: &PolkaVMArgument<'ctx>,
|
|
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>> {
|
|
let name = <PolkaVMLoadStorageWordFunction as RuntimeFunction>::NAME;
|
|
let declaration = <PolkaVMLoadStorageWordFunction as RuntimeFunction>::declaration(context);
|
|
let arguments = [position.as_pointer(context)?.value.into()];
|
|
Ok(context
|
|
.build_call(declaration, &arguments, "storage_load")
|
|
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
|
}
|
|
|
|
/// Translates the storage store.
|
|
pub fn store<'ctx>(
|
|
context: &mut Context<'ctx>,
|
|
position: &PolkaVMArgument<'ctx>,
|
|
value: &PolkaVMArgument<'ctx>,
|
|
) -> anyhow::Result<()> {
|
|
let declaration = <PolkaVMStoreStorageWordFunction as RuntimeFunction>::declaration(context);
|
|
let arguments = [
|
|
position.as_pointer(context)?.value.into(),
|
|
value.as_pointer(context)?.value.into(),
|
|
];
|
|
context.build_call(declaration, &arguments, "storage_store");
|
|
Ok(())
|
|
}
|
|
|
|
/// Translates the transient storage load.
|
|
pub fn transient_load<'ctx>(
|
|
context: &mut Context<'ctx>,
|
|
position: &PolkaVMArgument<'ctx>,
|
|
) -> anyhow::Result<inkwell::values::BasicValueEnum<'ctx>> {
|
|
let name = <PolkaVMLoadTransientStorageWordFunction as RuntimeFunction>::NAME;
|
|
let arguments = [position.as_pointer(context)?.value.into()];
|
|
let declaration =
|
|
<PolkaVMLoadTransientStorageWordFunction as RuntimeFunction>::declaration(context);
|
|
Ok(context
|
|
.build_call(declaration, &arguments, "transient_storage_load")
|
|
.unwrap_or_else(|| panic!("runtime function {name} should return a value")))
|
|
}
|
|
|
|
/// Translates the transient storage store.
|
|
pub fn transient_store<'ctx>(
|
|
context: &mut Context<'ctx>,
|
|
position: &PolkaVMArgument<'ctx>,
|
|
value: &PolkaVMArgument<'ctx>,
|
|
) -> anyhow::Result<()> {
|
|
let declaration =
|
|
<PolkaVMStoreTransientStorageWordFunction as RuntimeFunction>::declaration(context);
|
|
let arguments = [
|
|
position.as_pointer(context)?.value.into(),
|
|
value.as_pointer(context)?.value.into(),
|
|
];
|
|
context.build_call(declaration, &arguments, "transient_storage_store");
|
|
Ok(())
|
|
}
|