DoxigAlpha

getBase

Function parameters

Parameters

#
builder:*const Builder

Type definitions in this namespace

Types

#

Functions in this namespace

Functions

#

= 16

Values

#

Source

Implementation

#
pub fn getBase(self: Constant, builder: *const Builder) Global.Index {
    var cur = self;
    while (true) switch (cur.unwrap()) {
        .constant => |constant| {
            const item = builder.constant_items.get(constant);
            switch (item.tag) {
                .ptrtoint,
                .inttoptr,
                .bitcast,
                => cur = builder.constantExtraData(Cast, item.data).val,
                .getelementptr => cur = builder.constantExtraData(GetElementPtr, item.data).base,
                .add => {
                    const extra = builder.constantExtraData(Binary, item.data);
                    const lhs_base = extra.lhs.getBase(builder);
                    const rhs_base = extra.rhs.getBase(builder);
                    return if (lhs_base != .none and rhs_base != .none)
                        .none
                    else if (lhs_base != .none) lhs_base else rhs_base;
                },
                .sub => {
                    const extra = builder.constantExtraData(Binary, item.data);
                    if (extra.rhs.getBase(builder) != .none) return .none;
                    cur = extra.lhs;
                },
                else => return .none,
            }
        },
        .global => |global| switch (global.ptrConst(builder).kind) {
            .alias => |alias| cur = alias.ptrConst(builder).aliasee,
            .variable, .function => return global,
            .replaced => unreachable,
        },
    };
}