vyre-libs 0.6.1

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
//! Semantic-edge classification helpers shared by the GPU + CPU paths.

use crate::parsing::c::parse::vast::c_vast_word_at;
use crate::parsing::c::parse::vast::*;
use vyre_primitives::predicate::node_kind;

use super::*;

pub(super) fn related_kind(vast_nodes: &[u32], related_idx: u32, node_count: usize) -> u32 {
    if related_idx == u32::MAX {
        return 0;
    }
    let Ok(related_idx) = usize::try_from(related_idx) else {
        return 0;
    };
    if related_idx >= node_count {
        return 0;
    }
    c_vast_word_at(vast_nodes, related_idx, IDX_KIND)
}

pub(super) fn semantic_role(
    kind: u32,
    parent_kind: u32,
    first_child_kind: u32,
    next_sibling_kind: u32,
) -> u32 {
    let role = ROLE_BY_KIND
        .iter()
        .find_map(|(candidate, role)| (*candidate == kind).then_some(*role))
        .unwrap_or(C_AST_PG_ROLE_NONE);
    if kind == C_AST_KIND_POINTER_DECL
        && (parent_kind == C_AST_KIND_FUNCTION_DECLARATOR
            || first_child_kind == C_AST_KIND_FUNCTION_DECLARATOR
            || next_sibling_kind == C_AST_KIND_FUNCTION_DECLARATOR)
    {
        C_AST_PG_ROLE_FUNCTION_POINTER_DECL
    } else {
        role
    }
}

pub(super) const CONTROL_KINDS: &[u32] = &[
    C_AST_KIND_LABEL_STMT,
    C_AST_KIND_CASE_STMT,
    C_AST_KIND_DEFAULT_STMT,
    C_AST_KIND_IF_STMT,
    C_AST_KIND_ELSE_STMT,
    C_AST_KIND_SWITCH_STMT,
    C_AST_KIND_FOR_STMT,
    C_AST_KIND_WHILE_STMT,
    C_AST_KIND_DO_STMT,
    C_AST_KIND_RETURN_STMT,
    C_AST_KIND_BREAK_STMT,
    C_AST_KIND_CONTINUE_STMT,
    C_AST_KIND_GOTO_STMT,
    C_AST_KIND_BUILTIN_UNREACHABLE_STMT,
];

pub(super) const EXPRESSION_KINDS: &[u32] = &[
    C_AST_KIND_GNU_STATEMENT_EXPR,
    C_AST_KIND_ASSIGN_EXPR,
    C_AST_KIND_MEMBER_ACCESS_EXPR,
    C_AST_KIND_SIZEOF_EXPR,
    C_AST_KIND_ALIGNOF_EXPR,
    C_AST_KIND_CONDITIONAL_EXPR,
    C_AST_KIND_UNARY_EXPR,
    C_AST_KIND_ARRAY_SUBSCRIPT_EXPR,
    C_AST_KIND_GENERIC_SELECTION_EXPR,
    C_AST_KIND_RANGE_DESIGNATOR_EXPR,
    C_AST_KIND_CAST_EXPR,
    C_AST_KIND_COMPOUND_LITERAL_EXPR,
    C_AST_KIND_INITIALIZER_LIST,
];

pub(super) const GNU_KINDS: &[u32] = &[
    C_AST_KIND_INLINE_ASM,
    C_AST_KIND_ASM_TEMPLATE,
    C_AST_KIND_ASM_OUTPUT_OPERAND,
    C_AST_KIND_ASM_INPUT_OPERAND,
    C_AST_KIND_ASM_CLOBBERS_LIST,
    C_AST_KIND_ASM_GOTO_LABELS,
    C_AST_KIND_ASM_QUALIFIER,
    C_AST_KIND_GNU_ATTRIBUTE,
    C_AST_KIND_ATTRIBUTE_SECTION,
    C_AST_KIND_ATTRIBUTE_WEAK,
    C_AST_KIND_ATTRIBUTE_ALIAS,
    C_AST_KIND_ATTRIBUTE_ALIGNED,
    C_AST_KIND_ATTRIBUTE_USED,
    C_AST_KIND_ATTRIBUTE_UNUSED,
    C_AST_KIND_ATTRIBUTE_NAKED,
    C_AST_KIND_ATTRIBUTE_VISIBILITY,
    C_AST_KIND_ATTRIBUTE_PACKED,
    C_AST_KIND_ATTRIBUTE_CLEANUP,
    C_AST_KIND_ATTRIBUTE_CONSTRUCTOR,
    C_AST_KIND_ATTRIBUTE_DESTRUCTOR,
    C_AST_KIND_ATTRIBUTE_MODE,
    C_AST_KIND_ATTRIBUTE_NOINLINE,
    C_AST_KIND_ATTRIBUTE_ALWAYS_INLINE,
    C_AST_KIND_ATTRIBUTE_COLD,
    C_AST_KIND_ATTRIBUTE_HOT,
    C_AST_KIND_ATTRIBUTE_PURE,
    C_AST_KIND_ATTRIBUTE_CONST,
    C_AST_KIND_ATTRIBUTE_FORMAT,
    C_AST_KIND_ATTRIBUTE_FALLTHROUGH,
    C_AST_KIND_GNU_LABEL_ADDRESS_EXPR,
    C_AST_KIND_BUILTIN_CONSTANT_P_EXPR,
    C_AST_KIND_BUILTIN_CHOOSE_EXPR,
    C_AST_KIND_BUILTIN_TYPES_COMPATIBLE_P_EXPR,
    C_AST_KIND_BUILTIN_EXPECT_EXPR,
    C_AST_KIND_BUILTIN_OFFSETOF_EXPR,
    C_AST_KIND_BUILTIN_OBJECT_SIZE_EXPR,
    C_AST_KIND_BUILTIN_PREFETCH_EXPR,
    C_AST_KIND_BUILTIN_OVERFLOW_EXPR,
    C_AST_KIND_BUILTIN_CLASSIFY_TYPE_EXPR,
    C_AST_KIND_GNU_LOCAL_LABEL_DECL,
];

