mirror of
https://github.com/ziglang/zig.git
synced 2025-12-06 06:13:07 +00:00
compiler: move LazySrcLoc out of std
This is in preparation for some upcoming changes to how we represent source locations in the compiler. The bulk of the change here is dealing with the removal of `src()` methods from `Zir` types.
This commit is contained in:
parent
e39cc0dff7
commit
07a24bec9a
373
lib/std/zig.zig
373
lib/std/zig.zig
@ -350,379 +350,6 @@ pub fn serializeCpuAlloc(ally: Allocator, cpu: std.Target.Cpu) Allocator.Error![
|
||||
return buffer.toOwnedSlice();
|
||||
}
|
||||
|
||||
pub const DeclIndex = enum(u32) {
|
||||
_,
|
||||
|
||||
pub fn toOptional(i: DeclIndex) OptionalDeclIndex {
|
||||
return @enumFromInt(@intFromEnum(i));
|
||||
}
|
||||
};
|
||||
|
||||
pub const OptionalDeclIndex = enum(u32) {
|
||||
none = std.math.maxInt(u32),
|
||||
_,
|
||||
|
||||
pub fn init(oi: ?DeclIndex) OptionalDeclIndex {
|
||||
return @enumFromInt(@intFromEnum(oi orelse return .none));
|
||||
}
|
||||
|
||||
pub fn unwrap(oi: OptionalDeclIndex) ?DeclIndex {
|
||||
if (oi == .none) return null;
|
||||
return @enumFromInt(@intFromEnum(oi));
|
||||
}
|
||||
};
|
||||
|
||||
/// Resolving a source location into a byte offset may require doing work
|
||||
/// that we would rather not do unless the error actually occurs.
|
||||
/// Therefore we need a data structure that contains the information necessary
|
||||
/// to lazily produce a `SrcLoc` as required.
|
||||
/// Most of the offsets in this data structure are relative to the containing Decl.
|
||||
/// This makes the source location resolve properly even when a Decl gets
|
||||
/// shifted up or down in the file, as long as the Decl's contents itself
|
||||
/// do not change.
|
||||
pub const LazySrcLoc = union(enum) {
|
||||
/// When this tag is set, the code that constructed this `LazySrcLoc` is asserting
|
||||
/// that all code paths which would need to resolve the source location are
|
||||
/// unreachable. If you are debugging this tag incorrectly being this value,
|
||||
/// look into using reverse-continue with a memory watchpoint to see where the
|
||||
/// value is being set to this tag.
|
||||
unneeded,
|
||||
/// Means the source location points to an entire file; not any particular
|
||||
/// location within the file. `file_scope` union field will be active.
|
||||
entire_file,
|
||||
/// The source location points to a byte offset within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
byte_abs: u32,
|
||||
/// The source location points to a token within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
token_abs: u32,
|
||||
/// The source location points to an AST node within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
node_abs: u32,
|
||||
/// The source location points to a byte offset within a source file,
|
||||
/// offset from the byte offset of the Decl within the file.
|
||||
/// The Decl is determined contextually.
|
||||
byte_offset: u32,
|
||||
/// This data is the offset into the token list from the Decl token.
|
||||
/// The Decl is determined contextually.
|
||||
token_offset: u32,
|
||||
/// The source location points to an AST node, which is this value offset
|
||||
/// from its containing Decl node AST index.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset: TracedOffset,
|
||||
/// The source location points to the main token of an AST node, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_main_token: i32,
|
||||
/// The source location points to the beginning of a struct initializer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_initializer: i32,
|
||||
/// The source location points to a variable declaration type expression,
|
||||
/// found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a variable declaration AST node. Next, navigate
|
||||
/// to the type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_ty: i32,
|
||||
/// The source location points to the alignment expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_align: i32,
|
||||
/// The source location points to the linksection expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_section: i32,
|
||||
/// The source location points to the addrspace expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_addrspace: i32,
|
||||
/// The source location points to the initializer of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_init: i32,
|
||||
/// The source location points to the first parameter of a builtin
|
||||
/// function call, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a builtin call AST node. Next, navigate
|
||||
/// to the first parameter.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_builtin_call_arg0: i32,
|
||||
/// Same as `node_offset_builtin_call_arg0` except arg index 1.
|
||||
node_offset_builtin_call_arg1: i32,
|
||||
node_offset_builtin_call_arg2: i32,
|
||||
node_offset_builtin_call_arg3: i32,
|
||||
node_offset_builtin_call_arg4: i32,
|
||||
node_offset_builtin_call_arg5: i32,
|
||||
/// Like `node_offset_builtin_call_arg0` but recurses through arbitrarily many calls
|
||||
/// to pointer cast builtins.
|
||||
node_offset_ptrcast_operand: i32,
|
||||
/// The source location points to the index expression of an array access
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an array access AST node. Next, navigate
|
||||
/// to the index expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_access_index: i32,
|
||||
/// The source location points to the LHS of a slice expression
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_ptr: i32,
|
||||
/// The source location points to start expression of a slice expression
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_start: i32,
|
||||
/// The source location points to the end expression of a slice
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_end: i32,
|
||||
/// The source location points to the sentinel expression of a slice
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_sentinel: i32,
|
||||
/// The source location points to the callee expression of a function
|
||||
/// call expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function call AST node. Next, navigate
|
||||
/// to the callee expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_call_func: i32,
|
||||
/// The payload is offset from the containing Decl AST node.
|
||||
/// The source location points to the field name of:
|
||||
/// * a field access expression (`a.b`), or
|
||||
/// * the callee of a method call (`a.b()`)
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_name: i32,
|
||||
/// The payload is offset from the containing Decl AST node.
|
||||
/// The source location points to the field name of the operand ("b" node)
|
||||
/// of a field initialization expression (`.a = b`)
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_name_init: i32,
|
||||
/// The source location points to the pointer of a pointer deref expression,
|
||||
/// found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a pointer deref AST node. Next, navigate
|
||||
/// to the pointer expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_deref_ptr: i32,
|
||||
/// The source location points to the assembly source code of an inline assembly
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to inline assembly AST node. Next, navigate
|
||||
/// to the asm template source code.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_asm_source: i32,
|
||||
/// The source location points to the return type of an inline assembly
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to inline assembly AST node. Next, navigate
|
||||
/// to the return type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_asm_ret_ty: i32,
|
||||
/// The source location points to the condition expression of an if
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an if expression AST node. Next, navigate
|
||||
/// to the condition expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_if_cond: i32,
|
||||
/// The source location points to a binary expression, such as `a + b`, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_op: i32,
|
||||
/// The source location points to the LHS of a binary expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a binary expression AST node. Next, navigate to the LHS.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_lhs: i32,
|
||||
/// The source location points to the RHS of a binary expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a binary expression AST node. Next, navigate to the RHS.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_rhs: i32,
|
||||
/// The source location points to the operand of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to the operand.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_operand: i32,
|
||||
/// The source location points to the else/`_` prong of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to the else/`_` prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_special_prong: i32,
|
||||
/// The source location points to all the ranges of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to any of the
|
||||
/// range nodes. The error applies to all of them.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_range: i32,
|
||||
/// The source location points to the capture of a switch_prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_prong_capture: i32,
|
||||
/// The source location points to the tag capture of a switch_prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_prong_tag_capture: i32,
|
||||
/// The source location points to the align expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_align: i32,
|
||||
/// The source location points to the addrspace expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_addrspace: i32,
|
||||
/// The source location points to the linksection expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_section: i32,
|
||||
/// The source location points to the calling convention of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_cc: i32,
|
||||
/// The source location points to the return type of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the return type node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_ret_ty: i32,
|
||||
node_offset_param: i32,
|
||||
token_offset_param: i32,
|
||||
/// The source location points to the type expression of an `anyframe->T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a `anyframe->T` expression AST node. Next, navigate
|
||||
/// to the type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_anyframe_type: i32,
|
||||
/// The source location points to the string literal of `extern "foo"`, found
|
||||
/// by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function prototype or variable declaration
|
||||
/// expression AST node. Next, navigate to the string literal of the `extern "foo"`.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_lib_name: i32,
|
||||
/// The source location points to the len expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the len expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_len: i32,
|
||||
/// The source location points to the sentinel expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_sentinel: i32,
|
||||
/// The source location points to the elem expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the elem expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_elem: i32,
|
||||
/// The source location points to the operand of an unary expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_un_op: i32,
|
||||
/// The source location points to the elem type of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_elem: i32,
|
||||
/// The source location points to the sentinel of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_sentinel: i32,
|
||||
/// The source location points to the align expr of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_align: i32,
|
||||
/// The source location points to the addrspace expr of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_addrspace: i32,
|
||||
/// The source location points to the bit-offset of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_bitoffset: i32,
|
||||
/// The source location points to the host size of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_hostsize: i32,
|
||||
/// The source location points to the tag type of an union or an enum.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_container_tag: i32,
|
||||
/// The source location points to the default value of a field.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_default: i32,
|
||||
/// The source location points to the type of an array or struct initializer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_init_ty: i32,
|
||||
/// The source location points to the LHS of an assignment.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_store_ptr: i32,
|
||||
/// The source location points to the RHS of an assignment.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_store_operand: i32,
|
||||
/// The source location points to the operand of a `return` statement, or
|
||||
/// the `return` itself if there is no explicit operand.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_return_operand: i32,
|
||||
/// The source location points to a for loop input.
|
||||
/// The Decl is determined contextually.
|
||||
for_input: struct {
|
||||
/// Points to the for loop AST node.
|
||||
for_node_offset: i32,
|
||||
/// Picks one of the inputs from the condition.
|
||||
input_index: u32,
|
||||
},
|
||||
/// The source location points to one of the captures of a for loop, found
|
||||
/// by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to one of the input nodes of a for loop.
|
||||
/// Next, navigate to the corresponding capture.
|
||||
/// The Decl is determined contextually.
|
||||
for_capture_from_input: i32,
|
||||
/// The source location points to the argument node of a function call.
|
||||
call_arg: struct {
|
||||
decl: DeclIndex,
|
||||
/// Points to the function call AST node.
|
||||
call_node_offset: i32,
|
||||
/// The index of the argument the source location points to.
|
||||
arg_index: u32,
|
||||
},
|
||||
fn_proto_param: struct {
|
||||
decl: DeclIndex,
|
||||
/// Points to the function prototype AST node.
|
||||
fn_proto_node_offset: i32,
|
||||
/// The index of the parameter the source location points to.
|
||||
param_index: u32,
|
||||
},
|
||||
array_cat_lhs: ArrayCat,
|
||||
array_cat_rhs: ArrayCat,
|
||||
|
||||
const ArrayCat = struct {
|
||||
/// Points to the array concat AST node.
|
||||
array_cat_offset: i32,
|
||||
/// The index of the element the source location points to.
|
||||
elem_index: u32,
|
||||
};
|
||||
|
||||
pub const nodeOffset = if (TracedOffset.want_tracing) nodeOffsetDebug else nodeOffsetRelease;
|
||||
|
||||
noinline fn nodeOffsetDebug(node_offset: i32) LazySrcLoc {
|
||||
var result: LazySrcLoc = .{ .node_offset = .{ .x = node_offset } };
|
||||
result.node_offset.trace.addAddr(@returnAddress(), "init");
|
||||
return result;
|
||||
}
|
||||
|
||||
fn nodeOffsetRelease(node_offset: i32) LazySrcLoc {
|
||||
return .{ .node_offset = .{ .x = node_offset } };
|
||||
}
|
||||
|
||||
/// This wraps a simple integer in debug builds so that later on we can find out
|
||||
/// where in semantic analysis the value got set.
|
||||
pub const TracedOffset = struct {
|
||||
x: i32,
|
||||
trace: std.debug.Trace = std.debug.Trace.init,
|
||||
|
||||
const want_tracing = false;
|
||||
};
|
||||
};
|
||||
|
||||
const std = @import("std.zig");
|
||||
const tokenizer = @import("zig/tokenizer.zig");
|
||||
const assert = std.debug.assert;
|
||||
|
||||
@ -20,7 +20,6 @@ const BigIntMutable = std.math.big.int.Mutable;
|
||||
const Ast = std.zig.Ast;
|
||||
|
||||
const Zir = @This();
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
|
||||
instructions: std.MultiArrayList(Inst).Slice,
|
||||
/// In order to store references to strings in fewer bytes, we copy all
|
||||
@ -2221,10 +2220,6 @@ pub const Inst = struct {
|
||||
src_node: i32,
|
||||
/// The meaning of this operand depends on the corresponding `Tag`.
|
||||
operand: Ref,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
},
|
||||
/// Used for unary operators, with a token source location.
|
||||
un_tok: struct {
|
||||
@ -2232,10 +2227,6 @@ pub const Inst = struct {
|
||||
src_tok: Ast.TokenIndex,
|
||||
/// The meaning of this operand depends on the corresponding `Tag`.
|
||||
operand: Ref,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return .{ .token_offset = self.src_tok };
|
||||
}
|
||||
},
|
||||
pl_node: struct {
|
||||
/// Offset from Decl AST node index.
|
||||
@ -2244,10 +2235,6 @@ pub const Inst = struct {
|
||||
/// index into extra.
|
||||
/// `Tag` determines what lives there.
|
||||
payload_index: u32,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
},
|
||||
pl_tok: struct {
|
||||
/// Offset from Decl AST token index.
|
||||
@ -2255,10 +2242,6 @@ pub const Inst = struct {
|
||||
/// index into extra.
|
||||
/// `Tag` determines what lives there.
|
||||
payload_index: u32,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return .{ .token_offset = self.src_tok };
|
||||
}
|
||||
},
|
||||
bin: Bin,
|
||||
/// For strings which may contain null bytes.
|
||||
@ -2281,10 +2264,6 @@ pub const Inst = struct {
|
||||
pub fn get(self: @This(), code: Zir) [:0]const u8 {
|
||||
return code.nullTerminatedString(self.start);
|
||||
}
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return .{ .token_offset = self.src_tok };
|
||||
}
|
||||
},
|
||||
/// Offset from Decl AST token index.
|
||||
tok: Ast.TokenIndex,
|
||||
@ -2313,19 +2292,11 @@ pub const Inst = struct {
|
||||
src_node: i32,
|
||||
signedness: std.builtin.Signedness,
|
||||
bit_count: u16,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
},
|
||||
@"unreachable": struct {
|
||||
/// Offset from Decl AST node index.
|
||||
/// `Tag` determines which kind of AST node this points to.
|
||||
src_node: i32,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
},
|
||||
@"break": struct {
|
||||
operand: Ref,
|
||||
@ -2339,10 +2310,6 @@ pub const Inst = struct {
|
||||
src_node: i32,
|
||||
/// The meaning of this operand depends on the corresponding `Tag`.
|
||||
inst: Index,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
},
|
||||
str_op: struct {
|
||||
/// Offset into `string_bytes`. Null-terminated.
|
||||
@ -2375,10 +2342,6 @@ pub const Inst = struct {
|
||||
src_node: Ast.Node.Index,
|
||||
/// index into extra to a `Declaration` payload.
|
||||
payload_index: u32,
|
||||
|
||||
pub fn src(self: @This()) LazySrcLoc {
|
||||
return .{ .node_abs = self.src_node };
|
||||
}
|
||||
},
|
||||
|
||||
// Make sure we don't accidentally add a field to make this union
|
||||
@ -3032,10 +2995,6 @@ pub const Inst = struct {
|
||||
/// This node provides a new absolute baseline node for all instructions within this struct.
|
||||
src_node: Ast.Node.Index,
|
||||
|
||||
pub fn src(self: StructDecl) LazySrcLoc {
|
||||
return .{ .node_abs = self.src_node };
|
||||
}
|
||||
|
||||
pub const Small = packed struct {
|
||||
has_captures_len: bool,
|
||||
has_fields_len: bool,
|
||||
@ -3165,10 +3124,6 @@ pub const Inst = struct {
|
||||
/// This node provides a new absolute baseline node for all instructions within this struct.
|
||||
src_node: Ast.Node.Index,
|
||||
|
||||
pub fn src(self: EnumDecl) LazySrcLoc {
|
||||
return .{ .node_abs = self.src_node };
|
||||
}
|
||||
|
||||
pub const Small = packed struct {
|
||||
has_tag_type: bool,
|
||||
has_captures_len: bool,
|
||||
@ -3214,10 +3169,6 @@ pub const Inst = struct {
|
||||
/// This node provides a new absolute baseline node for all instructions within this struct.
|
||||
src_node: Ast.Node.Index,
|
||||
|
||||
pub fn src(self: UnionDecl) LazySrcLoc {
|
||||
return .{ .node_abs = self.src_node };
|
||||
}
|
||||
|
||||
pub const Small = packed struct {
|
||||
has_tag_type: bool,
|
||||
has_captures_len: bool,
|
||||
@ -3247,10 +3198,6 @@ pub const Inst = struct {
|
||||
/// This node provides a new absolute baseline node for all instructions within this struct.
|
||||
src_node: Ast.Node.Index,
|
||||
|
||||
pub fn src(self: OpaqueDecl) LazySrcLoc {
|
||||
return .{ .node_abs = self.src_node };
|
||||
}
|
||||
|
||||
pub const Small = packed struct {
|
||||
has_captures_len: bool,
|
||||
has_decls_len: bool,
|
||||
@ -3367,10 +3314,6 @@ pub const Inst = struct {
|
||||
parent_ptr_type: Ref,
|
||||
field_name: Ref,
|
||||
field_ptr: Ref,
|
||||
|
||||
pub fn src(self: FieldParentPtr) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
};
|
||||
|
||||
pub const Shuffle = struct {
|
||||
@ -3520,10 +3463,6 @@ pub const Inst = struct {
|
||||
block: Ref,
|
||||
/// If `.none`, restore unconditionally.
|
||||
operand: Ref,
|
||||
|
||||
pub fn src(self: RestoreErrRetIndex) LazySrcLoc {
|
||||
return LazySrcLoc.nodeOffset(self.src_node);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@ -391,8 +391,27 @@ pub const RuntimeIndex = enum(u32) {
|
||||
|
||||
pub const ComptimeAllocIndex = enum(u32) { _ };
|
||||
|
||||
pub const DeclIndex = std.zig.DeclIndex;
|
||||
pub const OptionalDeclIndex = std.zig.OptionalDeclIndex;
|
||||
pub const DeclIndex = enum(u32) {
|
||||
_,
|
||||
|
||||
pub fn toOptional(i: DeclIndex) OptionalDeclIndex {
|
||||
return @enumFromInt(@intFromEnum(i));
|
||||
}
|
||||
};
|
||||
|
||||
pub const OptionalDeclIndex = enum(u32) {
|
||||
none = std.math.maxInt(u32),
|
||||
_,
|
||||
|
||||
pub fn init(oi: ?DeclIndex) OptionalDeclIndex {
|
||||
return @enumFromInt(@intFromEnum(oi orelse return .none));
|
||||
}
|
||||
|
||||
pub fn unwrap(oi: OptionalDeclIndex) ?DeclIndex {
|
||||
if (oi == .none) return null;
|
||||
return @enumFromInt(@intFromEnum(oi));
|
||||
}
|
||||
};
|
||||
|
||||
pub const NamespaceIndex = enum(u32) {
|
||||
_,
|
||||
|
||||
352
src/Module.zig
352
src/Module.zig
@ -13,7 +13,6 @@ const BigIntConst = std.math.big.int.Const;
|
||||
const BigIntMutable = std.math.big.int.Mutable;
|
||||
const Target = std.Target;
|
||||
const Ast = std.zig.Ast;
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
|
||||
/// Deprecated, use `Zcu`.
|
||||
const Module = Zcu;
|
||||
@ -1905,6 +1904,357 @@ pub const SrcLoc = struct {
|
||||
}
|
||||
};
|
||||
|
||||
/// Resolving a source location into a byte offset may require doing work
|
||||
/// that we would rather not do unless the error actually occurs.
|
||||
/// Therefore we need a data structure that contains the information necessary
|
||||
/// to lazily produce a `SrcLoc` as required.
|
||||
/// Most of the offsets in this data structure are relative to the containing Decl.
|
||||
/// This makes the source location resolve properly even when a Decl gets
|
||||
/// shifted up or down in the file, as long as the Decl's contents itself
|
||||
/// do not change.
|
||||
pub const LazySrcLoc = union(enum) {
|
||||
/// When this tag is set, the code that constructed this `LazySrcLoc` is asserting
|
||||
/// that all code paths which would need to resolve the source location are
|
||||
/// unreachable. If you are debugging this tag incorrectly being this value,
|
||||
/// look into using reverse-continue with a memory watchpoint to see where the
|
||||
/// value is being set to this tag.
|
||||
unneeded,
|
||||
/// Means the source location points to an entire file; not any particular
|
||||
/// location within the file. `file_scope` union field will be active.
|
||||
entire_file,
|
||||
/// The source location points to a byte offset within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
byte_abs: u32,
|
||||
/// The source location points to a token within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
token_abs: u32,
|
||||
/// The source location points to an AST node within a source file,
|
||||
/// offset from 0. The source file is determined contextually.
|
||||
/// Inside a `SrcLoc`, the `file_scope` union field will be active.
|
||||
node_abs: u32,
|
||||
/// The source location points to a byte offset within a source file,
|
||||
/// offset from the byte offset of the Decl within the file.
|
||||
/// The Decl is determined contextually.
|
||||
byte_offset: u32,
|
||||
/// This data is the offset into the token list from the Decl token.
|
||||
/// The Decl is determined contextually.
|
||||
token_offset: u32,
|
||||
/// The source location points to an AST node, which is this value offset
|
||||
/// from its containing Decl node AST index.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset: TracedOffset,
|
||||
/// The source location points to the main token of an AST node, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_main_token: i32,
|
||||
/// The source location points to the beginning of a struct initializer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_initializer: i32,
|
||||
/// The source location points to a variable declaration type expression,
|
||||
/// found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a variable declaration AST node. Next, navigate
|
||||
/// to the type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_ty: i32,
|
||||
/// The source location points to the alignment expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_align: i32,
|
||||
/// The source location points to the linksection expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_section: i32,
|
||||
/// The source location points to the addrspace expression of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_addrspace: i32,
|
||||
/// The source location points to the initializer of a var decl.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_var_decl_init: i32,
|
||||
/// The source location points to the first parameter of a builtin
|
||||
/// function call, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a builtin call AST node. Next, navigate
|
||||
/// to the first parameter.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_builtin_call_arg0: i32,
|
||||
/// Same as `node_offset_builtin_call_arg0` except arg index 1.
|
||||
node_offset_builtin_call_arg1: i32,
|
||||
node_offset_builtin_call_arg2: i32,
|
||||
node_offset_builtin_call_arg3: i32,
|
||||
node_offset_builtin_call_arg4: i32,
|
||||
node_offset_builtin_call_arg5: i32,
|
||||
/// Like `node_offset_builtin_call_arg0` but recurses through arbitrarily many calls
|
||||
/// to pointer cast builtins.
|
||||
node_offset_ptrcast_operand: i32,
|
||||
/// The source location points to the index expression of an array access
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an array access AST node. Next, navigate
|
||||
/// to the index expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_access_index: i32,
|
||||
/// The source location points to the LHS of a slice expression
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_ptr: i32,
|
||||
/// The source location points to start expression of a slice expression
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_start: i32,
|
||||
/// The source location points to the end expression of a slice
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_end: i32,
|
||||
/// The source location points to the sentinel expression of a slice
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a slice AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_slice_sentinel: i32,
|
||||
/// The source location points to the callee expression of a function
|
||||
/// call expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function call AST node. Next, navigate
|
||||
/// to the callee expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_call_func: i32,
|
||||
/// The payload is offset from the containing Decl AST node.
|
||||
/// The source location points to the field name of:
|
||||
/// * a field access expression (`a.b`), or
|
||||
/// * the callee of a method call (`a.b()`)
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_name: i32,
|
||||
/// The payload is offset from the containing Decl AST node.
|
||||
/// The source location points to the field name of the operand ("b" node)
|
||||
/// of a field initialization expression (`.a = b`)
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_name_init: i32,
|
||||
/// The source location points to the pointer of a pointer deref expression,
|
||||
/// found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a pointer deref AST node. Next, navigate
|
||||
/// to the pointer expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_deref_ptr: i32,
|
||||
/// The source location points to the assembly source code of an inline assembly
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to inline assembly AST node. Next, navigate
|
||||
/// to the asm template source code.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_asm_source: i32,
|
||||
/// The source location points to the return type of an inline assembly
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to inline assembly AST node. Next, navigate
|
||||
/// to the return type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_asm_ret_ty: i32,
|
||||
/// The source location points to the condition expression of an if
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an if expression AST node. Next, navigate
|
||||
/// to the condition expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_if_cond: i32,
|
||||
/// The source location points to a binary expression, such as `a + b`, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_op: i32,
|
||||
/// The source location points to the LHS of a binary expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a binary expression AST node. Next, navigate to the LHS.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_lhs: i32,
|
||||
/// The source location points to the RHS of a binary expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a binary expression AST node. Next, navigate to the RHS.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_bin_rhs: i32,
|
||||
/// The source location points to the operand of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to the operand.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_operand: i32,
|
||||
/// The source location points to the else/`_` prong of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to the else/`_` prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_special_prong: i32,
|
||||
/// The source location points to all the ranges of a switch expression, found
|
||||
/// by taking this AST node index offset from the containing Decl AST node,
|
||||
/// which points to a switch expression AST node. Next, navigate to any of the
|
||||
/// range nodes. The error applies to all of them.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_range: i32,
|
||||
/// The source location points to the capture of a switch_prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_prong_capture: i32,
|
||||
/// The source location points to the tag capture of a switch_prong.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_switch_prong_tag_capture: i32,
|
||||
/// The source location points to the align expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_align: i32,
|
||||
/// The source location points to the addrspace expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_addrspace: i32,
|
||||
/// The source location points to the linksection expr of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_section: i32,
|
||||
/// The source location points to the calling convention of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the calling convention node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_cc: i32,
|
||||
/// The source location points to the return type of a function type
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function type AST node. Next, navigate to
|
||||
/// the return type node.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_fn_type_ret_ty: i32,
|
||||
node_offset_param: i32,
|
||||
token_offset_param: i32,
|
||||
/// The source location points to the type expression of an `anyframe->T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a `anyframe->T` expression AST node. Next, navigate
|
||||
/// to the type expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_anyframe_type: i32,
|
||||
/// The source location points to the string literal of `extern "foo"`, found
|
||||
/// by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to a function prototype or variable declaration
|
||||
/// expression AST node. Next, navigate to the string literal of the `extern "foo"`.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_lib_name: i32,
|
||||
/// The source location points to the len expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the len expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_len: i32,
|
||||
/// The source location points to the sentinel expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the sentinel expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_sentinel: i32,
|
||||
/// The source location points to the elem expression of an `[N:S]T`
|
||||
/// expression, found by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to an `[N:S]T` expression AST node. Next, navigate
|
||||
/// to the elem expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_array_type_elem: i32,
|
||||
/// The source location points to the operand of an unary expression.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_un_op: i32,
|
||||
/// The source location points to the elem type of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_elem: i32,
|
||||
/// The source location points to the sentinel of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_sentinel: i32,
|
||||
/// The source location points to the align expr of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_align: i32,
|
||||
/// The source location points to the addrspace expr of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_addrspace: i32,
|
||||
/// The source location points to the bit-offset of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_bitoffset: i32,
|
||||
/// The source location points to the host size of a pointer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_ptr_hostsize: i32,
|
||||
/// The source location points to the tag type of an union or an enum.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_container_tag: i32,
|
||||
/// The source location points to the default value of a field.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_field_default: i32,
|
||||
/// The source location points to the type of an array or struct initializer.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_init_ty: i32,
|
||||
/// The source location points to the LHS of an assignment.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_store_ptr: i32,
|
||||
/// The source location points to the RHS of an assignment.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_store_operand: i32,
|
||||
/// The source location points to the operand of a `return` statement, or
|
||||
/// the `return` itself if there is no explicit operand.
|
||||
/// The Decl is determined contextually.
|
||||
node_offset_return_operand: i32,
|
||||
/// The source location points to a for loop input.
|
||||
/// The Decl is determined contextually.
|
||||
for_input: struct {
|
||||
/// Points to the for loop AST node.
|
||||
for_node_offset: i32,
|
||||
/// Picks one of the inputs from the condition.
|
||||
input_index: u32,
|
||||
},
|
||||
/// The source location points to one of the captures of a for loop, found
|
||||
/// by taking this AST node index offset from the containing
|
||||
/// Decl AST node, which points to one of the input nodes of a for loop.
|
||||
/// Next, navigate to the corresponding capture.
|
||||
/// The Decl is determined contextually.
|
||||
for_capture_from_input: i32,
|
||||
/// The source location points to the argument node of a function call.
|
||||
call_arg: struct {
|
||||
decl: Decl.Index,
|
||||
/// Points to the function call AST node.
|
||||
call_node_offset: i32,
|
||||
/// The index of the argument the source location points to.
|
||||
arg_index: u32,
|
||||
},
|
||||
fn_proto_param: struct {
|
||||
decl: Decl.Index,
|
||||
/// Points to the function prototype AST node.
|
||||
fn_proto_node_offset: i32,
|
||||
/// The index of the parameter the source location points to.
|
||||
param_index: u32,
|
||||
},
|
||||
array_cat_lhs: ArrayCat,
|
||||
array_cat_rhs: ArrayCat,
|
||||
|
||||
const ArrayCat = struct {
|
||||
/// Points to the array concat AST node.
|
||||
array_cat_offset: i32,
|
||||
/// The index of the element the source location points to.
|
||||
elem_index: u32,
|
||||
};
|
||||
|
||||
pub const nodeOffset = if (TracedOffset.want_tracing) nodeOffsetDebug else nodeOffsetRelease;
|
||||
|
||||
noinline fn nodeOffsetDebug(node_offset: i32) LazySrcLoc {
|
||||
var result: LazySrcLoc = .{ .node_offset = .{ .x = node_offset } };
|
||||
result.node_offset.trace.addAddr(@returnAddress(), "init");
|
||||
return result;
|
||||
}
|
||||
|
||||
fn nodeOffsetRelease(node_offset: i32) LazySrcLoc {
|
||||
return .{ .node_offset = .{ .x = node_offset } };
|
||||
}
|
||||
|
||||
/// This wraps a simple integer in debug builds so that later on we can find out
|
||||
/// where in semantic analysis the value got set.
|
||||
pub const TracedOffset = struct {
|
||||
x: i32,
|
||||
trace: std.debug.Trace = std.debug.Trace.init,
|
||||
|
||||
const want_tracing = false;
|
||||
};
|
||||
};
|
||||
|
||||
pub const SemaError = error{ OutOfMemory, AnalysisFail };
|
||||
pub const CompileError = error{
|
||||
OutOfMemory,
|
||||
|
||||
348
src/Sema.zig
348
src/Sema.zig
File diff suppressed because it is too large
Load Diff
@ -1048,7 +1048,6 @@ fn checkComptimeVarStore(
|
||||
const std = @import("std");
|
||||
const assert = std.debug.assert;
|
||||
const Allocator = std.mem.Allocator;
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
|
||||
const InternPool = @import("../InternPool.zig");
|
||||
const ComptimeAllocIndex = InternPool.ComptimeAllocIndex;
|
||||
@ -1057,3 +1056,5 @@ const Block = Sema.Block;
|
||||
const MutableValue = @import("../mutable_value.zig").MutableValue;
|
||||
const Type = @import("../type.zig").Type;
|
||||
const Value = @import("../Value.zig");
|
||||
const Zcu = @import("../Module.zig");
|
||||
const LazySrcLoc = Zcu.LazySrcLoc;
|
||||
|
||||
@ -16,7 +16,7 @@ const Decl = Module.Decl;
|
||||
const Type = @import("../../type.zig").Type;
|
||||
const Value = @import("../../Value.zig");
|
||||
const Compilation = @import("../../Compilation.zig");
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
const LazySrcLoc = Module.LazySrcLoc;
|
||||
const link = @import("../../link.zig");
|
||||
const Air = @import("../../Air.zig");
|
||||
const Liveness = @import("../../Liveness.zig");
|
||||
|
||||
@ -13,7 +13,7 @@ const Type = @import("../type.zig").Type;
|
||||
const C = link.File.C;
|
||||
const Decl = Zcu.Decl;
|
||||
const trace = @import("../tracy.zig").trace;
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
const LazySrcLoc = Zcu.LazySrcLoc;
|
||||
const Air = @import("../Air.zig");
|
||||
const Liveness = @import("../Liveness.zig");
|
||||
const InternPool = @import("../InternPool.zig");
|
||||
|
||||
@ -2581,8 +2581,8 @@ pub const AlignAs = packed struct {
|
||||
const Alignment = @import("../../InternPool.zig").Alignment;
|
||||
const assert = std.debug.assert;
|
||||
const CType = @This();
|
||||
const DeclIndex = std.zig.DeclIndex;
|
||||
const Module = @import("../../Package/Module.zig");
|
||||
const std = @import("std");
|
||||
const Type = @import("../../type.zig").Type;
|
||||
const Zcu = @import("../../Module.zig");
|
||||
const DeclIndex = @import("../../InternPool.zig").DeclIndex;
|
||||
|
||||
@ -22,7 +22,7 @@ const Air = @import("../Air.zig");
|
||||
const Liveness = @import("../Liveness.zig");
|
||||
const Value = @import("../Value.zig");
|
||||
const Type = @import("../type.zig").Type;
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
const LazySrcLoc = Zcu.LazySrcLoc;
|
||||
const x86_64_abi = @import("../arch/x86_64/abi.zig");
|
||||
const wasm_c_abi = @import("../arch/wasm/abi.zig");
|
||||
const aarch64_c_abi = @import("../arch/aarch64/abi.zig");
|
||||
|
||||
@ -9,7 +9,7 @@ const Module = @import("../Module.zig");
|
||||
const Decl = Module.Decl;
|
||||
const Type = @import("../type.zig").Type;
|
||||
const Value = @import("../Value.zig");
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
const LazySrcLoc = Module.LazySrcLoc;
|
||||
const Air = @import("../Air.zig");
|
||||
const Liveness = @import("../Liveness.zig");
|
||||
const InternPool = @import("../InternPool.zig");
|
||||
|
||||
@ -6,8 +6,9 @@ const Ast = std.zig.Ast;
|
||||
const InternPool = @import("InternPool.zig");
|
||||
|
||||
const Zir = std.zig.Zir;
|
||||
const Module = @import("Module.zig");
|
||||
const LazySrcLoc = std.zig.LazySrcLoc;
|
||||
const Zcu = @import("Module.zig");
|
||||
const Module = Zcu;
|
||||
const LazySrcLoc = Zcu.LazySrcLoc;
|
||||
|
||||
/// Write human-readable, debug formatted ZIR code to a file.
|
||||
pub fn renderAsTextToFile(
|
||||
@ -630,7 +631,7 @@ const Writer = struct {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].un_node;
|
||||
try self.writeInstRef(stream, inst_data.operand);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeUnTok(
|
||||
@ -641,7 +642,7 @@ const Writer = struct {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].un_tok;
|
||||
try self.writeInstRef(stream, inst_data.operand);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcTok(stream, inst_data.src_tok);
|
||||
}
|
||||
|
||||
fn writeValidateDestructure(
|
||||
@ -655,7 +656,7 @@ const Writer = struct {
|
||||
try stream.print(", {d}) (destructure=", .{extra.expect_len});
|
||||
try self.writeSrc(stream, LazySrcLoc.nodeOffset(extra.destructure_node));
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeValidateArrayInitTy(
|
||||
@ -667,7 +668,7 @@ const Writer = struct {
|
||||
const extra = self.code.extraData(Zir.Inst.ArrayInit, inst_data.payload_index).data;
|
||||
try self.writeInstRef(stream, extra.ty);
|
||||
try stream.print(", {d}) ", .{extra.init_count});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeArrayTypeSentinel(
|
||||
@ -683,7 +684,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.elem_type);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePtrType(
|
||||
@ -763,11 +764,10 @@ const Writer = struct {
|
||||
fn writeFloat128(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
|
||||
const extra = self.code.extraData(Zir.Inst.Float128, inst_data.payload_index).data;
|
||||
const src = inst_data.src();
|
||||
const number = extra.get();
|
||||
// TODO improve std.format to be able to print f128 values
|
||||
try stream.print("{d}) ", .{@as(f64, @floatCast(number))});
|
||||
try self.writeSrc(stream, src);
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeStr(
|
||||
@ -787,7 +787,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.start);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSliceEnd(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -799,7 +799,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.end);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSliceSentinel(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -813,7 +813,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.sentinel);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSliceLength(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -829,7 +829,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, extra.sentinel);
|
||||
}
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeUnionInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -841,7 +841,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.init);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeShuffle(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -855,7 +855,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.mask);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSelect(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -880,7 +880,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.addend);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeBuiltinCall(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -896,7 +896,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.args);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeFieldParentPtr(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -913,7 +913,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.field_ptr);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, extra.src());
|
||||
try self.writeSrcNode(stream, extra.src_node);
|
||||
}
|
||||
|
||||
fn writeBuiltinAsyncCall(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -944,7 +944,7 @@ const Writer = struct {
|
||||
}
|
||||
try self.writeBracedBody(stream, body);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcTok(stream, inst_data.src_tok);
|
||||
}
|
||||
|
||||
fn writePlNodeBin(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -954,7 +954,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.rhs);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeMultiOp(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -967,7 +967,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, arg);
|
||||
}
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeArrayMul(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -979,7 +979,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.rhs);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeElemValImm(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -994,7 +994,7 @@ const Writer = struct {
|
||||
|
||||
try self.writeInstRef(stream, extra.ptr);
|
||||
try stream.print(", {d}) ", .{extra.index});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeExport(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1006,7 +1006,7 @@ const Writer = struct {
|
||||
try stream.print(", {p}, ", .{std.zig.fmtId(decl_name)});
|
||||
try self.writeInstRef(stream, extra.options);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeExportValue(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1017,7 +1017,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.options);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeValidateArrayInitRefTy(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1027,7 +1027,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, extra.ptr_ty);
|
||||
try stream.writeAll(", ");
|
||||
try stream.print(", {}) ", .{extra.elem_count});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeStructInit(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1051,7 +1051,7 @@ const Writer = struct {
|
||||
try stream.writeAll("]");
|
||||
}
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeCmpxchg(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -1110,7 +1110,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.ordering);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeAtomicStore(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1123,7 +1123,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.ordering);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeAtomicRmw(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1138,7 +1138,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.ordering);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeStructInitAnon(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1159,7 +1159,7 @@ const Writer = struct {
|
||||
try stream.writeAll("]");
|
||||
}
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeStructInitFieldType(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1168,7 +1168,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, extra.container_type);
|
||||
const field_name = self.code.nullTerminatedString(extra.name_start);
|
||||
try stream.print(", {s}) ", .{field_name});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeFieldTypeRef(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1178,7 +1178,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.field_name);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeNodeMultiOp(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -1202,7 +1202,7 @@ const Writer = struct {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].inst_node;
|
||||
try self.writeInstIndex(stream, inst_data.inst);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeAsm(
|
||||
@ -1347,13 +1347,13 @@ const Writer = struct {
|
||||
}
|
||||
|
||||
try stream.writeAll("]) ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeBlock(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
|
||||
try self.writePlNodeBlockWithoutSrc(stream, inst);
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeBlockWithoutSrc(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1375,7 +1375,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeBracedBody(stream, else_body);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeTry(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -1386,7 +1386,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeBracedBody(stream, body);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeStructDecl(self: *Writer, stream: anytype, extended: Zir.Inst.Extended.InstData) !void {
|
||||
@ -1480,7 +1480,7 @@ const Writer = struct {
|
||||
}
|
||||
|
||||
if (fields_len == 0) {
|
||||
try stream.writeAll("{}, {})");
|
||||
try stream.writeAll("{}, {}) ");
|
||||
} else {
|
||||
const bits_per_field = 4;
|
||||
const fields_per_u32 = 32 / bits_per_field;
|
||||
@ -1596,7 +1596,7 @@ const Writer = struct {
|
||||
|
||||
self.indent -= 2;
|
||||
try stream.writeByteNTimes(' ', self.indent);
|
||||
try stream.writeAll("})");
|
||||
try stream.writeAll("}) ");
|
||||
}
|
||||
try self.writeSrcNode(stream, 0);
|
||||
}
|
||||
@ -1688,7 +1688,7 @@ const Writer = struct {
|
||||
}
|
||||
|
||||
if (fields_len == 0) {
|
||||
try stream.writeAll("})");
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrcNode(stream, 0);
|
||||
return;
|
||||
}
|
||||
@ -1762,7 +1762,7 @@ const Writer = struct {
|
||||
|
||||
self.indent -= 2;
|
||||
try stream.writeByteNTimes(' ', self.indent);
|
||||
try stream.writeAll("})");
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrcNode(stream, 0);
|
||||
}
|
||||
|
||||
@ -1855,7 +1855,7 @@ const Writer = struct {
|
||||
|
||||
try self.writeBracedDecl(stream, body);
|
||||
if (fields_len == 0) {
|
||||
try stream.writeAll(", {})");
|
||||
try stream.writeAll(", {}) ");
|
||||
} else {
|
||||
try stream.writeAll(", {\n");
|
||||
|
||||
@ -1896,7 +1896,7 @@ const Writer = struct {
|
||||
}
|
||||
self.indent -= 2;
|
||||
try stream.writeByteNTimes(' ', self.indent);
|
||||
try stream.writeAll("})");
|
||||
try stream.writeAll("}) ");
|
||||
}
|
||||
try self.writeSrcNode(stream, 0);
|
||||
}
|
||||
@ -1944,14 +1944,14 @@ const Writer = struct {
|
||||
}
|
||||
|
||||
if (decls_len == 0) {
|
||||
try stream.writeAll("{})");
|
||||
try stream.writeAll("{}) ");
|
||||
} else {
|
||||
try stream.writeAll("{\n");
|
||||
self.indent += 2;
|
||||
try self.writeBody(stream, self.code.bodySlice(extra_index, decls_len));
|
||||
self.indent -= 2;
|
||||
try stream.writeByteNTimes(' ', self.indent);
|
||||
try stream.writeAll("})");
|
||||
try stream.writeAll("}) ");
|
||||
}
|
||||
try self.writeSrcNode(stream, 0);
|
||||
}
|
||||
@ -1982,7 +1982,7 @@ const Writer = struct {
|
||||
try stream.writeByteNTimes(' ', self.indent);
|
||||
try stream.writeAll("}) ");
|
||||
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSwitchBlockErrUnion(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2119,7 +2119,7 @@ const Writer = struct {
|
||||
self.indent -= 2;
|
||||
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeSwitchBlock(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2249,7 +2249,7 @@ const Writer = struct {
|
||||
self.indent -= 2;
|
||||
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeField(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2258,7 +2258,7 @@ const Writer = struct {
|
||||
const name = self.code.nullTerminatedString(extra.field_name_start);
|
||||
try self.writeInstRef(stream, extra.lhs);
|
||||
try stream.print(", \"{}\") ", .{std.zig.fmtEscapes(name)});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writePlNodeFieldNamed(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2268,7 +2268,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.field_name);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeAs(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2278,7 +2278,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeInstRef(stream, extra.operand);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeNode(
|
||||
@ -2300,7 +2300,7 @@ const Writer = struct {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].str_tok;
|
||||
const str = inst_data.get(self.code);
|
||||
try stream.print("\"{}\") ", .{std.zig.fmtEscapes(str)});
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcTok(stream, inst_data.src_tok);
|
||||
}
|
||||
|
||||
fn writeStrOp(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2317,7 +2317,6 @@ const Writer = struct {
|
||||
inferred_error_set: bool,
|
||||
) !void {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
|
||||
const src = inst_data.src();
|
||||
const extra = self.code.extraData(Zir.Inst.Func, inst_data.payload_index);
|
||||
|
||||
var extra_index = extra.end;
|
||||
@ -2364,7 +2363,7 @@ const Writer = struct {
|
||||
ret_ty_body,
|
||||
|
||||
body,
|
||||
src,
|
||||
inst_data.src_node,
|
||||
src_locs,
|
||||
0,
|
||||
);
|
||||
@ -2373,7 +2372,6 @@ const Writer = struct {
|
||||
fn writeFuncFancy(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].pl_node;
|
||||
const extra = self.code.extraData(Zir.Inst.FuncFancy, inst_data.payload_index);
|
||||
const src = inst_data.src();
|
||||
|
||||
var extra_index: usize = extra.end;
|
||||
var align_ref: Zir.Inst.Ref = .none;
|
||||
@ -2470,7 +2468,7 @@ const Writer = struct {
|
||||
ret_ty_ref,
|
||||
ret_ty_body,
|
||||
body,
|
||||
src,
|
||||
inst_data.src_node,
|
||||
src_locs,
|
||||
noalias_bits,
|
||||
);
|
||||
@ -2551,7 +2549,7 @@ const Writer = struct {
|
||||
try stream.writeAll(", ");
|
||||
try self.writeBracedBody(stream, body);
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeIntType(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2561,7 +2559,7 @@ const Writer = struct {
|
||||
.unsigned => 'u',
|
||||
};
|
||||
try stream.print("{c}{d}) ", .{ prefix, int_type.bit_count });
|
||||
try self.writeSrc(stream, int_type.src());
|
||||
try self.writeSrcNode(stream, int_type.src_node);
|
||||
}
|
||||
|
||||
fn writeSaveErrRetIndex(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2579,7 +2577,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, extra.operand);
|
||||
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, extra.src());
|
||||
try self.writeSrcNode(stream, extra.src_node);
|
||||
}
|
||||
|
||||
fn writeBreak(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2605,7 +2603,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, arg);
|
||||
}
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeArrayInitAnon(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2620,7 +2618,7 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, arg);
|
||||
}
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeArrayInitSent(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2640,13 +2638,13 @@ const Writer = struct {
|
||||
try self.writeInstRef(stream, elem);
|
||||
}
|
||||
try stream.writeAll("}) ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeUnreachable(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
const inst_data = self.code.instructions.items(.data)[@intFromEnum(inst)].@"unreachable";
|
||||
try stream.writeAll(") ");
|
||||
try self.writeSrc(stream, inst_data.src());
|
||||
try self.writeSrcNode(stream, inst_data.src_node);
|
||||
}
|
||||
|
||||
fn writeFuncCommon(
|
||||
@ -2667,7 +2665,7 @@ const Writer = struct {
|
||||
ret_ty_ref: Zir.Inst.Ref,
|
||||
ret_ty_body: []const Zir.Inst.Index,
|
||||
body: []const Zir.Inst.Index,
|
||||
src: LazySrcLoc,
|
||||
src_node: i32,
|
||||
src_locs: Zir.Inst.Func.SrcLocs,
|
||||
noalias_bits: u32,
|
||||
) !void {
|
||||
@ -2694,7 +2692,7 @@ const Writer = struct {
|
||||
src_locs.rbrace_line + 1, @as(u16, @truncate(src_locs.columns >> 16)) + 1,
|
||||
});
|
||||
}
|
||||
try self.writeSrc(stream, src);
|
||||
try self.writeSrcNode(stream, src_node);
|
||||
}
|
||||
|
||||
fn writeDbgStmt(self: *Writer, stream: anytype, inst: Zir.Inst.Index) !void {
|
||||
@ -2878,11 +2876,12 @@ const Writer = struct {
|
||||
}
|
||||
}
|
||||
|
||||
fn writeSrcNode(self: *Writer, stream: anytype, src_node: ?i32) !void {
|
||||
const node_offset = src_node orelse return;
|
||||
const src = LazySrcLoc.nodeOffset(node_offset);
|
||||
try stream.writeAll(" ");
|
||||
return self.writeSrc(stream, src);
|
||||
fn writeSrcNode(self: *Writer, stream: anytype, src_node: i32) !void {
|
||||
return self.writeSrc(stream, LazySrcLoc.nodeOffset(src_node));
|
||||
}
|
||||
|
||||
fn writeSrcTok(self: *Writer, stream: anytype, src_tok: u32) !void {
|
||||
return self.writeSrc(stream, .{ .token_offset = src_tok });
|
||||
}
|
||||
|
||||
fn writeBracedDecl(self: *Writer, stream: anytype, body: []const Zir.Inst.Index) !void {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user