aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-04-30 23:11:20 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-04-30 23:11:20 -0700
commit351b57497b1cf2ea6ee72a3c7cfdb84b924bb368 (patch)
tree5c5d8c4185edbc6453daa80aa19f307fda0a99d7 /src/Sema.zig
parent077b8d3def537b9a36330c14c39bfa77b2e122bc (diff)
downloadzig-351b57497b1cf2ea6ee72a3c7cfdb84b924bb368.tar.gz
zig-351b57497b1cf2ea6ee72a3c7cfdb84b924bb368.zip
stage2: implement function body analysis
now with whole-file-astgen
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig37
1 files changed, 34 insertions, 3 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 298541cb08..44f8c7d370 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -65,6 +65,39 @@ const LazySrcLoc = Module.LazySrcLoc;
const RangeSet = @import("RangeSet.zig");
const AstGen = @import("AstGen.zig");
+pub fn analyzeFnBody(
+ sema: *Sema,
+ block: *Scope.Block,
+ fn_body_inst: Zir.Inst.Index,
+) InnerError!void {
+ const tags = sema.code.instructions.items(.tag);
+ const datas = sema.code.instructions.items(.data);
+ const body: []const Zir.Inst.Index = switch (tags[fn_body_inst]) {
+ .func, .func_inferred => blk: {
+ const inst_data = datas[fn_body_inst].pl_node;
+ const extra = sema.code.extraData(Zir.Inst.Func, inst_data.payload_index);
+ const param_types_len = extra.data.param_types_len;
+ const body = sema.code.extra[extra.end + param_types_len ..][0..extra.data.body_len];
+ break :blk body;
+ },
+ .extended => blk: {
+ const extended = datas[fn_body_inst].extended;
+ assert(extended.opcode == .func);
+ const extra = sema.code.extraData(Zir.Inst.ExtendedFunc, extended.operand);
+ const small = @bitCast(Zir.Inst.ExtendedFunc.Small, extended.small);
+ var extra_index: usize = extra.end;
+ extra_index += @boolToInt(small.has_lib_name);
+ extra_index += @boolToInt(small.has_cc);
+ extra_index += @boolToInt(small.has_align);
+ extra_index += extra.data.param_types_len;
+ const body = sema.code.extra[extra_index..][0..extra.data.body_len];
+ break :blk body;
+ },
+ else => unreachable,
+ };
+ _ = try sema.analyzeBody(block, body);
+}
+
/// Returns only the result from the body that is specified.
/// Only appropriate to call when it is determined at comptime that this body
/// has no peers.
@@ -2088,11 +2121,9 @@ fn analyzeCall(
try inline_sema.emitBackwardBranch(&child_block, call_src);
- if (true) @panic("TODO re-implement inline function calls");
-
// This will have return instructions analyzed as break instructions to
// the block_inst above.
- _ = try inline_sema.root(&child_block);
+ try inline_sema.analyzeFnBody(&child_block, module_fn.zir_body_inst);
const result = try inline_sema.analyzeBlockBody(block, call_src, &child_block, merges);