pub(super) const DECLARATION_KINDS: &[u32] = &[
    C_AST_KIND_POINTER_DECL,
    C_AST_KIND_ARRAY_DECL,
    C_AST_KIND_FUNCTION_DECLARATOR,
    C_AST_KIND_FIELD_DECL,
    C_AST_KIND_ENUMERATOR_DECL,
    C_AST_KIND_STRUCT_DECL,
    C_AST_KIND_UNION_DECL,
    C_AST_KIND_ENUM_DECL,
    C_AST_KIND_TYPEDEF_DECL,
    C_AST_KIND_FUNCTION_DEFINITION,
    C_AST_KIND_BIT_FIELD_DECL,
    C_AST_KIND_STATIC_ASSERT_DECL,
    node_kind::FUNCTION_DECL,
];

pub(super) const ROLE_BY_KIND: &[(u32, u32)] = &[
    (C_AST_KIND_LABEL_STMT, C_AST_PG_ROLE_LABEL),
    (C_AST_KIND_CASE_STMT, C_AST_PG_ROLE_CASE),
    (C_AST_KIND_DEFAULT_STMT, C_AST_PG_ROLE_DEFAULT),
    (C_AST_KIND_GOTO_STMT, C_AST_PG_ROLE_GOTO),
    (C_AST_KIND_SWITCH_STMT, C_AST_PG_ROLE_SWITCH),
    (C_AST_KIND_IF_STMT, C_AST_PG_ROLE_SELECTION),
    (C_AST_KIND_ELSE_STMT, C_AST_PG_ROLE_SELECTION),
    (C_AST_KIND_FOR_STMT, C_AST_PG_ROLE_LOOP),
    (C_AST_KIND_WHILE_STMT, C_AST_PG_ROLE_LOOP),
    (C_AST_KIND_DO_STMT, C_AST_PG_ROLE_LOOP),
    (C_AST_KIND_RETURN_STMT, C_AST_PG_ROLE_RETURN),
    (C_AST_KIND_BREAK_STMT, C_AST_PG_ROLE_BREAK),
    (C_AST_KIND_CONTINUE_STMT, C_AST_PG_ROLE_CONTINUE),
    (
        C_AST_KIND_BUILTIN_UNREACHABLE_STMT,
        C_AST_PG_ROLE_UNREACHABLE,
    ),
    (C_AST_KIND_GNU_STATEMENT_EXPR, C_AST_PG_ROLE_STATEMENT_EXPR),
    (C_AST_KIND_INLINE_ASM, C_AST_PG_ROLE_INLINE_ASM),
    (C_AST_KIND_ASM_TEMPLATE, C_AST_PG_ROLE_ASM_TEMPLATE),
    (C_AST_KIND_ASM_OUTPUT_OPERAND, C_AST_PG_ROLE_ASM_OUTPUT),
    (C_AST_KIND_ASM_INPUT_OPERAND, C_AST_PG_ROLE_ASM_INPUT),
    (C_AST_KIND_ASM_CLOBBERS_LIST, C_AST_PG_ROLE_ASM_CLOBBER),
    (C_AST_KIND_ASM_GOTO_LABELS, C_AST_PG_ROLE_ASM_GOTO_LABEL),
    (C_AST_KIND_ASM_QUALIFIER, C_AST_PG_ROLE_ASM_QUALIFIER),
    (C_AST_KIND_GNU_ATTRIBUTE, C_AST_PG_ROLE_GNU_ATTRIBUTE),
    (
        C_AST_KIND_ATTRIBUTE_SECTION,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_WEAK,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_ALIAS,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_ALIGNED,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_USED,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_UNUSED,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_NAKED,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_VISIBILITY,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_PACKED,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_CLEANUP,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_CONSTRUCTOR,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_DESTRUCTOR,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_MODE,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_NOINLINE,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_ALWAYS_INLINE,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_COLD,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (C_AST_KIND_ATTRIBUTE_HOT, C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL),
    (
        C_AST_KIND_ATTRIBUTE_PURE,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_CONST,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_FORMAT,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (
        C_AST_KIND_ATTRIBUTE_FALLTHROUGH,
        C_AST_PG_ROLE_GNU_ATTRIBUTE_DETAIL,
    ),
    (C_AST_KIND_INITIALIZER_LIST, C_AST_PG_ROLE_INITIALIZER_LIST),
    (
        C_AST_KIND_MEMBER_ACCESS_EXPR,
        C_AST_PG_ROLE_FIELD_DESIGNATOR_OR_MEMBER_ACCESS,
    ),
    (
        C_AST_KIND_ARRAY_SUBSCRIPT_EXPR,
        C_AST_PG_ROLE_ARRAY_DESIGNATOR_OR_SUBSCRIPT,
    ),
    (
        C_AST_KIND_RANGE_DESIGNATOR_EXPR,
        C_AST_PG_ROLE_RANGE_DESIGNATOR,
    ),
    (C_AST_KIND_ASSIGN_EXPR, C_AST_PG_ROLE_ASSIGNMENT),
    (
        C_AST_KIND_FUNCTION_DEFINITION,
        C_AST_PG_ROLE_FUNCTION_DEFINITION,
    ),
    (
        C_AST_KIND_FUNCTION_DECLARATOR,
        C_AST_PG_ROLE_FUNCTION_DECLARATOR,
    ),
    (C_AST_KIND_STRUCT_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
    (C_AST_KIND_UNION_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
    (C_AST_KIND_ENUM_DECL, C_AST_PG_ROLE_AGGREGATE_DECL),
    (C_AST_KIND_FIELD_DECL, C_AST_PG_ROLE_FIELD_DECL),
    (C_AST_KIND_TYPEDEF_DECL, C_AST_PG_ROLE_TYPEDEF_DECL),
    (C_AST_KIND_ENUMERATOR_DECL, C_AST_PG_ROLE_ENUMERATOR_DECL),
    (C_AST_KIND_POINTER_DECL, C_AST_PG_ROLE_POINTER_DECL),
    (C_AST_KIND_ARRAY_DECL, C_AST_PG_ROLE_ARRAY_DECL),
    (C_AST_KIND_BIT_FIELD_DECL, C_AST_PG_ROLE_BIT_FIELD_DECL),
    (
        C_AST_KIND_STATIC_ASSERT_DECL,
        C_AST_PG_ROLE_STATIC_ASSERT_DECL,
    ),
    (node_kind::FUNCTION_DECL, C_AST_PG_ROLE_DECLARATION),
    (C_AST_KIND_CAST_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_COMPOUND_LITERAL_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_SIZEOF_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_ALIGNOF_EXPR, C_AST_PG_ROLE_ALIGNOF),
    (C_AST_KIND_CONDITIONAL_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_UNARY_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_GENERIC_SELECTION_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_BUILTIN_CONSTANT_P_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_BUILTIN_CHOOSE_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (
        C_AST_KIND_BUILTIN_TYPES_COMPATIBLE_P_EXPR,
        C_AST_PG_ROLE_EXPRESSION,
    ),
    (C_AST_KIND_BUILTIN_EXPECT_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_BUILTIN_OFFSETOF_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (
        C_AST_KIND_BUILTIN_OBJECT_SIZE_EXPR,
        C_AST_PG_ROLE_EXPRESSION,
    ),
    (C_AST_KIND_BUILTIN_PREFETCH_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (C_AST_KIND_BUILTIN_OVERFLOW_EXPR, C_AST_PG_ROLE_EXPRESSION),
    (
        C_AST_KIND_BUILTIN_CLASSIFY_TYPE_EXPR,
        C_AST_PG_ROLE_EXPRESSION,
    ),
    (C_AST_KIND_GNU_LOCAL_LABEL_DECL, C_AST_PG_ROLE_DECLARATION),
    (C_AST_KIND_GNU_LABEL_ADDRESS_EXPR, C_AST_PG_ROLE_EXPRESSION),
];