vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
use crate::spec::{EngineInvariant, EngineSpec};

#[cfg(test)]
#[inline]
pub(crate) fn build_eval_input(
    programs: &[Vec<u8>],
    plan: &types::ConformEvaluationPlan<'_>,
    matches: &[types::ConformMatchEvent],
    file_ctx: &types::ConformFileContext,
    file_bytes: &[u8],
) -> Vec<u8> {
    let mut out = Vec::new();
    out.extend_from_slice(&(programs.len() as u32).to_le_bytes());
    for prog in programs {
        out.extend_from_slice(&(prog.len() as u32).to_le_bytes());
        out.extend_from_slice(prog);
    }

    out.extend_from_slice(&(plan.program_signal_counts.len() as u32).to_le_bytes());
    for &c in plan.program_signal_counts {
        out.extend_from_slice(&(c as u32).to_le_bytes());
    }

    out.extend_from_slice(&(plan.signal_to_programs.len() as u32).to_le_bytes());
    for &[a, b] in plan.signal_to_programs {
        out.extend_from_slice(&a.to_le_bytes());
        out.extend_from_slice(&b.to_le_bytes());
    }

    out.extend_from_slice(&(plan.program_list.len() as u32).to_le_bytes());
    for &v in plan.program_list {
        out.extend_from_slice(&v.to_le_bytes());
    }

    out.extend_from_slice(&(plan.signal_local_ids.len() as u32).to_le_bytes());
    for &v in plan.signal_local_ids {
        out.extend_from_slice(&v.to_le_bytes());
    }

    out.extend_from_slice(&(plan.sentinel_signal_ids.len() as u32).to_le_bytes());
    for &v in plan.sentinel_signal_ids {
        out.extend_from_slice(&v.to_le_bytes());
    }

    out.extend_from_slice(&(plan.file_boundaries.len() as u32).to_le_bytes());
    for &v in plan.file_boundaries {
        out.extend_from_slice(&v.to_le_bytes());
    }

    out.extend_from_slice(&(plan.max_cached_positions as u32).to_le_bytes());
    out.extend_from_slice(&plan.max_fired.to_le_bytes());

    out.extend_from_slice(&(matches.len() as u32).to_le_bytes());
    for m in matches {
        out.extend_from_slice(&m.signal_id.to_le_bytes());
        out.extend_from_slice(&m.start.to_le_bytes());
        out.extend_from_slice(&m.end.to_le_bytes());
    }

    out.extend_from_slice(&file_ctx.file_size.to_le_bytes());
    out.extend_from_slice(&file_ctx.entropy_bucket.to_le_bytes());
    out.extend_from_slice(&file_ctx.magic_u32.to_le_bytes());
    out.extend_from_slice(&file_ctx.is_pe.to_le_bytes());
    out.extend_from_slice(&file_ctx.is_dll.to_le_bytes());
    out.extend_from_slice(&file_ctx.is_64bit.to_le_bytes());
    out.extend_from_slice(&file_ctx.has_signature.to_le_bytes());
    out.extend_from_slice(&file_ctx.num_sections.to_le_bytes());
    out.extend_from_slice(&file_ctx.num_imports.to_le_bytes());
    out.extend_from_slice(&file_ctx.entry_point_rva.to_le_bytes());
    out.extend_from_slice(&file_ctx.unique_pattern_count.to_le_bytes());
    out.extend_from_slice(&file_ctx.total_match_count.to_le_bytes());
    out.extend_from_slice(&file_ctx.file_age_seconds.to_le_bytes());

    out.extend_from_slice(&(file_bytes.len() as u32).to_le_bytes());
    out.extend_from_slice(file_bytes);
    out
}