aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2021-09-20 21:05:42 +0300
committerAndrew Kelley <andrew@ziglang.org>2021-09-20 20:51:31 -0700
commit55e7c099caa7cf8dc253dac21765bb994e06b741 (patch)
tree8bca8b4f585bc0beb70e78346d704fbeb2b3eadd /src
parentd64d5cfc0a72a9989ed58548dd806a663f847ef5 (diff)
downloadzig-55e7c099caa7cf8dc253dac21765bb994e06b741.tar.gz
zig-55e7c099caa7cf8dc253dac21765bb994e06b741.zip
stage2: various fixes to cImport, sizeOf and types to get tests passing
Diffstat (limited to 'src')
-rw-r--r--src/AstGen.zig5
-rw-r--r--src/Compilation.zig2
-rw-r--r--src/Sema.zig41
-rw-r--r--src/print_zir.zig18
-rw-r--r--src/type.zig2
5 files changed, 56 insertions, 12 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig
index 32b62fc3f5..176203d37f 100644
--- a/src/AstGen.zig
+++ b/src/AstGen.zig
@@ -7082,7 +7082,7 @@ fn builtinCall(
.bit_cast => return bitCast( gz, scope, rl, node, params[0], params[1]),
.TypeOf => return typeOf( gz, scope, rl, node, params),
.union_init => return unionInit(gz, scope, rl, node, params),
- .c_import => return cImport( gz, scope, rl, node, params[0]),
+ .c_import => return cImport( gz, scope, node, params[0]),
.@"export" => {
const node_tags = tree.nodes.items(.tag);
@@ -7692,7 +7692,6 @@ fn shiftOp(
fn cImport(
gz: *GenZir,
scope: *Scope,
- rl: ResultLoc,
node: Ast.Node.Index,
body_node: Ast.Node.Index,
) InnerError!Zir.Inst.Ref {
@@ -7712,7 +7711,7 @@ fn cImport(
try block_scope.setBlockBody(block_inst);
try gz.instructions.append(gpa, block_inst);
- return rvalue(gz, rl, .void_value, node);
+ return indexToRef(block_inst);
}
fn overflowArithmetic(
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 55cc9d0867..53e643acb8 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -2644,7 +2644,7 @@ pub fn cImport(comp: *Compilation, c_src: []const u8) !CImportResult {
const dep_basename = std.fs.path.basename(out_dep_path);
try man.addDepFilePost(zig_cache_tmp_dir, dep_basename);
- if (build_options.is_stage1) try comp.stage1_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename);
+ if (build_options.is_stage1 and comp.bin_file.options.use_stage1) try comp.stage1_cache_manifest.addDepFilePost(zig_cache_tmp_dir, dep_basename);
const digest = man.final();
const o_sub_path = try std.fs.path.join(arena, &[_][]const u8{ "o", &digest });
diff --git a/src/Sema.zig b/src/Sema.zig
index 2d50462f91..1bb071f4f5 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2183,11 +2183,10 @@ fn zirCImport(sema: *Sema, parent_block: *Scope.Block, inst: Zir.Inst.Index) Com
@import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
return sema.mod.failWithOwnedErrorMsg(&child_block.base, msg);
}
- const c_import_pkg = @import("Package.zig").createWithDir(
+ const c_import_pkg = @import("Package.zig").create(
sema.gpa,
- sema.mod.comp.local_cache_directory,
null,
- std.fs.path.basename(c_import_res.out_zig_path),
+ c_import_res.out_zig_path,
) catch |err| switch (err) {
error.OutOfMemory => return error.OutOfMemory,
else => unreachable, // we pass null for root_src_dir_path
@@ -2200,6 +2199,9 @@ fn zirCImport(sema: *Sema, parent_block: *Scope.Block, inst: Zir.Inst.Index) Com
const result = sema.mod.importPkg(c_import_pkg) catch |err|
return sema.mod.fail(&child_block.base, src, "C import failed: {s}", .{@errorName(err)});
+ sema.mod.astGenFile(result.file) catch |err|
+ return sema.mod.fail(&child_block.base, src, "C import failed: {s}", .{@errorName(err)});
+
try sema.mod.semaFile(result.file);
const file_root_decl = result.file.root_decl.?;
try sema.mod.declareDeclDependency(sema.owner_decl, file_root_decl);
@@ -6467,10 +6469,41 @@ fn runtimeBoolCmp(
fn zirSizeOf(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
const inst_data = sema.code.instructions.items(.data)[inst].un_node;
+ const src = inst_data.src();
const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
const operand_ty = try sema.resolveType(block, operand_src, inst_data.operand);
const target = sema.mod.getTarget();
- const abi_size = operand_ty.abiSize(target);
+ const abi_size = switch (operand_ty.zigTypeTag()) {
+ .Fn => unreachable,
+ .NoReturn,
+ .Undefined,
+ .Null,
+ .BoundFn,
+ .Opaque,
+ => return sema.mod.fail(&block.base, src, "no size available for type '{}'", .{operand_ty}),
+ .Type,
+ .EnumLiteral,
+ .ComptimeFloat,
+ .ComptimeInt,
+ .Void,
+ => 0,
+
+ .Bool,
+ .Int,
+ .Float,
+ .Pointer,
+ .Array,
+ .Struct,
+ .Optional,
+ .ErrorUnion,
+ .ErrorSet,
+ .Enum,
+ .Union,
+ .Vector,
+ .Frame,
+ .AnyFrame,
+ => operand_ty.abiSize(target),
+ };
return sema.addIntUnsigned(Type.initTag(.comptime_int), abi_size);
}
diff --git a/src/print_zir.zig b/src/print_zir.zig
index 94fa0307bd..35b3da4479 100644
--- a/src/print_zir.zig
+++ b/src/print_zir.zig
@@ -407,15 +407,27 @@ const Writer = struct {
.mul_with_saturation,
.shl_with_saturation,
=> try self.writeSaturatingArithmetic(stream, extended),
+
.struct_decl => try self.writeStructDecl(stream, extended),
.union_decl => try self.writeUnionDecl(stream, extended),
.enum_decl => try self.writeEnumDecl(stream, extended),
+ .c_undef, .c_include => {
+ const inst_data = self.code.extraData(Zir.Inst.UnNode, extended.operand).data;
+ try self.writeInstRef(stream, inst_data.operand);
+ try stream.writeAll(") ");
+ },
+
+ .c_define => {
+ const inst_data = self.code.extraData(Zir.Inst.BinNode, extended.operand).data;
+ try self.writeInstRef(stream, inst_data.lhs);
+ try stream.writeAll(", ");
+ try self.writeInstRef(stream, inst_data.rhs);
+ try stream.writeByte(')');
+ },
+
.alloc,
.builtin_extern,
- .c_undef,
- .c_include,
- .c_define,
.wasm_memory_size,
.wasm_memory_grow,
=> try stream.writeAll("TODO))"),
diff --git a/src/type.zig b/src/type.zig
index db193639a7..5d184ed2fc 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -602,8 +602,8 @@ pub const Type = extern union {
}
return false;
},
+ .Float => return a.tag() == b.tag(),
.Opaque,
- .Float,
.BoundFn,
.Frame,
=> std.debug.panic("TODO implement Type equality comparison of {} and {}", .{ a, b }),