authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-14 13:09:35+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-14 13:40:33+02:00
log4dae70e702f10c385be1dea552f3d6e815dc93c9
treeeb638d75d3f4934639e63c8d58c0bee83c626ce3
parenta4ac6d15c42a4a06eb5e2bfe73224384d3613bf6
signature Commit is signed but in an unrecognized format.

translate-c-2 container aliases


4 files changed, 107 insertions(+), 107 deletions(-)

lib/std/zig/render.zig+2-2
......@@ -193,7 +193,6 @@ fn renderRoot(
193193fn renderExtraNewline(tree: *ast.Tree, stream: var, start_col: *usize, node: *ast.Node) @TypeOf(stream).Child.Error!void {
194194 const first_token = node.firstToken();
195195 var prev_token = first_token;
196 if (prev_token == 0) return;
197196 while (tree.tokens.at(prev_token - 1).id == .DocComment) {
198197 prev_token -= 1;
199198 }
......@@ -2175,7 +2174,8 @@ fn renderTokenOffset(
21752174 }
21762175
21772176 while (true) {
2178 const newline_count = if (loc.line < 2) @as(u8, 1) else @as(u8, 2);
2177 assert(loc.line != 0);
2178 const newline_count = if (loc.line == 1) @as(u8, 1) else @as(u8, 2);
21792179 try stream.writeByteNTimes('\n', newline_count);
21802180 try stream.writeByteNTimes(' ', indent);
21812181 try stream.write(mem.trimRight(u8, tree.tokenSlicePtr(next_token), " "));
src-self-hosted/clang.zig-11
......@@ -713,16 +713,6 @@ pub const ZigClangRecordDecl_field_iterator = extern struct {
713713 opaque: *c_void,
714714};
715715
716pub const ZigClangElaboratedTypeKeyword = extern enum {
717 Struct,
718 Interface,
719 Union,
720 Class,
721 Enum,
722 Typename,
723 None,
724};
725
726716pub extern fn ZigClangSourceManager_getSpellingLoc(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) struct_ZigClangSourceLocation;
727717pub extern fn ZigClangSourceManager_getFilename(self: *const struct_ZigClangSourceManager, SpellingLoc: struct_ZigClangSourceLocation) ?[*:0]const u8;
728718pub extern fn ZigClangSourceManager_getSpellingLineNumber(self: ?*const struct_ZigClangSourceManager, Loc: struct_ZigClangSourceLocation) c_uint;
......@@ -967,7 +957,6 @@ pub extern fn ZigClangDeclRefExpr_getDecl(*const ZigClangDeclRefExpr) *const Zig
967957
968958pub extern fn ZigClangParenType_getInnerType(*const ZigClangParenType) ZigClangQualType;
969959
970pub extern fn ZigClangElaboratedType_getKeyword(*const struct_ZigClangElaboratedType) ZigClangElaboratedTypeKeyword;
971960pub extern fn ZigClangElaboratedType_getNamedType(*const ZigClangElaboratedType) ZigClangQualType;
972961
973962pub extern fn ZigClangAttributedType_getEquivalentType(*const ZigClangAttributedType) ZigClangQualType;
src-self-hosted/translate_c.zig+78-21
......@@ -15,7 +15,7 @@ pub const Error = error{OutOfMemory};
1515const TypeError = Error || error{UnsupportedType};
1616const TransError = TypeError || error{UnsupportedTranslation};
1717
18const DeclTable = std.HashMap(usize, []const u8, addrHash, addrEql);
18const DeclTable = std.HashMap(usize, void, addrHash, addrEql);
1919
2020fn addrHash(x: usize) u32 {
2121 switch (@typeInfo(usize).Int.bits) {
......@@ -31,6 +31,12 @@ fn addrEql(a: usize, b: usize) bool {
3131 return a == b;
3232}
3333
34const SymbolTable = std.StringHashMap(void);
35const AliasList = std.SegmentedList(struct {
36 alias: []const u8,
37 name: []const u8,
38}, 4);
39
3440const Scope = struct {
3541 id: Id,
3642 parent: ?*Scope,
......@@ -98,6 +104,8 @@ const Context = struct {
98104 err: Error,
99105 source_manager: *ZigClangSourceManager,
100106 decl_table: DeclTable,
107 alias_list: AliasList,
108 sym_table: SymbolTable,
101109 global_scope: *Scope.Root,
102110 ptr_params: std.BufSet,
103111 clang_context: *ZigClangASTContext,
......@@ -177,6 +185,8 @@ pub fn translate(
177185 .source_manager = ZigClangASTUnit_getSourceManager(ast_unit),
178186 .err = undefined,
179187 .decl_table = DeclTable.init(arena),
188 .alias_list = AliasList.init(arena),
189 .sym_table = SymbolTable.init(arena),
180190 .global_scope = try arena.create(Scope.Root),
181191 .ptr_params = std.BufSet.init(arena),
182192 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,
......@@ -191,10 +201,15 @@ pub fn translate(
191201 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {
192202 return context.err;
193203 }
204 var it = context.alias_list.iterator(0);
205 while (it.next()) |alias| {
206 if (!context.sym_table.contains(alias.alias)) {
207 try createAlias(&context, alias);
208 }
209 }
194210
195211 tree.root_node.eof_token = try appendToken(&context, .Eof, "");
196212 tree.source = source_buffer.toOwnedSlice();
197
198213 if (false) {
199214 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", tree.source);
200215 var i: usize = 0;
......@@ -240,10 +255,9 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void {
240255}
241256
242257fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
243 if (c.decl_table.contains(@ptrToInt(fn_decl))) return; // Avoid processing this decl twice
258 if (try c.decl_table.put(@ptrToInt(fn_decl), {})) |_| return; // Avoid processing this decl twice
244259 const rp = makeRestorePoint(c);
245260 const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl)));
246 _ = try c.decl_table.put(@ptrToInt(fn_decl), fn_name);
247261 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);
248262 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);
249263 const fn_type = ZigClangQualType_getTypePtr(fn_qt);
......@@ -305,7 +319,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
305319}
306320
307321fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
308 if (c.decl_table.contains(@ptrToInt(var_decl))) return; // Avoid processing this decl twice
322 if (try c.decl_table.put(@ptrToInt(var_decl), {})) |_| return; // Avoid processing this decl twice
309323 const rp = makeRestorePoint(c);
310324 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
311325
......@@ -316,7 +330,6 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
316330
317331 var scope = &c.global_scope.base;
318332 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));
319 _ = try c.decl_table.put(@ptrToInt(var_decl), var_name);
320333 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);
321334
322335 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
......@@ -388,13 +401,12 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
388401}
389402
390403fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!void {
391 if (c.decl_table.contains(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) return; // Avoid processing this decl twice
404 if (try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), {})) |_| return; // Avoid processing this decl twice
392405 const rp = makeRestorePoint(c);
393406 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
394407 const const_tok = try appendToken(c, .Keyword_const, "const");
395408
396409 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
397 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
398410 const name_tok = try appendToken(c, .Identifier, typedef_name);
399411 const eq_tok = try appendToken(c, .Equal, "=");
400412
......@@ -429,12 +441,9 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err
429441}
430442
431443fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!void {
432 if (c.decl_table.contains(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)))) return; // Avoid processing this decl twice
444 if (try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), {})) |_| return; // Avoid processing this decl twice
433445 const rp = makeRestorePoint(c);
434446
435 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
436 const const_tok = try appendToken(c, .Keyword_const, "const");
437
438447 const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl)));
439448
440449 const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl))
......@@ -447,8 +456,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
447456 if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0)
448457 return;
449458
459 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
460 const const_tok = try appendToken(c, .Keyword_const, "const");
461
450462 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
451 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
452463 const name_tok = try appendToken(c, .Identifier, name);
453464
454465 const eq_tok = try appendToken(c, .Equal, "=");
......@@ -480,6 +491,36 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
480491 };
481492
482493 try addTopLevelDecl(c, name, &node.base);
494 try c.alias_list.push(.{ .alias = bare_name, .name = name });
495}
496
497fn createAlias(c: *Context, alias: var) !void {
498 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
499 const mut_tok = try appendToken(c, .Keyword_const, "const");
500 const name_tok = try appendToken(c, .Identifier, alias.alias);
501
502 const eq_tok = try appendToken(c, .Equal, "=");
503 const init_node = try appendIdentifier(c, alias.name);
504
505 const node = try c.a().create(ast.Node.VarDecl);
506 node.* = ast.Node.VarDecl{
507 .base = ast.Node{ .id = .VarDecl },
508 .doc_comments = null,
509 .visib_token = visib_tok,
510 .thread_local_token = null,
511 .name_token = name_tok,
512 .eq_token = eq_tok,
513 .mut_token = mut_tok,
514 .comptime_token = null,
515 .extern_export_token = null,
516 .lib_name = null,
517 .type_node = null,
518 .align_node = null,
519 .section_node = null,
520 .init_node = init_node,
521 .semicolon_token = try appendToken(c, .Semicolon, ";"),
522 };
523 return addTopLevelDecl(c, alias.alias, &node.base);
483524}
484525
485526const ResultUsed = enum {
......@@ -1063,9 +1104,9 @@ fn transInitListExpr(
10631104 }
10641105
10651106 const arr_type = ZigClangType_getAsArrayTypeUnsafe(qual_type);
1066 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, qual_type);
10671107 const child_qt = ZigClangArrayType_getElementType(arr_type);
10681108 const init_count = ZigClangInitListExpr_getNumInits(expr);
1109 const const_arr_ty = @ptrCast(*const ZigClangConstantArrayType, qual_type);
10691110 const size_ap_int = ZigClangConstantArrayType_getSize(const_arr_ty);
10701111 const all_count = ZigClangAPInt_getLimitedValue(size_ap_int, std.math.maxInt(usize));
10711112 const leftover_count = all_count - init_count;
......@@ -1270,6 +1311,7 @@ fn maybeSuppressResult(
12701311
12711312fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
12721313 try c.tree.root_node.decls.push(decl_node);
1314 _ = try c.sym_table.put(name, {});
12731315}
12741316
12751317fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {
......@@ -1316,7 +1358,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
13161358 .init_arg_expr = .None,
13171359 .fields_and_decls = ast.Node.ContainerDecl.DeclList.init(c.a()),
13181360 .lbrace_token = lbrace_token,
1319 .rbrace_token = undefined, // TODO
1361 .rbrace_token = undefined,
13201362 };
13211363
13221364 var it = ZigClangRecordDecl_field_begin(record_def);
......@@ -1855,17 +1897,14 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
18551897 const record_ty = @ptrCast(*const ZigClangRecordType, ty);
18561898
18571899 const record_decl = ZigClangRecordType_getDecl(record_ty);
1858 if (rp.c.decl_table.get(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)))) |kv|
1859 return appendIdentifier(rp.c, kv.value)
1900 if (try getContainerName(rp.c, record_decl)) |name|
1901 return appendIdentifier(rp.c, name)
18601902 else
18611903 return transRecordDecl(rp.c, record_decl);
18621904 },
18631905 .Elaborated => {
18641906 const elaborated_ty = @ptrCast(*const ZigClangElaboratedType, ty);
1865 switch (ZigClangElaboratedType_getKeyword(elaborated_ty)) {
1866 .Struct, .Enum, .Union => return try transQualType(rp, ZigClangElaboratedType_getNamedType(elaborated_ty), source_loc),
1867 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported elaborated type", .{}),
1868 }
1907 return transQualType(rp, ZigClangElaboratedType_getNamedType(elaborated_ty), source_loc);
18691908 },
18701909 else => {
18711910 const type_name = rp.c.str(ZigClangType_getTypeClassName(ty));
......@@ -1874,6 +1913,24 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
18741913 }
18751914}
18761915
1916fn getContainerName(c: *Context, record_decl: *const ZigClangRecordDecl) !?[]const u8 {
1917 const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl)));
1918
1919 const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl))
1920 "union"
1921 else if (ZigClangRecordDecl_isStruct(record_decl))
1922 "struct"
1923 else {
1924 try emitWarning(c, ZigClangRecordDecl_getLocation(record_decl), "record {} is not a struct or union", .{bare_name});
1925 return null;
1926 };
1927
1928 if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0)
1929 return null;
1930
1931 return try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
1932}
1933
18771934fn isCVoid(qt: ZigClangQualType) bool {
18781935 const ty = ZigClangQualType_getTypePtr(qt);
18791936 if (ZigClangType_getTypeClass(ty) == .Builtin) {
test/translate_c.zig+27-73
......@@ -186,72 +186,6 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
186186 \\pub export var arr2: [*c]u8 = "hello";
187187 });
188188
189 cases.add_2("pointer to struct demoted to opaque due to bit fields",
190 \\struct Foo {
191 \\ unsigned int: 1;
192 \\};
193 \\struct Bar {
194 \\ struct Foo *foo;
195 \\};
196 , &[_][]const u8{ // TODO that semicolon is hideous
197 \\pub const struct_Foo = @OpaqueType() // /home/vexu/Documents/zig/zig/zig-cache/source.h:2:5: warning: struct demoted to opaque type - has bitfield
198 \\ ;
199 \\pub const struct_Bar = extern struct {
200 \\ foo: ?*struct_Foo,
201 \\};
202 });
203
204 cases.add_2("double define struct",
205 \\typedef struct Bar Bar;
206 \\typedef struct Foo Foo;
207 \\
208 \\struct Foo {
209 \\ Foo *a;
210 \\};
211 \\
212 \\struct Bar {
213 \\ Foo *a;
214 \\};
215 , &[_][]const u8{
216 \\pub const struct_Bar = extern struct {
217 \\ a: [*c]Foo,
218 \\};
219 \\pub const Bar = struct_Bar;
220 \\pub const struct_Foo = extern struct {
221 \\ a: [*c]Foo,
222 \\};
223 \\pub const Foo = struct_Foo;
224 });
225
226 cases.add_2("simple struct",
227 \\struct Foo {
228 \\ int x;
229 \\ char *y;
230 \\};
231 , &[_][]const u8{
232 \\const struct_Foo = extern struct {
233 \\ x: c_int,
234 \\ y: [*c]u8,
235 \\};
236 });
237
238 cases.add_2("self referential struct with function pointer",
239 \\struct Foo {
240 \\ void (*derp)(struct Foo *foo);
241 \\};
242 , &[_][]const u8{
243 \\pub const struct_Foo = extern struct {
244 \\ derp: ?extern fn ([*c]struct_Foo) void,
245 \\};
246 });
247 cases.add_2("struct prototype used in func",
248 \\struct Foo;
249 \\struct Foo *some_func(struct Foo *foo, int x);
250 , &[_][]const u8{
251 \\pub const struct_Foo = @OpaqueType();
252 \\pub extern fn some_func(foo: ?*struct_Foo, x: c_int) ?*struct_Foo;
253 });
254
255189 cases.add_2("array initializer expr",
256190 \\static void foo(void){
257191 \\ char arr[10] ={1};
......@@ -268,6 +202,21 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
268202 \\}
269203 });
270204
205 cases.add_2("field struct",
206 \\union OpenGLProcs {
207 \\ struct {
208 \\ int Clear;
209 \\ } gl;
210 \\};
211 , &[_][]const u8{
212 \\pub const union_OpenGLProcs = extern union {
213 \\ gl: extern struct {
214 \\ Clear: c_int,
215 \\ },
216 \\};
217 \\pub const OpenGLProcs = union_OpenGLProcs;
218 });
219
271220 /////////////// Cases for only stage1 which are TODO items for stage2 ////////////////
272221
273222 cases.add_both("typedef of function in struct field",
......@@ -284,7 +233,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
284233 \\};
285234 });
286235
287 cases.add("pointer to struct demoted to opaque due to bit fields",
236 cases.add_both("pointer to struct demoted to opaque due to bit fields",
288237 \\struct Foo {
289238 \\ unsigned int: 1;
290239 \\};
......@@ -292,7 +241,8 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
292241 \\ struct Foo *foo;
293242 \\};
294243 , &[_][]const u8{
295 \\pub const struct_Foo = @OpaqueType();
244 \\pub const struct_Foo = @OpaqueType()
245 ,
296246 \\pub const struct_Bar = extern struct {
297247 \\ foo: ?*struct_Foo,
298248 \\};
......@@ -441,7 +391,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
441391 \\}
442392 });
443393
444 cases.add("double define struct",
394 cases.add_both("double define struct",
445395 \\typedef struct Bar Bar;
446396 \\typedef struct Foo Foo;
447397 \\
......@@ -456,10 +406,14 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
456406 \\pub const struct_Foo = extern struct {
457407 \\ a: [*c]Foo,
458408 \\};
409 ,
459410 \\pub const Foo = struct_Foo;
411 ,
460412 \\pub const struct_Bar = extern struct {
461413 \\ a: [*c]Foo,
462414 \\};
415 ,
416 \\pub const Bar = struct_Bar;
463417 });
464418
465419 cases.addAllowWarnings("simple data types",
......@@ -536,7 +490,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
536490 \\pub extern fn foo(noalias bar: ?*c_void, noalias arg1: ?*c_void) void;
537491 });
538492
539 cases.add("simple struct",
493 cases.add_both("simple struct",
540494 \\struct Foo {
541495 \\ int x;
542496 \\ char *y;
......@@ -588,7 +542,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
588542 \\pub extern fn func(array: [*c]c_int) void;
589543 });
590544
591 cases.add("self referential struct with function pointer",
545 cases.add_both("self referential struct with function pointer",
592546 \\struct Foo {
593547 \\ void (*derp)(struct Foo *foo);
594548 \\};
......@@ -600,7 +554,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
600554 \\pub const Foo = struct_Foo;
601555 });
602556
603 cases.add("struct prototype used in func",
557 cases.add_both("struct prototype used in func",
604558 \\struct Foo;
605559 \\struct Foo *some_func(struct Foo *foo, int x);
606560 , &[_][]const u8{
......@@ -632,7 +586,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
632586 \\pub const THING2 = THING1;
633587 });
634588
635 cases.add("circular struct definitions",
589 cases.add_both("circular struct definitions",
636590 \\struct Bar;
637591 \\
638592 \\struct Foo {