aboutsummaryrefslogtreecommitdiff
path: root/src-self-hosted
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-05-16 01:26:18 -0400
committerAndrew Kelley <andrew@ziglang.org>2020-05-16 01:26:18 -0400
commit69a5f0d7973f2a3fefb69bc30c7dc1f0b430bba2 (patch)
treee3e8fad5e67b66f5b51b53c421187221d1cab1e5 /src-self-hosted
parenta286b5de38617809db58f918a81a650b41fbdd49 (diff)
parentf8b99331a2ca98f0e938c8caaf1cd232ad1e9fa3 (diff)
downloadzig-69a5f0d7973f2a3fefb69bc30c7dc1f0b430bba2.tar.gz
zig-69a5f0d7973f2a3fefb69bc30c7dc1f0b430bba2.zip
Merge remote-tracking branch 'origin/master' into self-hosted-incremental-compilation
Diffstat (limited to 'src-self-hosted')
-rw-r--r--src-self-hosted/clang.zig2
-rw-r--r--src-self-hosted/stage2.zig1
-rw-r--r--src-self-hosted/translate_c.zig96
-rw-r--r--src-self-hosted/zir.zig2
4 files changed, 63 insertions, 38 deletions
diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig
index 57c8496c6f..b3d67aab25 100644
--- a/src-self-hosted/clang.zig
+++ b/src-self-hosted/clang.zig
@@ -781,7 +781,7 @@ pub extern fn ZigClangSourceManager_getCharacterData(self: ?*const struct_ZigCla
pub extern fn ZigClangASTContext_getPointerType(self: ?*const struct_ZigClangASTContext, T: struct_ZigClangQualType) struct_ZigClangQualType;
pub extern fn ZigClangASTUnit_getASTContext(self: ?*struct_ZigClangASTUnit) ?*struct_ZigClangASTContext;
pub extern fn ZigClangASTUnit_getSourceManager(self: *struct_ZigClangASTUnit) *struct_ZigClangSourceManager;
-pub extern fn ZigClangASTUnit_visitLocalTopLevelDecls(self: *struct_ZigClangASTUnit, context: ?*c_void, Fn: ?extern fn (?*c_void, *const struct_ZigClangDecl) bool) bool;
+pub extern fn ZigClangASTUnit_visitLocalTopLevelDecls(self: *struct_ZigClangASTUnit, context: ?*c_void, Fn: ?fn (?*c_void, *const struct_ZigClangDecl) callconv(.C) bool) bool;
pub extern fn ZigClangRecordType_getDecl(record_ty: ?*const struct_ZigClangRecordType) *const struct_ZigClangRecordDecl;
pub extern fn ZigClangTagDecl_isThisDeclarationADefinition(self: *const ZigClangTagDecl) bool;
pub extern fn ZigClangEnumType_getDecl(record_ty: ?*const struct_ZigClangEnumType) *const struct_ZigClangEnumDecl;
diff --git a/src-self-hosted/stage2.zig b/src-self-hosted/stage2.zig
index d1bf73bb9e..bd24ffb399 100644
--- a/src-self-hosted/stage2.zig
+++ b/src-self-hosted/stage2.zig
@@ -589,6 +589,7 @@ export fn stage2_libc_parse(stage1_libc: *Stage2LibCInstallation, libc_file_z: [
error.EndOfStream => return .EndOfFile,
error.IsDir => return .IsDir,
error.ConnectionResetByPeer => unreachable,
+ error.ConnectionTimedOut => unreachable,
error.OutOfMemory => return .OutOfMemory,
error.Unseekable => unreachable,
error.SharingViolation => return .SharingViolation,
diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig
index 1c689e9f76..0b4854dcdc 100644
--- a/src-self-hosted/translate_c.zig
+++ b/src-self-hosted/translate_c.zig
@@ -668,6 +668,31 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe
return transCreateNodeIdentifier(c, builtin_name);
}
+fn checkForBuiltinTypedef(checked_name: []const u8) ?[]const u8 {
+ const table = [_][2][]const u8{
+ .{ "uint8_t", "u8" },
+ .{ "int8_t", "i8" },
+ .{ "uint16_t", "u16" },
+ .{ "int16_t", "i16" },
+ .{ "uint32_t", "u32" },
+ .{ "int32_t", "i32" },
+ .{ "uint64_t", "u64" },
+ .{ "int64_t", "i64" },
+ .{ "intptr_t", "isize" },
+ .{ "uintptr_t", "usize" },
+ .{ "ssize_t", "isize" },
+ .{ "size_t", "usize" },
+ };
+
+ for (table) |entry| {
+ if (mem.eql(u8, checked_name, entry[0])) {
+ return entry[1];
+ }
+ }
+
+ return null;
+}
+
fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node {
if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv|
return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice
@@ -678,54 +703,36 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
// TODO https://github.com/ziglang/zig/issues/3756
// TODO https://github.com/ziglang/zig/issues/1802
const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name;
-
- if (mem.eql(u8, checked_name, "uint8_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "u8")
- else if (mem.eql(u8, checked_name, "int8_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "i8")
- else if (mem.eql(u8, checked_name, "uint16_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "u16")
- else if (mem.eql(u8, checked_name, "int16_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "i16")
- else if (mem.eql(u8, checked_name, "uint32_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "u32")
- else if (mem.eql(u8, checked_name, "int32_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "i32")
- else if (mem.eql(u8, checked_name, "uint64_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "u64")
- else if (mem.eql(u8, checked_name, "int64_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "i64")
- else if (mem.eql(u8, checked_name, "intptr_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "isize")
- else if (mem.eql(u8, checked_name, "uintptr_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "usize")
- else if (mem.eql(u8, checked_name, "ssize_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "isize")
- else if (mem.eql(u8, checked_name, "size_t"))
- return transTypeDefAsBuiltin(c, typedef_decl, "usize");
+ if (checkForBuiltinTypedef(checked_name)) |builtin| {
+ return transTypeDefAsBuiltin(c, typedef_decl, builtin);
+ }
if (!top_level_visit) {
return transCreateNodeIdentifier(c, checked_name);
}
_ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name);
- const visib_tok = try appendToken(c, .Keyword_pub, "pub");
- const const_tok = try appendToken(c, .Keyword_const, "const");
- const node = try transCreateNodeVarDecl(c, true, true, checked_name);
- node.eq_token = try appendToken(c, .Equal, "=");
+ const node = (try transCreateNodeTypedef(rp, typedef_decl, true, checked_name)) orelse return null;
+ try addTopLevelDecl(c, checked_name, &node.base);
+ return transCreateNodeIdentifier(c, checked_name);
+}
+
+fn transCreateNodeTypedef(rp: RestorePoint, typedef_decl: *const ZigClangTypedefNameDecl, toplevel: bool, checked_name: []const u8) Error!?*ast.Node.VarDecl {
+ const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name);
+ node.eq_token = try appendToken(rp.c, .Equal, "=");
const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl);
node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) {
error.UnsupportedType => {
- try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});
+ try failDecl(rp.c, typedef_loc, checked_name, "unable to resolve typedef child type", .{});
return null;
},
error.OutOfMemory => |e| return e,
};
- node.semicolon_token = try appendToken(c, .Semicolon, ";");
- try addTopLevelDecl(c, checked_name, &node.base);
- return transCreateNodeIdentifier(c, checked_name);
+
+ node.semicolon_token = try appendToken(rp.c, .Semicolon, ";");
+ return node;
}
fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node {
@@ -1394,6 +1401,26 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt)
node.semicolon_token = try appendToken(c, .Semicolon, ";");
try block_scope.block_node.statements.push(&node.base);
},
+ .Typedef => {
+ const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]);
+ const name = try c.str(ZigClangNamedDecl_getName_bytes_begin(
+ @ptrCast(*const ZigClangNamedDecl, typedef_decl),
+ ));
+
+ const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
+ const underlying_type = ZigClangQualType_getTypePtr(underlying_qual);
+
+ const mangled_name = try block_scope.makeMangledName(c, name);
+ if (checkForBuiltinTypedef(name)) |builtin| {
+ try block_scope.variables.push(.{
+ .alias = builtin,
+ .name = mangled_name,
+ });
+ } else {
+ const node = (try transCreateNodeTypedef(rp, typedef_decl, false, mangled_name)) orelse return error.UnsupportedTranslation;
+ try block_scope.block_node.statements.push(&node.base);
+ }
+ },
else => |kind| return revertAndWarn(
rp,
error.UnsupportedTranslation,
@@ -4094,7 +4121,6 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
.return_type = proto_alias.return_type,
.var_args_token = null,
.extern_export_inline_token = inline_tok,
- .cc_token = null,
.body_node = null,
.lib_name = null,
.align_expr = null,
@@ -4753,7 +4779,6 @@ fn finishTransFnProto(
.return_type = .{ .Explicit = return_type_node },
.var_args_token = null, // TODO this field is broken in the AST data model
.extern_export_inline_token = extern_export_inline_tok,
- .cc_token = null,
.body_node = null,
.lib_name = null,
.align_expr = align_expr,
@@ -5119,7 +5144,6 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
.return_type = .{ .Explicit = &type_of.base },
.doc_comments = null,
.var_args_token = null,
- .cc_token = null,
.body_node = null,
.lib_name = null,
.align_expr = null,
diff --git a/src-self-hosted/zir.zig b/src-self-hosted/zir.zig
index ba6c3299f6..b3673b58ad 100644
--- a/src-self-hosted/zir.zig
+++ b/src-self-hosted/zir.zig
@@ -283,7 +283,7 @@ pub const Inst = struct {
comptime_int,
comptime_float,
- fn toType(self: BuiltinType) Type {
+ pub fn toType(self: BuiltinType) Type {
return switch (self) {
.isize => Type.initTag(.isize),
.usize => Type.initTag(.usize),