mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
Sema: first pass reworking for AIR memory layout
This commit is contained in:
parent
f17a05bfb7
commit
dbd3529d1f
89
BRANCH_TODO
89
BRANCH_TODO
@ -569,95 +569,6 @@ const DumpAir = struct {
|
||||
}
|
||||
};
|
||||
|
||||
pub fn constInst(mod: *Module, arena: *Allocator, src: LazySrcLoc, typed_value: TypedValue) !*ir.Inst {
|
||||
_ = mod;
|
||||
const const_inst = try arena.create(ir.Inst.Constant);
|
||||
const_inst.* = .{
|
||||
.base = .{
|
||||
.tag = ir.Inst.Constant.base_tag,
|
||||
.ty = typed_value.ty,
|
||||
.src = src,
|
||||
},
|
||||
.val = typed_value.val,
|
||||
};
|
||||
return &const_inst.base;
|
||||
}
|
||||
|
||||
pub fn constType(mod: *Module, arena: *Allocator, src: LazySrcLoc, ty: Type) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = Type.initTag(.type),
|
||||
.val = try ty.toValue(arena),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constVoid(mod: *Module, arena: *Allocator, src: LazySrcLoc) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = Type.initTag(.void),
|
||||
.val = Value.initTag(.void_value),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constNoReturn(mod: *Module, arena: *Allocator, src: LazySrcLoc) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = Type.initTag(.noreturn),
|
||||
.val = Value.initTag(.unreachable_value),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constUndef(mod: *Module, arena: *Allocator, src: LazySrcLoc, ty: Type) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = ty,
|
||||
.val = Value.initTag(.undef),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constBool(mod: *Module, arena: *Allocator, src: LazySrcLoc, v: bool) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = Type.initTag(.bool),
|
||||
.val = ([2]Value{ Value.initTag(.bool_false), Value.initTag(.bool_true) })[@boolToInt(v)],
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constIntUnsigned(mod: *Module, arena: *Allocator, src: LazySrcLoc, ty: Type, int: u64) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = ty,
|
||||
.val = try Value.Tag.int_u64.create(arena, int),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constIntSigned(mod: *Module, arena: *Allocator, src: LazySrcLoc, ty: Type, int: i64) !*ir.Inst {
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = ty,
|
||||
.val = try Value.Tag.int_i64.create(arena, int),
|
||||
});
|
||||
}
|
||||
|
||||
pub fn constIntBig(mod: *Module, arena: *Allocator, src: LazySrcLoc, ty: Type, big_int: BigIntConst) !*ir.Inst {
|
||||
if (big_int.positive) {
|
||||
if (big_int.to(u64)) |x| {
|
||||
return mod.constIntUnsigned(arena, src, ty, x);
|
||||
} else |err| switch (err) {
|
||||
error.NegativeIntoUnsigned => unreachable,
|
||||
error.TargetTooSmall => {}, // handled below
|
||||
}
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = ty,
|
||||
.val = try Value.Tag.int_big_positive.create(arena, big_int.limbs),
|
||||
});
|
||||
} else {
|
||||
if (big_int.to(i64)) |x| {
|
||||
return mod.constIntSigned(arena, src, ty, x);
|
||||
} else |err| switch (err) {
|
||||
error.NegativeIntoUnsigned => unreachable,
|
||||
error.TargetTooSmall => {}, // handled below
|
||||
}
|
||||
return mod.constInst(arena, src, .{
|
||||
.ty = ty,
|
||||
.val = try Value.Tag.int_big_negative.create(arena, big_int.limbs),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
pub fn dumpInst(mod: *Module, scope: *Scope, inst: *ir.Inst) void {
|
||||
const zir_module = scope.namespace();
|
||||
const source = zir_module.getSource(mod) catch @panic("dumpInst failed to get source");
|
||||
|
||||
@ -1232,22 +1232,52 @@ pub const Scope = struct {
|
||||
ty: Type,
|
||||
operand: Air.Inst.Ref,
|
||||
) error{OutOfMemory}!Air.Inst.Ref {
|
||||
return block.addInst(.{
|
||||
.tag = tag,
|
||||
.data = .{ .ty_op = .{
|
||||
.ty = try block.sema.addType(ty),
|
||||
.operand = operand,
|
||||
} },
|
||||
});
|
||||
}
|
||||
|
||||
pub fn addUnOp(
|
||||
block: *Block,
|
||||
tag: Air.Inst.Tag,
|
||||
operand: Air.Inst.Ref,
|
||||
) error{OutOfMemory}!Air.Inst.Ref {
|
||||
return block.addInst(.{
|
||||
.tag = tag,
|
||||
.data = .{ .un_op = operand },
|
||||
});
|
||||
}
|
||||
|
||||
pub fn addBinOp(
|
||||
block: *Block,
|
||||
tag: Air.Inst.Tag,
|
||||
lhs: Air.Inst.Ref,
|
||||
rhs: Air.Inst.Ref,
|
||||
) error{OutOfMemory}!Air.Inst.Ref {
|
||||
return block.addInst(.{
|
||||
.tag = tag,
|
||||
.data = .{ .bin_op = .{
|
||||
.lhs = lhs,
|
||||
.rhs = rhs,
|
||||
} },
|
||||
});
|
||||
}
|
||||
|
||||
pub fn addInst(block: *Block, inst: Air.Inst) error{OutOfMemory}!Air.Inst.Ref {
|
||||
const sema = block.sema;
|
||||
const gpa = sema.gpa;
|
||||
|
||||
try sema.air_instructions.ensureUnusedCapacity(gpa, 1);
|
||||
try block.instructions.ensureUnusedCapacity(gpa, 1);
|
||||
|
||||
const inst = @intCast(Air.Inst.Index, sema.air_instructions.len);
|
||||
sema.air_instructions.appendAssumeCapacity(.{
|
||||
.tag = tag,
|
||||
.data = .{ .ty_op = .{
|
||||
.ty = try sema.addType(ty),
|
||||
.operand = operand,
|
||||
} },
|
||||
});
|
||||
block.instructions.appendAssumeCapacity(inst);
|
||||
return Sema.indexToRef(inst);
|
||||
const result_index = @intCast(Air.Inst.Index, sema.air_instructions.len);
|
||||
sema.air_instructions.appendAssumeCapacity(inst);
|
||||
block.instructions.appendAssumeCapacity(result_index);
|
||||
return Sema.indexToRef(result_index);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
444
src/Sema.zig
444
src/Sema.zig
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user