authorgravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-30 21:27:08-07:00
committergravatar for evan@lagerdata.comEvan Haas <evan@lagerdata.com> 2024-07-31 09:35:07-07:00
log6a103d87f650ed7cac79866033e3136433259f67
tree5cc6637fd3f13f42bf9ef32b712a1b21ae32b254
parent055077f9dd0091a0e071243e10e4d2500038d0be
signaturebadge-check Signed by SSH key SHA256:cf2/TFgSxv2uRX26INvFSw25Prr1Dy9H8MiRXgLpok4

aro_translate_c: basic typedef support


1 files changed, 41 insertions(+), 3 deletions(-)

lib/compiler/aro_translate_c.zig+41-3
...@@ -185,7 +185,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void {...@@ -185,7 +185,7 @@ fn prepopulateGlobalNameTable(c: *Context) !void {
185 for (c.tree.root_decls) |node| {185 for (c.tree.root_decls) |node| {
186 const data = node_data[@intFromEnum(node)];186 const data = node_data[@intFromEnum(node)];
187 switch (node_tags[@intFromEnum(node)]) {187 switch (node_tags[@intFromEnum(node)]) {
188 .typedef => @panic("TODO"),188 .typedef => {},
189189
190 .struct_decl_two,190 .struct_decl_two,
191 .union_decl_two,191 .union_decl_two,
...@@ -309,8 +309,46 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void {...@@ -309,8 +309,46 @@ fn transDecl(c: *Context, scope: *Scope, decl: NodeIndex) !void {
309 }309 }
310}310}
311311
312fn transTypeDef(_: *Context, _: *Scope, _: NodeIndex) Error!void {312fn transTypeDef(c: *Context, scope: *Scope, typedef_decl: NodeIndex) Error!void {
313 @panic("TODO");313 const ty = c.tree.nodes.items(.ty)[@intFromEnum(typedef_decl)];
314 const data = c.tree.nodes.items(.data)[@intFromEnum(typedef_decl)];
315
316 const toplevel = scope.id == .root;
317 const bs: *Scope.Block = if (!toplevel) try scope.findBlockScope(c) else undefined;
318
319 var name: []const u8 = c.tree.tokSlice(data.decl.name);
320 try c.typedefs.put(c.gpa, name, {});
321
322 if (!toplevel) name = try bs.makeMangledName(c, name);
323
324 const typedef_loc = data.decl.name;
325 const init_node = transType(c, scope, ty, .standard, typedef_loc) catch |err| switch (err) {
326 error.UnsupportedType => {
327 return failDecl(c, typedef_loc, name, "unable to resolve typedef child type", .{});
328 },
329 error.OutOfMemory => |e| return e,
330 };
331
332 const payload = try c.arena.create(ast.Payload.SimpleVarDecl);
333 payload.* = .{
334 .base = .{ .tag = ([2]ZigTag{ .var_simple, .pub_var_simple })[@intFromBool(toplevel)] },
335 .data = .{
336 .name = name,
337 .init = init_node,
338 },
339 };
340 const node = ZigNode.initPayload(&payload.base);
341
342 if (toplevel) {
343 try addTopLevelDecl(c, name, node);
344 } else {
345 try scope.appendNode(node);
346 if (node.tag() != .pub_var_simple) {
347 try bs.discardVariable(c, name);
348 }
349 }
350
351
314}352}
315353
316fn mangleWeakGlobalName(c: *Context, want_name: []const u8) ![]const u8 {354fn mangleWeakGlobalName(c: *Context, want_name: []const u8) ![]const u8 {