Working translation of empty function

This commit is contained in:
Noam Preil 2020-07-07 17:51:59 -04:00
parent 2f28ecf946
commit 6ece36a051
No known key found for this signature in database
GPG Key ID: FC347E7C85BE8238
3 changed files with 46 additions and 3 deletions

View File

@ -1,11 +1,50 @@
const link = @import("link.zig");
const Module = @import("Module.zig");
const std = @import("std");
const Value = @import("value.zig").Value;
const C = link.File.C;
const Decl = Module.Decl;
const CStandard = Module.CStandard;
const mem = std.mem;
/// Maps a name from Zig source to C. This will always give the same output for
/// any given input.
fn map(name: []const u8) ![]const u8 {
return name;
}
pub fn generate(file: *C, decl: *Decl, standard: CStandard) !void {
const writer = file.file.?.writer();
try writer.print("Generating decl '{}', targeting {}", .{ decl.name, @tagName(standard) });
const tv = decl.typed_value.most_recent.typed_value;
switch (tv.ty.zigTypeTag()) {
.Fn => {
const return_type = tv.ty.fnReturnType();
switch (return_type.zigTypeTag()) {
.NoReturn => try writer.writeAll("_Noreturn void "),
else => return error.Unimplemented,
}
const name = try map(mem.spanZ(decl.name));
try writer.print("{} (", .{name});
if (tv.ty.fnParamLen() == 0) {
try writer.writeAll("void){");
} else {
return error.Unimplemented;
}
const func: *Module.Fn = tv.val.cast(Value.Payload.Function).?.func;
const instructions = func.analysis.success.instructions;
if (instructions.len > 0) {
try writer.writeAll("\n\t");
for (instructions) |inst| {
std.debug.warn("\nTranslating {}\n", .{inst.*});
}
try writer.writeAll("\n");
}
try writer.writeAll("}\n");
},
else => return error.Unimplemented,
}
}

View File

@ -482,6 +482,7 @@ pub const TestContext = struct {
label = @tagName(cstd);
var c: *link.File.C = module.bin_file.cast(link.File.C).?;
c.file.?.close();
c.file = null;
var file = try tmp.dir.openFile(bin_name, .{ .read = true });
defer file.close();
var out = file.reader().readAllAlloc(allocator, 1024 * 1024) catch @panic("Unable to read C output!");

View File

@ -11,8 +11,11 @@ const linux_x64 = std.zig.CrossTarget{
pub fn addCases(ctx: *TestContext) !void {
// These tests should work on every platform
ctx.c11("empty start function", linux_x64,
\\export fn start() void {}
\\export fn _start() noreturn {}
,
\\void start(void) {}
// A newline is always generated after every function; this ensures, among
// other things, that there is always a newline at the end of the file
\\_Noreturn void _start(void) {}
\\
);
}