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