mirror of
https://github.com/ziglang/zig.git
synced 2026-01-10 09:25:11 +00:00
Merge pull request #15140 from jacobly0/x86_64
x86_64: implement more stuff
This commit is contained in:
commit
878163e588
@ -1937,6 +1937,8 @@ pub fn getenv(key: []const u8) ?[]const u8 {
|
||||
if (builtin.os.tag == .windows) {
|
||||
@compileError("std.os.getenv is unavailable for Windows because environment string is in WTF-16 format. See std.process.getEnvVarOwned for cross-platform API or std.os.getenvW for Windows-specific API.");
|
||||
}
|
||||
// The simplified start logic doesn't populate environ.
|
||||
if (std.start.simplified_logic) return null;
|
||||
// TODO see https://github.com/ziglang/zig/issues/4524
|
||||
for (environ) |ptr| {
|
||||
var line_i: usize = 0;
|
||||
|
||||
@ -14,22 +14,24 @@ var argc_argv_ptr: [*]usize = undefined;
|
||||
|
||||
const start_sym_name = if (native_arch.isMIPS()) "__start" else "_start";
|
||||
|
||||
// The self-hosted compiler is not fully capable of handling all of this start.zig file.
|
||||
// Until then, we have simplified logic here for self-hosted. TODO remove this once
|
||||
// self-hosted is capable enough to handle all of the real start.zig logic.
|
||||
pub const simplified_logic =
|
||||
builtin.zig_backend == .stage2_wasm or
|
||||
builtin.zig_backend == .stage2_x86_64 or
|
||||
builtin.zig_backend == .stage2_x86 or
|
||||
builtin.zig_backend == .stage2_aarch64 or
|
||||
builtin.zig_backend == .stage2_arm or
|
||||
builtin.zig_backend == .stage2_riscv64 or
|
||||
builtin.zig_backend == .stage2_sparc64;
|
||||
|
||||
comptime {
|
||||
// No matter what, we import the root file, so that any export, test, comptime
|
||||
// decls there get run.
|
||||
_ = root;
|
||||
|
||||
// The self-hosted compiler is not fully capable of handling all of this start.zig file.
|
||||
// Until then, we have simplified logic here for self-hosted. TODO remove this once
|
||||
// self-hosted is capable enough to handle all of the real start.zig logic.
|
||||
if (builtin.zig_backend == .stage2_wasm or
|
||||
builtin.zig_backend == .stage2_x86_64 or
|
||||
builtin.zig_backend == .stage2_x86 or
|
||||
builtin.zig_backend == .stage2_aarch64 or
|
||||
builtin.zig_backend == .stage2_arm or
|
||||
builtin.zig_backend == .stage2_riscv64 or
|
||||
builtin.zig_backend == .stage2_sparc64)
|
||||
{
|
||||
if (simplified_logic) {
|
||||
if (builtin.output_mode == .Exe) {
|
||||
if ((builtin.link_libc or builtin.object_format == .c) and @hasDecl(root, "main")) {
|
||||
if (@typeInfo(@TypeOf(root.main)).Fn.calling_convention != .C) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -100,6 +100,16 @@ pub const Condition = enum(u5) {
|
||||
};
|
||||
}
|
||||
|
||||
pub fn fromCompareOperator(
|
||||
signedness: std.builtin.Signedness,
|
||||
op: std.math.CompareOperator,
|
||||
) Condition {
|
||||
return switch (signedness) {
|
||||
.signed => fromCompareOperatorSigned(op),
|
||||
.unsigned => fromCompareOperatorUnsigned(op),
|
||||
};
|
||||
}
|
||||
|
||||
/// Returns the condition which is true iff the given condition is false
|
||||
pub fn negate(cond: Condition) Condition {
|
||||
return switch (cond) {
|
||||
|
||||
@ -99,6 +99,47 @@ fn writeFloat(comptime F: type, f: F, target: Target, endian: std.builtin.Endian
|
||||
mem.writeInt(Int, code[0..@sizeOf(Int)], int, endian);
|
||||
}
|
||||
|
||||
pub fn generateLazySymbol(
|
||||
bin_file: *link.File,
|
||||
src_loc: Module.SrcLoc,
|
||||
lazy_sym: link.File.LazySymbol,
|
||||
code: *std.ArrayList(u8),
|
||||
debug_output: DebugInfoOutput,
|
||||
reloc_info: RelocInfo,
|
||||
) CodeGenError!Result {
|
||||
_ = debug_output;
|
||||
_ = reloc_info;
|
||||
|
||||
const tracy = trace(@src());
|
||||
defer tracy.end();
|
||||
|
||||
const target = bin_file.options.target;
|
||||
const endian = target.cpu.arch.endian();
|
||||
|
||||
const mod = bin_file.options.module.?;
|
||||
log.debug("generateLazySymbol: kind = {s}, ty = {}", .{
|
||||
@tagName(lazy_sym.kind),
|
||||
lazy_sym.ty.fmt(mod),
|
||||
});
|
||||
|
||||
if (lazy_sym.kind == .const_data and lazy_sym.ty.isAnyError()) {
|
||||
const err_names = mod.error_name_list.items;
|
||||
try code.resize(err_names.len * 4);
|
||||
for (err_names, 0..) |err_name, index| {
|
||||
mem.writeInt(u32, code.items[index * 4 ..][0..4], @intCast(u32, code.items.len), endian);
|
||||
try code.ensureUnusedCapacity(err_name.len + 1);
|
||||
code.appendSliceAssumeCapacity(err_name);
|
||||
code.appendAssumeCapacity(0);
|
||||
}
|
||||
return Result.ok;
|
||||
} else return .{ .fail = try ErrorMsg.create(
|
||||
bin_file.allocator,
|
||||
src_loc,
|
||||
"TODO implement generateLazySymbol for {s} {}",
|
||||
.{ @tagName(lazy_sym.kind), lazy_sym.ty.fmt(mod) },
|
||||
) };
|
||||
}
|
||||
|
||||
pub fn generateSymbol(
|
||||
bin_file: *link.File,
|
||||
src_loc: Module.SrcLoc,
|
||||
@ -118,9 +159,10 @@ pub fn generateSymbol(
|
||||
const target = bin_file.options.target;
|
||||
const endian = target.cpu.arch.endian();
|
||||
|
||||
const mod = bin_file.options.module.?;
|
||||
log.debug("generateSymbol: ty = {}, val = {}", .{
|
||||
typed_value.ty.fmtDebug(),
|
||||
typed_value.val.fmtDebug(),
|
||||
typed_value.ty.fmt(mod),
|
||||
typed_value.val.fmtValue(typed_value.ty, mod),
|
||||
});
|
||||
|
||||
if (typed_value.val.isUndefDeep()) {
|
||||
@ -170,7 +212,6 @@ pub fn generateSymbol(
|
||||
},
|
||||
.str_lit => {
|
||||
const str_lit = typed_value.val.castTag(.str_lit).?.data;
|
||||
const mod = bin_file.options.module.?;
|
||||
const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
|
||||
try code.ensureUnusedCapacity(bytes.len + 1);
|
||||
code.appendSliceAssumeCapacity(bytes);
|
||||
@ -300,7 +341,6 @@ pub fn generateSymbol(
|
||||
switch (container_ptr.tag()) {
|
||||
.decl_ref => {
|
||||
const decl_index = container_ptr.castTag(.decl_ref).?.data;
|
||||
const mod = bin_file.options.module.?;
|
||||
const decl = mod.declPtr(decl_index);
|
||||
const addend = blk: {
|
||||
switch (decl.ty.zigTypeTag()) {
|
||||
@ -493,7 +533,6 @@ pub fn generateSymbol(
|
||||
const field_vals = typed_value.val.castTag(.aggregate).?.data;
|
||||
const abi_size = math.cast(usize, typed_value.ty.abiSize(target)) orelse return error.Overflow;
|
||||
const current_pos = code.items.len;
|
||||
const mod = bin_file.options.module.?;
|
||||
try code.resize(current_pos + abi_size);
|
||||
var bits: u16 = 0;
|
||||
|
||||
@ -570,7 +609,6 @@ pub fn generateSymbol(
|
||||
}
|
||||
|
||||
const union_ty = typed_value.ty.cast(Type.Payload.Union).?.data;
|
||||
const mod = bin_file.options.module.?;
|
||||
const field_index = typed_value.ty.unionTagFieldIndex(union_obj.tag, mod).?;
|
||||
assert(union_ty.haveFieldTypes());
|
||||
const field_ty = union_ty.fields.values()[field_index].ty;
|
||||
@ -776,7 +814,6 @@ pub fn generateSymbol(
|
||||
},
|
||||
.str_lit => {
|
||||
const str_lit = typed_value.val.castTag(.str_lit).?.data;
|
||||
const mod = bin_file.options.module.?;
|
||||
const bytes = mod.string_literal_bytes.items[str_lit.index..][0..str_lit.len];
|
||||
try code.ensureUnusedCapacity(str_lit.len);
|
||||
code.appendSliceAssumeCapacity(bytes);
|
||||
|
||||
21
src/link.zig
21
src/link.zig
@ -687,6 +687,7 @@ pub const File = struct {
|
||||
FrameworkNotFound,
|
||||
FunctionSignatureMismatch,
|
||||
GlobalTypeMismatch,
|
||||
HotSwapUnavailableOnHostOperatingSystem,
|
||||
InvalidCharacter,
|
||||
InvalidEntryKind,
|
||||
InvalidFeatureSet,
|
||||
@ -1104,6 +1105,26 @@ pub const File = struct {
|
||||
missing_libc: bool = false,
|
||||
};
|
||||
|
||||
pub const LazySymbol = struct {
|
||||
kind: enum { code, const_data },
|
||||
ty: Type,
|
||||
|
||||
pub const Context = struct {
|
||||
mod: *Module,
|
||||
|
||||
pub fn hash(ctx: @This(), sym: LazySymbol) u32 {
|
||||
var hasher = std.hash.Wyhash.init(0);
|
||||
std.hash.autoHash(&hasher, sym.kind);
|
||||
sym.ty.hashWithHasher(&hasher, ctx.mod);
|
||||
return @truncate(u32, hasher.final());
|
||||
}
|
||||
|
||||
pub fn eql(ctx: @This(), lhs: LazySymbol, rhs: LazySymbol, _: usize) bool {
|
||||
return lhs.kind == rhs.kind and lhs.ty.eql(rhs.ty, ctx.mod);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
pub const C = @import("link/C.zig");
|
||||
pub const Coff = @import("link/Coff.zig");
|
||||
pub const Plan9 = @import("link/Plan9.zig");
|
||||
|
||||
@ -49,6 +49,9 @@ imports_count_dirty: bool = true,
|
||||
/// Virtual address of the entry point procedure relative to image base.
|
||||
entry_addr: ?u32 = null,
|
||||
|
||||
/// Table of tracked LazySymbols.
|
||||
lazy_syms: LazySymbolTable = .{},
|
||||
|
||||
/// Table of tracked Decls.
|
||||
decls: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, DeclMetadata) = .{},
|
||||
|
||||
@ -142,6 +145,18 @@ const Section = struct {
|
||||
free_list: std.ArrayListUnmanaged(Atom.Index) = .{},
|
||||
};
|
||||
|
||||
const LazySymbolTable = std.ArrayHashMapUnmanaged(
|
||||
link.File.LazySymbol,
|
||||
LazySymbolMetadata,
|
||||
link.File.LazySymbol.Context,
|
||||
true,
|
||||
);
|
||||
|
||||
const LazySymbolMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
section: u16,
|
||||
};
|
||||
|
||||
const DeclMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
section: u16,
|
||||
@ -1168,6 +1183,100 @@ pub fn updateDecl(self: *Coff, module: *Module, decl_index: Module.Decl.Index) !
|
||||
return self.updateDeclExports(module, decl_index, module.getDeclExports(decl_index));
|
||||
}
|
||||
|
||||
fn updateLazySymbol(
|
||||
self: *Coff,
|
||||
lazy_sym: link.File.LazySymbol,
|
||||
lazy_metadata: LazySymbolMetadata,
|
||||
) !void {
|
||||
const gpa = self.base.allocator;
|
||||
const mod = self.base.options.module.?;
|
||||
|
||||
var code_buffer = std.ArrayList(u8).init(gpa);
|
||||
defer code_buffer.deinit();
|
||||
|
||||
const name = try std.fmt.allocPrint(gpa, "__lazy_{s}_{}", .{
|
||||
@tagName(lazy_sym.kind),
|
||||
lazy_sym.ty.fmt(mod),
|
||||
});
|
||||
defer gpa.free(name);
|
||||
|
||||
const atom_index = lazy_metadata.atom;
|
||||
const atom = self.getAtomPtr(atom_index);
|
||||
const local_sym_index = atom.getSymbolIndex().?;
|
||||
|
||||
const src = if (lazy_sym.ty.getOwnerDeclOrNull()) |owner_decl|
|
||||
mod.declPtr(owner_decl).srcLoc()
|
||||
else
|
||||
Module.SrcLoc{
|
||||
.file_scope = undefined,
|
||||
.parent_decl_node = undefined,
|
||||
.lazy = .unneeded,
|
||||
};
|
||||
const res = try codegen.generateLazySymbol(
|
||||
&self.base,
|
||||
src,
|
||||
lazy_sym,
|
||||
&code_buffer,
|
||||
.none,
|
||||
.{ .parent_atom_index = local_sym_index },
|
||||
);
|
||||
const code = switch (res) {
|
||||
.ok => code_buffer.items,
|
||||
.fail => |em| {
|
||||
log.err("{s}", .{em.msg});
|
||||
return error.CodegenFail;
|
||||
},
|
||||
};
|
||||
|
||||
const required_alignment = atom.alignment;
|
||||
const code_len = @intCast(u32, code.len);
|
||||
const symbol = atom.getSymbolPtr(self);
|
||||
try self.setSymbolName(symbol, name);
|
||||
symbol.section_number = @intToEnum(coff.SectionNumber, lazy_metadata.section + 1);
|
||||
symbol.type = .{ .complex_type = .NULL, .base_type = .NULL };
|
||||
|
||||
const vaddr = try self.allocateAtom(atom_index, code_len, required_alignment);
|
||||
errdefer self.freeAtom(atom_index);
|
||||
|
||||
log.debug("allocated atom for {s} at 0x{x}", .{ name, vaddr });
|
||||
log.debug(" (required alignment 0x{x})", .{required_alignment});
|
||||
|
||||
atom.size = code_len;
|
||||
symbol.value = vaddr;
|
||||
|
||||
const got_target = SymbolWithLoc{ .sym_index = local_sym_index, .file = null };
|
||||
const got_index = try self.allocateGotEntry(got_target);
|
||||
const got_atom_index = try self.createGotAtom(got_target);
|
||||
const got_atom = self.getAtom(got_atom_index);
|
||||
self.got_entries.items[got_index].sym_index = got_atom.getSymbolIndex().?;
|
||||
try self.writePtrWidthAtom(got_atom_index);
|
||||
|
||||
self.markRelocsDirtyByTarget(atom.getSymbolWithLoc());
|
||||
try self.writeAtom(atom_index, code);
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForLazySymbol(
|
||||
self: *Coff,
|
||||
lazy_sym: link.File.LazySymbol,
|
||||
alignment: u32,
|
||||
) !Atom.Index {
|
||||
const gop = try self.lazy_syms.getOrPutContext(self.base.allocator, lazy_sym, .{
|
||||
.mod = self.base.options.module.?,
|
||||
});
|
||||
errdefer _ = self.lazy_syms.pop();
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = .{
|
||||
.atom = try self.createAtom(),
|
||||
.section = switch (lazy_sym.kind) {
|
||||
.code => self.text_section_index.?,
|
||||
.const_data => self.rdata_section_index.?,
|
||||
},
|
||||
};
|
||||
self.getAtomPtr(gop.value_ptr.atom).alignment = alignment;
|
||||
}
|
||||
return gop.value_ptr.atom;
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForDecl(self: *Coff, decl_index: Module.Decl.Index) !Atom.Index {
|
||||
const gop = try self.decls.getOrPut(self.base.allocator, decl_index);
|
||||
if (!gop.found_existing) {
|
||||
@ -1498,6 +1607,19 @@ pub fn flushModule(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
|
||||
sub_prog_node.activate();
|
||||
defer sub_prog_node.end();
|
||||
|
||||
{
|
||||
var lazy_it = self.lazy_syms.iterator();
|
||||
while (lazy_it.next()) |lazy_entry| {
|
||||
self.updateLazySymbol(
|
||||
lazy_entry.key_ptr.*,
|
||||
lazy_entry.value_ptr.*,
|
||||
) catch |err| switch (err) {
|
||||
error.CodegenFail => return error.FlushFailure,
|
||||
else => |e| return e,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
const gpa = self.base.allocator;
|
||||
|
||||
while (self.unresolved.popOrNull()) |entry| {
|
||||
|
||||
114
src/link/Elf.zig
114
src/link/Elf.zig
@ -63,6 +63,12 @@ const Section = struct {
|
||||
free_list: std.ArrayListUnmanaged(Atom.Index) = .{},
|
||||
};
|
||||
|
||||
const LazySymbolMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
shdr: u16,
|
||||
alignment: u32,
|
||||
};
|
||||
|
||||
const DeclMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
shdr: u16,
|
||||
@ -157,6 +163,9 @@ debug_line_header_dirty: bool = false,
|
||||
|
||||
error_flags: File.ErrorFlags = File.ErrorFlags{},
|
||||
|
||||
/// Table of tracked LazySymbols.
|
||||
lazy_syms: LazySymbolTable = .{},
|
||||
|
||||
/// Table of tracked Decls.
|
||||
decls: std.AutoHashMapUnmanaged(Module.Decl.Index, DeclMetadata) = .{},
|
||||
|
||||
@ -194,6 +203,7 @@ relocs: RelocTable = .{},
|
||||
|
||||
const RelocTable = std.AutoHashMapUnmanaged(Atom.Index, std.ArrayListUnmanaged(Atom.Reloc));
|
||||
const UnnamedConstTable = std.AutoHashMapUnmanaged(Module.Decl.Index, std.ArrayListUnmanaged(Atom.Index));
|
||||
const LazySymbolTable = std.ArrayHashMapUnmanaged(File.LazySymbol, LazySymbolMetadata, File.LazySymbol.Context, true);
|
||||
|
||||
/// When allocating, the ideal_capacity is calculated by
|
||||
/// actual_capacity + (actual_capacity / ideal_factor)
|
||||
@ -1011,6 +1021,19 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
||||
sub_prog_node.activate();
|
||||
defer sub_prog_node.end();
|
||||
|
||||
{
|
||||
var lazy_it = self.lazy_syms.iterator();
|
||||
while (lazy_it.next()) |lazy_entry| {
|
||||
self.updateLazySymbol(
|
||||
lazy_entry.key_ptr.*,
|
||||
lazy_entry.value_ptr.*,
|
||||
) catch |err| switch (err) {
|
||||
error.CodegenFail => return error.FlushFailure,
|
||||
else => |e| return e,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
// TODO This linker code currently assumes there is only 1 compilation unit and it
|
||||
// corresponds to the Zig source code.
|
||||
const module = self.base.options.module orelse return error.LinkingWithoutZigSourceUnimplemented;
|
||||
@ -2344,6 +2367,24 @@ pub fn freeDecl(self: *Elf, decl_index: Module.Decl.Index) void {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForLazySymbol(self: *Elf, lazy_sym: File.LazySymbol, alignment: u32) !Atom.Index {
|
||||
const gop = try self.lazy_syms.getOrPutContext(self.base.allocator, lazy_sym, .{
|
||||
.mod = self.base.options.module.?,
|
||||
});
|
||||
errdefer _ = self.lazy_syms.pop();
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = .{
|
||||
.atom = try self.createAtom(),
|
||||
.shdr = switch (lazy_sym.kind) {
|
||||
.code => self.text_section_index.?,
|
||||
.const_data => self.rodata_section_index.?,
|
||||
},
|
||||
.alignment = alignment,
|
||||
};
|
||||
}
|
||||
return gop.value_ptr.atom;
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForDecl(self: *Elf, decl_index: Module.Decl.Index) !Atom.Index {
|
||||
const gop = try self.decls.getOrPut(self.base.allocator, decl_index);
|
||||
if (!gop.found_existing) {
|
||||
@ -2610,6 +2651,79 @@ pub fn updateDecl(self: *Elf, module: *Module, decl_index: Module.Decl.Index) !v
|
||||
return self.updateDeclExports(module, decl_index, module.getDeclExports(decl_index));
|
||||
}
|
||||
|
||||
fn updateLazySymbol(self: *Elf, lazy_sym: File.LazySymbol, lazy_metadata: LazySymbolMetadata) !void {
|
||||
const gpa = self.base.allocator;
|
||||
const mod = self.base.options.module.?;
|
||||
|
||||
var code_buffer = std.ArrayList(u8).init(gpa);
|
||||
defer code_buffer.deinit();
|
||||
|
||||
const name_str_index = blk: {
|
||||
const name = try std.fmt.allocPrint(gpa, "__lazy_{s}_{}", .{
|
||||
@tagName(lazy_sym.kind),
|
||||
lazy_sym.ty.fmt(mod),
|
||||
});
|
||||
defer gpa.free(name);
|
||||
break :blk try self.shstrtab.insert(gpa, name);
|
||||
};
|
||||
const name = self.shstrtab.get(name_str_index).?;
|
||||
|
||||
const atom_index = lazy_metadata.atom;
|
||||
const atom = self.getAtom(atom_index);
|
||||
const local_sym_index = atom.getSymbolIndex().?;
|
||||
|
||||
const src = if (lazy_sym.ty.getOwnerDeclOrNull()) |owner_decl|
|
||||
mod.declPtr(owner_decl).srcLoc()
|
||||
else
|
||||
Module.SrcLoc{
|
||||
.file_scope = undefined,
|
||||
.parent_decl_node = undefined,
|
||||
.lazy = .unneeded,
|
||||
};
|
||||
const res = try codegen.generateLazySymbol(
|
||||
&self.base,
|
||||
src,
|
||||
lazy_sym,
|
||||
&code_buffer,
|
||||
.none,
|
||||
.{ .parent_atom_index = local_sym_index },
|
||||
);
|
||||
const code = switch (res) {
|
||||
.ok => code_buffer.items,
|
||||
.fail => |em| {
|
||||
log.err("{s}", .{em.msg});
|
||||
return error.CodegenFail;
|
||||
},
|
||||
};
|
||||
|
||||
const shdr_index = lazy_metadata.shdr;
|
||||
const phdr_index = self.sections.items(.phdr_index)[shdr_index];
|
||||
const local_sym = atom.getSymbolPtr(self);
|
||||
local_sym.* = .{
|
||||
.st_name = name_str_index,
|
||||
.st_info = (elf.STB_LOCAL << 4) | elf.STT_OBJECT,
|
||||
.st_other = 0,
|
||||
.st_shndx = shdr_index,
|
||||
.st_value = 0,
|
||||
.st_size = 0,
|
||||
};
|
||||
const required_alignment = lazy_metadata.alignment;
|
||||
const vaddr = try self.allocateAtom(atom_index, code.len, required_alignment);
|
||||
errdefer self.freeAtom(atom_index);
|
||||
log.debug("allocated text block for {s} at 0x{x}", .{ name, vaddr });
|
||||
|
||||
self.offset_table.items[atom.offset_table_index] = vaddr;
|
||||
local_sym.st_value = vaddr;
|
||||
local_sym.st_size = code.len;
|
||||
|
||||
try self.writeSymbol(local_sym_index);
|
||||
try self.writeOffsetTableEntry(atom.offset_table_index);
|
||||
|
||||
const section_offset = vaddr - self.program_headers.items[phdr_index].p_vaddr;
|
||||
const file_offset = self.sections.items(.shdr)[shdr_index].sh_offset + section_offset;
|
||||
try self.base.file.?.pwriteAll(code, file_offset);
|
||||
}
|
||||
|
||||
pub fn lowerUnnamedConst(self: *Elf, typed_value: TypedValue, decl_index: Module.Decl.Index) !u32 {
|
||||
const gpa = self.base.allocator;
|
||||
|
||||
|
||||
@ -218,6 +218,9 @@ bindings: BindingTable = .{},
|
||||
/// this will be a table indexed by index into the list of Atoms.
|
||||
lazy_bindings: BindingTable = .{},
|
||||
|
||||
/// Table of tracked LazySymbols.
|
||||
lazy_syms: LazySymbolTable = .{},
|
||||
|
||||
/// Table of tracked Decls.
|
||||
decls: std.AutoArrayHashMapUnmanaged(Module.Decl.Index, DeclMetadata) = .{},
|
||||
|
||||
@ -229,6 +232,18 @@ const is_hot_update_compatible = switch (builtin.target.os.tag) {
|
||||
else => false,
|
||||
};
|
||||
|
||||
const LazySymbolTable = std.ArrayHashMapUnmanaged(
|
||||
link.File.LazySymbol,
|
||||
LazySymbolMetadata,
|
||||
link.File.LazySymbol.Context,
|
||||
true,
|
||||
);
|
||||
|
||||
const LazySymbolMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
section: u8,
|
||||
};
|
||||
|
||||
const DeclMetadata = struct {
|
||||
atom: Atom.Index,
|
||||
section: u8,
|
||||
@ -497,6 +512,19 @@ pub fn flushModule(self: *MachO, comp: *Compilation, prog_node: *std.Progress.No
|
||||
sub_prog_node.activate();
|
||||
defer sub_prog_node.end();
|
||||
|
||||
{
|
||||
var lazy_it = self.lazy_syms.iterator();
|
||||
while (lazy_it.next()) |lazy_entry| {
|
||||
self.updateLazySymbol(
|
||||
lazy_entry.key_ptr.*,
|
||||
lazy_entry.value_ptr.*,
|
||||
) catch |err| switch (err) {
|
||||
error.CodegenFail => return error.FlushFailure,
|
||||
else => |e| return e,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
const module = self.base.options.module orelse return error.LinkingWithoutZigSourceUnimplemented;
|
||||
|
||||
if (self.d_sym) |*d_sym| {
|
||||
@ -2163,13 +2191,13 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: Modu
|
||||
|
||||
const name_str_index = blk: {
|
||||
const index = unnamed_consts.items.len;
|
||||
const name = try std.fmt.allocPrint(gpa, "__unnamed_{s}_{d}", .{ decl_name, index });
|
||||
const name = try std.fmt.allocPrint(gpa, "___unnamed_{s}_{d}", .{ decl_name, index });
|
||||
defer gpa.free(name);
|
||||
break :blk try self.strtab.insert(gpa, name);
|
||||
};
|
||||
const name = self.strtab.get(name_str_index);
|
||||
const name = self.strtab.get(name_str_index).?;
|
||||
|
||||
log.debug("allocating symbol indexes for {?s}", .{name});
|
||||
log.debug("allocating symbol indexes for {s}", .{name});
|
||||
|
||||
const atom_index = try self.createAtom();
|
||||
|
||||
@ -2202,7 +2230,7 @@ pub fn lowerUnnamedConst(self: *MachO, typed_value: TypedValue, decl_index: Modu
|
||||
|
||||
try unnamed_consts.append(gpa, atom_index);
|
||||
|
||||
log.debug("allocated atom for {?s} at 0x{x}", .{ name, symbol.n_value });
|
||||
log.debug("allocated atom for {s} at 0x{x}", .{ name, symbol.n_value });
|
||||
log.debug(" (required alignment 0x{x})", .{required_alignment});
|
||||
|
||||
try self.writeAtom(atom_index, code);
|
||||
@ -2282,6 +2310,100 @@ pub fn updateDecl(self: *MachO, module: *Module, decl_index: Module.Decl.Index)
|
||||
try self.updateDeclExports(module, decl_index, module.getDeclExports(decl_index));
|
||||
}
|
||||
|
||||
fn updateLazySymbol(self: *MachO, lazy_sym: File.LazySymbol, lazy_metadata: LazySymbolMetadata) !void {
|
||||
const gpa = self.base.allocator;
|
||||
const mod = self.base.options.module.?;
|
||||
|
||||
var code_buffer = std.ArrayList(u8).init(gpa);
|
||||
defer code_buffer.deinit();
|
||||
|
||||
const name_str_index = blk: {
|
||||
const name = try std.fmt.allocPrint(gpa, "___lazy_{s}_{}", .{
|
||||
@tagName(lazy_sym.kind),
|
||||
lazy_sym.ty.fmt(mod),
|
||||
});
|
||||
defer gpa.free(name);
|
||||
break :blk try self.strtab.insert(gpa, name);
|
||||
};
|
||||
const name = self.strtab.get(name_str_index).?;
|
||||
|
||||
const atom_index = lazy_metadata.atom;
|
||||
const atom = self.getAtomPtr(atom_index);
|
||||
const local_sym_index = atom.getSymbolIndex().?;
|
||||
|
||||
const src = if (lazy_sym.ty.getOwnerDeclOrNull()) |owner_decl|
|
||||
mod.declPtr(owner_decl).srcLoc()
|
||||
else
|
||||
Module.SrcLoc{
|
||||
.file_scope = undefined,
|
||||
.parent_decl_node = undefined,
|
||||
.lazy = .unneeded,
|
||||
};
|
||||
const res = try codegen.generateLazySymbol(
|
||||
&self.base,
|
||||
src,
|
||||
lazy_sym,
|
||||
&code_buffer,
|
||||
.none,
|
||||
.{ .parent_atom_index = local_sym_index },
|
||||
);
|
||||
const code = switch (res) {
|
||||
.ok => code_buffer.items,
|
||||
.fail => |em| {
|
||||
log.err("{s}", .{em.msg});
|
||||
return error.CodegenFail;
|
||||
},
|
||||
};
|
||||
|
||||
const required_alignment = atom.alignment;
|
||||
const symbol = atom.getSymbolPtr(self);
|
||||
symbol.n_strx = name_str_index;
|
||||
symbol.n_type = macho.N_SECT;
|
||||
symbol.n_sect = lazy_metadata.section + 1;
|
||||
symbol.n_desc = 0;
|
||||
|
||||
const vaddr = try self.allocateAtom(atom_index, code.len, required_alignment);
|
||||
errdefer self.freeAtom(atom_index);
|
||||
|
||||
log.debug("allocated atom for {s} at 0x{x}", .{ name, vaddr });
|
||||
log.debug(" (required alignment 0x{x}", .{required_alignment});
|
||||
|
||||
atom.size = code.len;
|
||||
symbol.n_value = vaddr;
|
||||
|
||||
const got_target = SymbolWithLoc{ .sym_index = local_sym_index, .file = null };
|
||||
const got_index = try self.allocateGotEntry(got_target);
|
||||
const got_atom_index = try self.createGotAtom(got_target);
|
||||
const got_atom = self.getAtom(got_atom_index);
|
||||
self.got_entries.items[got_index].sym_index = got_atom.getSymbolIndex().?;
|
||||
try self.writePtrWidthAtom(got_atom_index);
|
||||
|
||||
self.markRelocsDirtyByTarget(atom.getSymbolWithLoc());
|
||||
try self.writeAtom(atom_index, code);
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForLazySymbol(
|
||||
self: *MachO,
|
||||
lazy_sym: File.LazySymbol,
|
||||
alignment: u32,
|
||||
) !Atom.Index {
|
||||
const gop = try self.lazy_syms.getOrPutContext(self.base.allocator, lazy_sym, .{
|
||||
.mod = self.base.options.module.?,
|
||||
});
|
||||
errdefer _ = self.lazy_syms.pop();
|
||||
if (!gop.found_existing) {
|
||||
gop.value_ptr.* = .{
|
||||
.atom = try self.createAtom(),
|
||||
.section = switch (lazy_sym.kind) {
|
||||
.code => self.text_section_index.?,
|
||||
.const_data => self.data_const_section_index.?,
|
||||
},
|
||||
};
|
||||
self.getAtomPtr(gop.value_ptr.atom).alignment = alignment;
|
||||
}
|
||||
return gop.value_ptr.atom;
|
||||
}
|
||||
|
||||
pub fn getOrCreateAtomForDecl(self: *MachO, decl_index: Module.Decl.Index) !Atom.Index {
|
||||
const gop = try self.decls.getOrPut(self.base.allocator, decl_index);
|
||||
if (!gop.found_existing) {
|
||||
|
||||
@ -271,7 +271,6 @@ fn sliceExpects4(slice: []align(4) u32) void {
|
||||
|
||||
test "return error union with 128-bit integer" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -477,7 +476,6 @@ const DefaultAligned = struct {
|
||||
|
||||
test "read 128-bit field from default aligned struct in stack memory" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -494,7 +492,6 @@ var default_aligned_global = DefaultAligned{
|
||||
};
|
||||
|
||||
test "read 128-bit field from default aligned struct in global memory" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -39,7 +39,6 @@ test "truncate to non-power-of-two integers" {
|
||||
|
||||
test "truncate to non-power-of-two integers from 128-bit" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -345,7 +344,6 @@ fn copy(src: *const u64, dst: *u64) void {
|
||||
test "call result of if else expression" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
try expect(mem.eql(u8, f2(true), "a"));
|
||||
@ -663,7 +661,6 @@ test "multiline string literal is null terminated" {
|
||||
test "string escapes" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
try expectEqualStrings("\"", "\x22");
|
||||
@ -682,8 +679,6 @@ test "explicit cast optional pointers" {
|
||||
}
|
||||
|
||||
test "pointer comparison" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
|
||||
const a = @as([]const u8, "a");
|
||||
const b = &a;
|
||||
try expect(ptrEql(b, b));
|
||||
@ -695,7 +690,6 @@ fn ptrEql(a: *const []const u8, b: *const []const u8) bool {
|
||||
test "string concatenation" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
const a = "OK" ++ " IT " ++ "WORKED";
|
||||
@ -916,7 +910,6 @@ test "vector initialized with array init syntax has proper type" {
|
||||
}
|
||||
|
||||
test "weird array and tuple initializations" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -1060,7 +1053,6 @@ test "inline call of function with a switch inside the return statement" {
|
||||
|
||||
test "namespace lookup ignores decl causing the lookup" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
|
||||
|
||||
@ -20,7 +20,6 @@ test "@bitCast iX -> uX (32, 64)" {
|
||||
|
||||
test "@bitCast iX -> uX (8, 16, 128)" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
|
||||
@ -11,7 +11,6 @@ fn getError2() !void {
|
||||
|
||||
test "`try`ing an if/else expression" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -3,7 +3,6 @@ const builtin = @import("builtin");
|
||||
|
||||
test "sentinel-terminated 0-length slices" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -47,7 +47,6 @@ test {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
|
||||
var flags = A{
|
||||
.a = false,
|
||||
|
||||
@ -8,7 +8,6 @@ var x: u8 = 1;
|
||||
test {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -1178,7 +1178,6 @@ fn castToOptionalSlice() ?[]const u8 {
|
||||
test "cast u128 to f128 and back" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
|
||||
@ -5,7 +5,6 @@ const maxInt = std.math.maxInt;
|
||||
|
||||
test "@intCast i32 to u7" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -110,7 +110,6 @@ test "mixing normal and error defers" {
|
||||
}
|
||||
|
||||
test "errdefer with payload" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -561,7 +561,6 @@ test "error union comptime caching" {
|
||||
}
|
||||
|
||||
test "@errorName" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -575,7 +574,6 @@ fn gimmeItBroke() anyerror {
|
||||
}
|
||||
|
||||
test "@errorName sentinel length matches slice length" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -799,7 +797,6 @@ test "error union of noreturn used with catch" {
|
||||
}
|
||||
|
||||
test "alignment of wrapping an error union payload" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -851,7 +848,6 @@ test "catch within a function that calls no errorable functions" {
|
||||
test "error from comptime string" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
const name = "Weird error name!";
|
||||
|
||||
@ -458,7 +458,6 @@ test "binary math operator in partially inlined function" {
|
||||
|
||||
test "comptime shl" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -5,7 +5,6 @@ const minInt = std.math.minInt;
|
||||
const builtin = @import("builtin");
|
||||
|
||||
test "uint128" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -24,7 +23,6 @@ test "uint128" {
|
||||
}
|
||||
|
||||
test "undefined 128 bit int" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -42,7 +40,6 @@ test "undefined 128 bit int" {
|
||||
}
|
||||
|
||||
test "int128" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -87,7 +84,6 @@ test "truncate int128" {
|
||||
|
||||
test "shift int128" {
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -97,7 +97,6 @@ test "large integer division" {
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
|
||||
{
|
||||
var numerator: u256 = 99999999999999999997315645440;
|
||||
|
||||
@ -412,7 +412,6 @@ test "orelse on C pointer" {
|
||||
}
|
||||
|
||||
test "alignment of wrapping an optional payload" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -468,7 +467,6 @@ test "peer type resolution in nested if expressions" {
|
||||
test "cast slice to const slice nested in error union and optional" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
|
||||
const S = struct {
|
||||
fn inner() !?[]u8 {
|
||||
|
||||
@ -352,7 +352,6 @@ test "byte-aligned field pointer offsets" {
|
||||
}
|
||||
|
||||
test "load pointer from packed struct" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -585,7 +584,6 @@ test "overaligned pointer to packed struct" {
|
||||
test "packed struct initialized in bitcast" {
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
|
||||
|
||||
const T = packed struct { val: u8 };
|
||||
var val: u8 = 123;
|
||||
|
||||
@ -160,7 +160,6 @@ test "implicit casting between C pointer and optional non-C pointer" {
|
||||
}
|
||||
|
||||
test "implicit cast error unions with non-optional to optional pointer" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -800,7 +800,6 @@ test "fn with C calling convention returns struct by value" {
|
||||
}
|
||||
|
||||
test "non-packed struct with u128 entry in union" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -1244,7 +1243,6 @@ test "loading a struct pointer perfoms a copy" {
|
||||
}
|
||||
|
||||
test "packed struct aggregate init" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -419,7 +419,6 @@ test "switch on integer with else capturing expr" {
|
||||
}
|
||||
|
||||
test "else prong of switch on error set excludes other cases" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -12,7 +12,6 @@ const expectStringStartsWith = std.testing.expectStringStartsWith;
|
||||
// failures.
|
||||
|
||||
test "anon fn param" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -38,7 +37,6 @@ test "anon fn param" {
|
||||
}
|
||||
|
||||
test "anon field init" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -87,7 +85,6 @@ test "basic" {
|
||||
}
|
||||
|
||||
test "top level decl" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -137,7 +134,6 @@ const B = struct {
|
||||
};
|
||||
|
||||
test "fn param" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -208,7 +204,6 @@ pub fn expectEqualStringsIgnoreDigits(expected: []const u8, actual: []const u8)
|
||||
}
|
||||
|
||||
test "local variable" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
@ -236,7 +231,6 @@ test "comptime parameters not converted to anytype in function type" {
|
||||
}
|
||||
|
||||
test "anon name strategy used in sub expression" {
|
||||
if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
|
||||
if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
// output_mode=Exe
|
||||
// target=aarch64-macos
|
||||
//
|
||||
// :108:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
// :110:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
// output_mode=Exe
|
||||
// target=x86_64-linux
|
||||
//
|
||||
// :108:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
// :110:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
// output_mode=Exe
|
||||
// target=x86_64-macos
|
||||
//
|
||||
// :108:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
// :110:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
|
||||
@ -2,4 +2,4 @@
|
||||
// output_mode=Exe
|
||||
// target=x86_64-windows
|
||||
//
|
||||
// :129:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
// :131:9: error: root struct of file 'tmp' has no member named 'main'
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user