| ... | @@ -69,6 +69,7 @@ const String = extern struct { | ... | @@ -69,6 +69,7 @@ const String = extern struct { |
| 69 | pub const AvBlock = struct { | 69 | pub const AvBlock = struct { |
| 70 | fwd_decl: String = .empty, | 70 | fwd_decl: String = .empty, |
| 71 | code: String = .empty, | 71 | code: String = .empty, |
| | 72 | code_header: String = .empty, |
| 72 | /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate | 73 | /// Each `Decl` stores a set of used `CType`s. In `flush()`, we iterate |
| 73 | /// over each `Decl` and generate the definition for each used `CType` once. | 74 | /// over each `Decl` and generate the definition for each used `CType` once. |
| 74 | ctype_pool: codegen.CType.Pool = .empty, | 75 | ctype_pool: codegen.CType.Pool = .empty, |
| ... | @@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 { | ... | @@ -91,14 +92,13 @@ pub fn getString(this: C, s: String) []const u8 { |
| 91 | return this.string_bytes.items[s.start..][0..s.len]; | 92 | return this.string_bytes.items[s.start..][0..s.len]; |
| 92 | } | 93 | } |
| 93 | | 94 | |
| 94 | pub fn addString(this: *C, writers: []const *std.io.Writer.Allocating) Allocator.Error!String { | 95 | pub fn addString(this: *C, s: []const u8) Allocator.Error!String { |
| 95 | const comp = this.base.comp; | 96 | const comp = this.base.comp; |
| 96 | const gpa = comp.gpa; | 97 | const gpa = comp.gpa; |
| 97 | const start = this.string_bytes.items.len; | 98 | try this.string_bytes.appendSlice(gpa, s); |
| 98 | for (writers) |writer| try this.string_bytes.appendSlice(gpa, writer.getWritten()); | | |
| 99 | return .{ | 99 | return .{ |
| 100 | .start = @intCast(start), | 100 | .start = @intCast(this.string_bytes.items.len - s.len), |
| 101 | .len = @intCast(this.string_bytes.items.len - start), | 101 | .len = @intCast(s.len), |
| 102 | }; | 102 | }; |
| 103 | } | 103 | } |
| 104 | | 104 | |
| ... | @@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void { | ... | @@ -233,8 +233,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void { |
| 233 | .code = undefined, | 233 | .code = undefined, |
| 234 | .indent_counter = 0, | 234 | .indent_counter = 0, |
| 235 | }; | 235 | }; |
| 236 | object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); | 236 | object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); |
| 237 | object.code.initOwnedSlice(gpa, self.code_buf); | 237 | object.code = .initOwnedSlice(gpa, self.code_buf); |
| 238 | defer { | 238 | defer { |
| 239 | object.dg.uavs.deinit(gpa); | 239 | object.dg.uavs.deinit(gpa); |
| 240 | object.dg.ctype_pool.deinit(object.dg.gpa); | 240 | object.dg.ctype_pool.deinit(object.dg.gpa); |
| ... | @@ -260,8 +260,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void { | ... | @@ -260,8 +260,8 @@ fn updateUav(self: *C, pt: Zcu.PerThread, i: usize) link.File.FlushError!void { |
| 260 | | 260 | |
| 261 | object.dg.ctype_pool.freeUnusedCapacity(gpa); | 261 | object.dg.ctype_pool.freeUnusedCapacity(gpa); |
| 262 | self.uavs.values()[i] = .{ | 262 | self.uavs.values()[i] = .{ |
| 263 | .fwd_decl = try self.addString(&.{&object.dg.fwd_decl}), | 263 | .fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()), |
| 264 | .code = try self.addString(&.{&object.code}), | 264 | .code = try self.addString(object.code.getWritten()), |
| 265 | .ctype_pool = object.dg.ctype_pool.move(), | 265 | .ctype_pool = object.dg.ctype_pool.move(), |
| 266 | }; | 266 | }; |
| 267 | } | 267 | } |
| ... | @@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l | ... | @@ -308,8 +308,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l |
| 308 | .code = undefined, | 308 | .code = undefined, |
| 309 | .indent_counter = 0, | 309 | .indent_counter = 0, |
| 310 | }; | 310 | }; |
| 311 | object.dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); | 311 | object.dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); |
| 312 | object.code.initOwnedSlice(gpa, self.code_buf); | 312 | object.code = .initOwnedSlice(gpa, self.code_buf); |
| 313 | defer { | 313 | defer { |
| 314 | object.dg.uavs.deinit(gpa); | 314 | object.dg.uavs.deinit(gpa); |
| 315 | ctype_pool.* = object.dg.ctype_pool.move(); | 315 | ctype_pool.* = object.dg.ctype_pool.move(); |
| ... | @@ -327,8 +327,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l | ... | @@ -327,8 +327,8 @@ pub fn updateNav(self: *C, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index) l |
| 327 | }, | 327 | }, |
| 328 | error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, | 328 | error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, |
| 329 | }; | 329 | }; |
| 330 | gop.value_ptr.fwd_decl = try self.addString(&.{&object.dg.fwd_decl}); | 330 | gop.value_ptr.fwd_decl = try self.addString(object.dg.fwd_decl.getWritten()); |
| 331 | gop.value_ptr.code = try self.addString(&.{&object.code}); | 331 | gop.value_ptr.code = try self.addString(object.code.getWritten()); |
| 332 | try self.addUavsFromCodegen(&object.dg.uavs); | 332 | try self.addUavsFromCodegen(&object.dg.uavs); |
| 333 | } | 333 | } |
| 334 | | 334 | |
| ... | @@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn | ... | @@ -340,7 +340,7 @@ pub fn updateLineNumber(self: *C, pt: Zcu.PerThread, ti_id: InternPool.TrackedIn |
| 340 | _ = ti_id; | 340 | _ = ti_id; |
| 341 | } | 341 | } |
| 342 | | 342 | |
| 343 | fn abiDefines(w: *std.io.Writer, target: std.Target) !void { | 343 | fn abiDefines(w: *std.io.Writer, target: *const std.Target) !void { |
| 344 | switch (target.abi) { | 344 | switch (target.abi) { |
| 345 | .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"), | 345 | .msvc, .itanium => try w.writeAll("#define ZIG_TARGET_ABI_MSVC\n"), |
| 346 | else => {}, | 346 | else => {}, |
| ... | @@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void { | ... | @@ -639,8 +639,8 @@ fn flushErrDecls(self: *C, pt: Zcu.PerThread, f: *Flush) FlushDeclError!void { |
| 639 | .code = undefined, | 639 | .code = undefined, |
| 640 | .indent_counter = 0, | 640 | .indent_counter = 0, |
| 641 | }; | 641 | }; |
| 642 | _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl); | 642 | object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl); |
| 643 | _ = object.code.fromArrayList(gpa, &f.lazy_code); | 643 | object.code = .fromArrayList(gpa, &f.lazy_code); |
| 644 | defer { | 644 | defer { |
| 645 | object.dg.uavs.deinit(gpa); | 645 | object.dg.uavs.deinit(gpa); |
| 646 | f.lazy_ctype_pool = object.dg.ctype_pool.move(); | 646 | f.lazy_ctype_pool = object.dg.ctype_pool.move(); |
| ... | @@ -687,8 +687,8 @@ fn flushLazyFn( | ... | @@ -687,8 +687,8 @@ fn flushLazyFn( |
| 687 | .code = undefined, | 687 | .code = undefined, |
| 688 | .indent_counter = 0, | 688 | .indent_counter = 0, |
| 689 | }; | 689 | }; |
| 690 | _ = object.dg.fwd_decl.fromArrayList(gpa, &f.lazy_fwd_decl); | 690 | object.dg.fwd_decl = .fromArrayList(gpa, &f.lazy_fwd_decl); |
| 691 | _ = object.code.fromArrayList(gpa, &f.lazy_code); | 691 | object.code = .fromArrayList(gpa, &f.lazy_code); |
| 692 | defer { | 692 | defer { |
| 693 | // If this assert trips just handle the anon_decl_deps the same as | 693 | // If this assert trips just handle the anon_decl_deps the same as |
| 694 | // `updateFunc()` does. | 694 | // `updateFunc()` does. |
| ... | @@ -829,7 +829,7 @@ pub fn updateExports( | ... | @@ -829,7 +829,7 @@ pub fn updateExports( |
| 829 | .scratch = .initBuffer(self.scratch_buf), | 829 | .scratch = .initBuffer(self.scratch_buf), |
| 830 | .uavs = .empty, | 830 | .uavs = .empty, |
| 831 | }; | 831 | }; |
| 832 | dg.fwd_decl.initOwnedSlice(gpa, self.fwd_decl_buf); | 832 | dg.fwd_decl = .initOwnedSlice(gpa, self.fwd_decl_buf); |
| 833 | defer { | 833 | defer { |
| 834 | assert(dg.uavs.count() == 0); | 834 | assert(dg.uavs.count() == 0); |
| 835 | ctype_pool.* = dg.ctype_pool.move(); | 835 | ctype_pool.* = dg.ctype_pool.move(); |
| ... | @@ -841,7 +841,7 @@ pub fn updateExports( | ... | @@ -841,7 +841,7 @@ pub fn updateExports( |
| 841 | codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) { | 841 | codegen.genExports(&dg, exported, export_indices) catch |err| switch (err) { |
| 842 | error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, | 842 | error.WriteFailed, error.OutOfMemory => return error.OutOfMemory, |
| 843 | }; | 843 | }; |
| 844 | exported_block.* = .{ .fwd_decl = try self.addString(&.{&dg.fwd_decl}) }; | 844 | exported_block.* = .{ .fwd_decl = try self.addString(dg.fwd_decl.getWritten()) }; |
| 845 | } | 845 | } |
| 846 | | 846 | |
| 847 | pub fn deleteExport( | 847 | pub fn deleteExport( |