Skip to content

Commit 11cedc2

Browse files
fix: Over-align public constants in moduli_init (#2150)
The `two_modular_limbs_list` constant declared by `moduli_init!` and used later in the complex setup macro was not guaranteed to be aligned to a large enough alignment. This caused an issue in some use-case. This change aligns the public constant `two_modular_limbs_list` to the max block size of a modulus among all moduli declared to ensure no memory alignment issues arise. Fixes INT-5135 --------- Co-authored-by: Jonathan Wang <[email protected]>
1 parent e83607e commit 11cedc2

File tree

2 files changed

+12
-2
lines changed
  • extensions/algebra

2 files changed

+12
-2
lines changed

extensions/algebra/complex-macros/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -649,7 +649,7 @@ pub fn complex_init(input: TokenStream) -> TokenStream {
649649
#[cfg(target_os = "zkvm")]
650650
{
651651
use super::openvm_intrinsics_meta_do_not_type_this_by_yourself::{two_modular_limbs_list, limb_list_borders};
652-
let two_modulus_bytes = &two_modular_limbs_list[limb_list_borders[#mod_idx]..limb_list_borders[#mod_idx + 1]];
652+
let two_modulus_bytes = &two_modular_limbs_list.0[limb_list_borders[#mod_idx]..limb_list_borders[#mod_idx + 1]];
653653

654654
// We are going to use the numeric representation of the `rs2` register to distinguish the chip to setup.
655655
// The transpiler will transform this instruction, based on whether `rs2` is `x0` or `x1`, into a `SETUP_ADDSUB` or `SETUP_MULDIV` instruction.

extensions/algebra/moduli-macros/src/lib.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,8 @@ pub fn moduli_init(input: TokenStream) -> TokenStream {
973973

974974
let span = proc_macro::Span::call_site();
975975

976+
let mut max_block_size = 4;
977+
976978
for (mod_idx, item) in items.into_iter().enumerate() {
977979
let modulus = item.value();
978980
let modulus_bytes = string_to_bytes(&modulus);
@@ -988,6 +990,8 @@ pub fn moduli_init(input: TokenStream) -> TokenStream {
988990
panic!("limbs must be at most 48");
989991
}
990992

993+
max_block_size = max_block_size.max(block_size);
994+
991995
let block_size = proc_macro::Literal::usize_unsuffixed(block_size);
992996
let block_size = syn::Lit::new(block_size.to_string().parse::<_>().unwrap());
993997

@@ -1152,6 +1156,9 @@ pub fn moduli_init(input: TokenStream) -> TokenStream {
11521156
});
11531157
}
11541158

1159+
let max_block_size = proc_macro::Literal::usize_unsuffixed(max_block_size);
1160+
let max_block_size = syn::Lit::new(max_block_size.to_string().parse::<_>().unwrap());
1161+
11551162
let total_limbs_cnt = two_modular_limbs_flattened_list.len();
11561163
let cnt_limbs_list_len = limb_list_borders.len();
11571164
TokenStream::from(quote::quote_spanned! { span.into() =>
@@ -1162,7 +1169,10 @@ pub fn moduli_init(input: TokenStream) -> TokenStream {
11621169
}
11631170
#[allow(non_snake_case, non_upper_case_globals)]
11641171
pub mod openvm_intrinsics_meta_do_not_type_this_by_yourself {
1165-
pub const two_modular_limbs_list: [u8; #total_limbs_cnt] = [#(#two_modular_limbs_flattened_list),*];
1172+
#[repr(C, align(#max_block_size))]
1173+
pub struct Aligned<T>(pub T);
1174+
1175+
pub const two_modular_limbs_list: Aligned<[u8; #total_limbs_cnt]> = Aligned([#(#two_modular_limbs_flattened_list),*]);
11661176
pub const limb_list_borders: [usize; #cnt_limbs_list_len] = [#(#limb_list_borders),*];
11671177
}
11681178
})

0 commit comments

Comments
 (0)