| ... | ... | @@ -151,36 +151,46 @@ pub fn flushModule(self: *C, comp: *Compilation) !void { |
| 151 | 151 | var fn_count: usize = 0; |
| 152 | 152 | |
| 153 | 153 | // Forward decls and non-functions first. |
| 154 | // TODO: performance investigation: would keeping a list of Decls that we should |
| 155 | // generate, rather than querying here, be faster? |
| 154 | 156 | for (module.decl_table.items()) |kv| { |
| 155 | 157 | const decl = kv.value; |
| 156 | | const decl_tv = decl.typed_value.most_recent.typed_value; |
| 157 | | const buf = buf: { |
| 158 | | if (decl_tv.val.castTag(.function)) |_| { |
| 159 | | fn_count += 1; |
| 160 | | break :buf decl.fn_link.c.fwd_decl.items; |
| 161 | | } else { |
| 162 | | break :buf decl.link.c.code.items; |
| 163 | | } |
| 164 | | }; |
| 165 | | all_buffers.appendAssumeCapacity(.{ |
| 166 | | .iov_base = buf.ptr, |
| 167 | | .iov_len = buf.len, |
| 168 | | }); |
| 169 | | file_size += buf.len; |
| 158 | switch (decl.typed_value) { |
| 159 | .most_recent => |tvm| { |
| 160 | const buf = buf: { |
| 161 | if (tvm.typed_value.val.castTag(.function)) |_| { |
| 162 | fn_count += 1; |
| 163 | break :buf decl.fn_link.c.fwd_decl.items; |
| 164 | } else { |
| 165 | break :buf decl.link.c.code.items; |
| 166 | } |
| 167 | }; |
| 168 | all_buffers.appendAssumeCapacity(.{ |
| 169 | .iov_base = buf.ptr, |
| 170 | .iov_len = buf.len, |
| 171 | }); |
| 172 | file_size += buf.len; |
| 173 | }, |
| 174 | .never_succeeded => continue, |
| 175 | } |
| 170 | 176 | } |
| 171 | 177 | |
| 172 | 178 | // Now the function bodies. |
| 173 | 179 | try all_buffers.ensureCapacity(all_buffers.items.len + fn_count); |
| 174 | 180 | for (module.decl_table.items()) |kv| { |
| 175 | 181 | const decl = kv.value; |
| 176 | | const decl_tv = decl.typed_value.most_recent.typed_value; |
| 177 | | if (decl_tv.val.castTag(.function)) |_| { |
| 178 | | const buf = decl.link.c.code.items; |
| 179 | | all_buffers.appendAssumeCapacity(.{ |
| 180 | | .iov_base = buf.ptr, |
| 181 | | .iov_len = buf.len, |
| 182 | | }); |
| 183 | | file_size += buf.len; |
| 182 | switch (decl.typed_value) { |
| 183 | .most_recent => |tvm| { |
| 184 | if (tvm.typed_value.val.castTag(.function)) |_| { |
| 185 | const buf = decl.link.c.code.items; |
| 186 | all_buffers.appendAssumeCapacity(.{ |
| 187 | .iov_base = buf.ptr, |
| 188 | .iov_len = buf.len, |
| 189 | }); |
| 190 | file_size += buf.len; |
| 191 | } |
| 192 | }, |
| 193 | .never_succeeded => continue, |
| 184 | 194 | } |
| 185 | 195 | } |
| 186 | 196 | |