| ... | ... | @@ -1,12 +1,16 @@ |
| 1 | 1 | gpa: Allocator, |
| 2 | 2 | use_lib_llvm: bool, |
| 3 | 3 | |
| 4 | | llvm_context: *llvm.Context, |
| 5 | | llvm_module: *llvm.Module, |
| 6 | | di_builder: ?*llvm.DIBuilder = null, |
| 7 | | llvm_types: std.ArrayListUnmanaged(*llvm.Type) = .{}, |
| 8 | | llvm_globals: std.ArrayListUnmanaged(*llvm.Value) = .{}, |
| 9 | | llvm_constants: std.ArrayListUnmanaged(*llvm.Value) = .{}, |
| 4 | llvm: if (build_options.have_llvm) struct { |
| 5 | context: *llvm.Context, |
| 6 | module: ?*llvm.Module = null, |
| 7 | target: ?*llvm.Target = null, |
| 8 | di_builder: ?*llvm.DIBuilder = null, |
| 9 | di_compile_unit: ?*llvm.DICompileUnit = null, |
| 10 | types: std.ArrayListUnmanaged(*llvm.Type) = .{}, |
| 11 | globals: std.ArrayListUnmanaged(*llvm.Value) = .{}, |
| 12 | constants: std.ArrayListUnmanaged(*llvm.Value) = .{}, |
| 13 | } else void, |
| 10 | 14 | |
| 11 | 15 | source_filename: String = .none, |
| 12 | 16 | data_layout: String = .none, |
| ... | ... | @@ -38,6 +42,14 @@ constant_limbs: std.ArrayListUnmanaged(std.math.big.Limb) = .{}, |
| 38 | 42 | pub const expected_fields_len = 32; |
| 39 | 43 | pub const expected_gep_indices_len = 8; |
| 40 | 44 | |
| 45 | pub const Options = struct { |
| 46 | allocator: Allocator, |
| 47 | use_lib_llvm: bool = false, |
| 48 | name: []const u8 = &.{}, |
| 49 | target: std.Target = builtin.target, |
| 50 | triple: []const u8 = &.{}, |
| 51 | }; |
| 52 | |
| 41 | 53 | pub const String = enum(u32) { |
| 42 | 54 | none = std.math.maxInt(u31), |
| 43 | 55 | empty, |
| ... | ... | @@ -481,7 +493,7 @@ pub const Type = enum(u32) { |
| 481 | 493 | |
| 482 | 494 | pub fn toLlvm(self: Type, builder: *const Builder) *llvm.Type { |
| 483 | 495 | assert(builder.useLibLlvm()); |
| 484 | | return builder.llvm_types.items[@intFromEnum(self)]; |
| 496 | return builder.llvm.types.items[@intFromEnum(self)]; |
| 485 | 497 | } |
| 486 | 498 | }; |
| 487 | 499 | |
| ... | ... | @@ -751,7 +763,7 @@ pub const Global = struct { |
| 751 | 763 | |
| 752 | 764 | pub fn toLlvm(self: Index, builder: *const Builder) *llvm.Value { |
| 753 | 765 | assert(builder.useLibLlvm()); |
| 754 | | return builder.llvm_globals.items[@intFromEnum(self)]; |
| 766 | return builder.llvm.globals.items[@intFromEnum(self)]; |
| 755 | 767 | } |
| 756 | 768 | |
| 757 | 769 | const FormatData = struct { |
| ... | ... | @@ -780,9 +792,9 @@ pub const Global = struct { |
| 780 | 792 | pub fn renameAssumeCapacity(self: Index, builder: *Builder, name: String) void { |
| 781 | 793 | const index = @intFromEnum(self); |
| 782 | 794 | if (builder.globals.keys()[index] == name) return; |
| 783 | | if (builder.useLibLlvm()) builder.llvm_globals.appendAssumeCapacity(builder.llvm_globals.items[index]); |
| 795 | if (builder.useLibLlvm()) builder.llvm.globals.appendAssumeCapacity(builder.llvm.globals.items[index]); |
| 784 | 796 | _ = builder.addGlobalAssumeCapacity(name, builder.globals.values()[index]); |
| 785 | | if (builder.useLibLlvm()) _ = builder.llvm_globals.pop(); |
| 797 | if (builder.useLibLlvm()) _ = builder.llvm.globals.pop(); |
| 786 | 798 | builder.globals.swapRemoveAt(index); |
| 787 | 799 | self.updateName(builder); |
| 788 | 800 | } |
| ... | ... | @@ -802,7 +814,7 @@ pub const Global = struct { |
| 802 | 814 | if (!builder.useLibLlvm()) return; |
| 803 | 815 | const index = @intFromEnum(self); |
| 804 | 816 | const slice = builder.globals.keys()[index].toSlice(builder) orelse ""; |
| 805 | | builder.llvm_globals.items[index].setValueName2(slice.ptr, slice.len); |
| 817 | builder.llvm.globals.items[index].setValueName2(slice.ptr, slice.len); |
| 806 | 818 | } |
| 807 | 819 | }; |
| 808 | 820 | |
| ... | ... | @@ -1414,7 +1426,7 @@ pub const Constant = enum(u32) { |
| 1414 | 1426 | pub fn toLlvm(self: Constant, builder: *const Builder) *llvm.Value { |
| 1415 | 1427 | assert(builder.useLibLlvm()); |
| 1416 | 1428 | return switch (self.unwrap()) { |
| 1417 | | .constant => |constant| builder.llvm_constants.items[constant], |
| 1429 | .constant => |constant| builder.llvm.constants.items[constant], |
| 1418 | 1430 | .global => |global| global.toLlvm(builder), |
| 1419 | 1431 | }; |
| 1420 | 1432 | } |
| ... | ... | @@ -1436,26 +1448,70 @@ pub const Value = enum(u32) { |
| 1436 | 1448 | } |
| 1437 | 1449 | }; |
| 1438 | 1450 | |
| 1439 | | pub fn init(self: *Builder) Allocator.Error!void { |
| 1451 | pub const InitError = error{ |
| 1452 | InvalidLlvmTriple, |
| 1453 | } || Allocator.Error; |
| 1454 | |
| 1455 | pub fn init(options: Options) InitError!Builder { |
| 1456 | var self = Builder{ |
| 1457 | .gpa = options.allocator, |
| 1458 | .use_lib_llvm = options.use_lib_llvm, |
| 1459 | .llvm = undefined, |
| 1460 | }; |
| 1461 | if (self.useLibLlvm()) self.llvm = .{ .context = llvm.Context.create() }; |
| 1462 | errdefer self.deinit(); |
| 1463 | |
| 1440 | 1464 | try self.string_indices.append(self.gpa, 0); |
| 1441 | 1465 | assert(try self.string("") == .empty); |
| 1442 | 1466 | |
| 1467 | if (options.name.len > 0) self.source_filename = try self.string(options.name); |
| 1468 | self.initializeLLVMTarget(options.target.cpu.arch); |
| 1469 | if (self.useLibLlvm()) self.llvm.module = llvm.Module.createWithName( |
| 1470 | (self.source_filename.toSlice(&self) orelse "").ptr, |
| 1471 | self.llvm.context, |
| 1472 | ); |
| 1473 | |
| 1474 | if (options.triple.len > 0) { |
| 1475 | self.target_triple = try self.string(options.triple); |
| 1476 | |
| 1477 | if (self.useLibLlvm()) { |
| 1478 | var error_message: [*:0]const u8 = undefined; |
| 1479 | var target: *llvm.Target = undefined; |
| 1480 | if (llvm.Target.getFromTriple( |
| 1481 | self.target_triple.toSlice(&self).?.ptr, |
| 1482 | &target, |
| 1483 | &error_message, |
| 1484 | ).toBool()) { |
| 1485 | defer llvm.disposeMessage(error_message); |
| 1486 | |
| 1487 | log.err("LLVM failed to parse '{s}': {s}", .{ |
| 1488 | self.target_triple.toSlice(&self).?, |
| 1489 | error_message, |
| 1490 | }); |
| 1491 | return InitError.InvalidLlvmTriple; |
| 1492 | } |
| 1493 | self.llvm.target = target; |
| 1494 | self.llvm.module.?.setTarget(self.target_triple.toSlice(&self).?.ptr); |
| 1495 | } |
| 1496 | } |
| 1497 | |
| 1443 | 1498 | { |
| 1444 | 1499 | const static_len = @typeInfo(Type).Enum.fields.len - 1; |
| 1445 | 1500 | try self.type_map.ensureTotalCapacity(self.gpa, static_len); |
| 1446 | 1501 | try self.type_items.ensureTotalCapacity(self.gpa, static_len); |
| 1447 | | if (self.useLibLlvm()) try self.llvm_types.ensureTotalCapacity(self.gpa, static_len); |
| 1502 | if (self.useLibLlvm()) try self.llvm.types.ensureTotalCapacity(self.gpa, static_len); |
| 1448 | 1503 | inline for (@typeInfo(Type.Simple).Enum.fields) |simple_field| { |
| 1449 | 1504 | const result = self.getOrPutTypeNoExtraAssumeCapacity( |
| 1450 | 1505 | .{ .tag = .simple, .data = simple_field.value }, |
| 1451 | 1506 | ); |
| 1452 | 1507 | assert(result.new and result.type == @field(Type, simple_field.name)); |
| 1453 | | if (self.useLibLlvm()) self.llvm_types.appendAssumeCapacity( |
| 1454 | | @field(llvm.Context, simple_field.name ++ "Type")(self.llvm_context), |
| 1508 | if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( |
| 1509 | @field(llvm.Context, simple_field.name ++ "Type")(self.llvm.context), |
| 1455 | 1510 | ); |
| 1456 | 1511 | } |
| 1457 | | inline for (.{ 1, 8, 16, 29, 32, 64, 80, 128 }) |bits| assert(self.intTypeAssumeCapacity(bits) == |
| 1458 | | @field(Type, std.fmt.comptimePrint("i{d}", .{bits}))); |
| 1512 | inline for (.{ 1, 8, 16, 29, 32, 64, 80, 128 }) |bits| |
| 1513 | assert(self.intTypeAssumeCapacity(bits) == |
| 1514 | @field(Type, std.fmt.comptimePrint("i{d}", .{bits}))); |
| 1459 | 1515 | inline for (.{0}) |addr_space| |
| 1460 | 1516 | assert(self.ptrTypeAssumeCapacity(@enumFromInt(addr_space)) == .ptr); |
| 1461 | 1517 | } |
| ... | ... | @@ -1463,13 +1519,11 @@ pub fn init(self: *Builder) Allocator.Error!void { |
| 1463 | 1519 | assert(try self.intConst(.i1, 0) == .false); |
| 1464 | 1520 | assert(try self.intConst(.i1, 1) == .true); |
| 1465 | 1521 | assert(try self.noneConst(.token) == .none); |
| 1522 | |
| 1523 | return self; |
| 1466 | 1524 | } |
| 1467 | 1525 | |
| 1468 | 1526 | pub fn deinit(self: *Builder) void { |
| 1469 | | self.llvm_types.deinit(self.gpa); |
| 1470 | | self.llvm_globals.deinit(self.gpa); |
| 1471 | | self.llvm_constants.deinit(self.gpa); |
| 1472 | | |
| 1473 | 1527 | self.string_map.deinit(self.gpa); |
| 1474 | 1528 | self.string_bytes.deinit(self.gpa); |
| 1475 | 1529 | self.string_indices.deinit(self.gpa); |
| ... | ... | @@ -1492,6 +1546,14 @@ pub fn deinit(self: *Builder) void { |
| 1492 | 1546 | self.constant_extra.deinit(self.gpa); |
| 1493 | 1547 | self.constant_limbs.deinit(self.gpa); |
| 1494 | 1548 | |
| 1549 | if (self.useLibLlvm()) { |
| 1550 | self.llvm.constants.deinit(self.gpa); |
| 1551 | self.llvm.globals.deinit(self.gpa); |
| 1552 | self.llvm.types.deinit(self.gpa); |
| 1553 | if (self.llvm.di_builder) |di_builder| di_builder.dispose(); |
| 1554 | if (self.llvm.module) |module| module.dispose(); |
| 1555 | self.llvm.context.dispose(); |
| 1556 | } |
| 1495 | 1557 | self.* = undefined; |
| 1496 | 1558 | } |
| 1497 | 1559 | |
| ... | ... | @@ -1807,7 +1869,7 @@ pub fn namedTypeSetBody( |
| 1807 | 1869 | const llvm_fields = try self.gpa.alloc(*llvm.Type, body_fields.len); |
| 1808 | 1870 | defer self.gpa.free(llvm_fields); |
| 1809 | 1871 | for (llvm_fields, body_fields) |*llvm_field, body_field| llvm_field.* = body_field.toLlvm(self); |
| 1810 | | self.llvm_types.items[@intFromEnum(named_type)].structSetBody( |
| 1872 | self.llvm.types.items[@intFromEnum(named_type)].structSetBody( |
| 1811 | 1873 | llvm_fields.ptr, |
| 1812 | 1874 | @intCast(llvm_fields.len), |
| 1813 | 1875 | switch (body_item.tag) { |
| ... | ... | @@ -1869,7 +1931,7 @@ pub fn bigIntConst(self: *Builder, ty: Type, value: std.math.big.int.Const) Allo |
| 1869 | 1931 | try self.constant_map.ensureUnusedCapacity(self.gpa, 1); |
| 1870 | 1932 | try self.constant_items.ensureUnusedCapacity(self.gpa, 1); |
| 1871 | 1933 | try self.constant_limbs.ensureUnusedCapacity(self.gpa, Constant.Integer.limbs + value.limbs.len); |
| 1872 | | if (self.useLibLlvm()) try self.llvm_constants.ensureUnusedCapacity(self.gpa, 1); |
| 1934 | if (self.useLibLlvm()) try self.llvm.constants.ensureUnusedCapacity(self.gpa, 1); |
| 1873 | 1935 | return self.bigIntConstAssumeCapacity(ty, value); |
| 1874 | 1936 | } |
| 1875 | 1937 | |
| ... | ... | @@ -2166,7 +2228,7 @@ fn isValidIdentifier(id: []const u8) bool { |
| 2166 | 2228 | } |
| 2167 | 2229 | |
| 2168 | 2230 | fn ensureUnusedCapacityGlobal(self: *Builder, name: String) Allocator.Error!void { |
| 2169 | | if (self.useLibLlvm()) try self.llvm_globals.ensureUnusedCapacity(self.gpa, 1); |
| 2231 | if (self.useLibLlvm()) try self.llvm.globals.ensureUnusedCapacity(self.gpa, 1); |
| 2170 | 2232 | try self.string_map.ensureUnusedCapacity(self.gpa, 1); |
| 2171 | 2233 | if (name.toSlice(self)) |id| try self.string_bytes.ensureUnusedCapacity(self.gpa, id.len + |
| 2172 | 2234 | comptime std.fmt.count("{d}" ++ .{0}, .{std.math.maxInt(u32)})); |
| ... | ... | @@ -2222,7 +2284,7 @@ fn fnTypeAssumeCapacity( |
| 2222 | 2284 | const llvm_params = try self.gpa.alloc(*llvm.Type, params.len); |
| 2223 | 2285 | defer self.gpa.free(llvm_params); |
| 2224 | 2286 | for (llvm_params, params) |*llvm_param, param| llvm_param.* = param.toLlvm(self); |
| 2225 | | self.llvm_types.appendAssumeCapacity(llvm.functionType( |
| 2287 | self.llvm.types.appendAssumeCapacity(llvm.functionType( |
| 2226 | 2288 | ret.toLlvm(self), |
| 2227 | 2289 | llvm_params.ptr, |
| 2228 | 2290 | @intCast(llvm_params.len), |
| ... | ... | @@ -2240,7 +2302,7 @@ fn intTypeAssumeCapacity(self: *Builder, bits: u24) Type { |
| 2240 | 2302 | assert(bits > 0); |
| 2241 | 2303 | const result = self.getOrPutTypeNoExtraAssumeCapacity(.{ .tag = .integer, .data = bits }); |
| 2242 | 2304 | if (self.useLibLlvm() and result.new) |
| 2243 | | self.llvm_types.appendAssumeCapacity(self.llvm_context.intType(bits)); |
| 2305 | self.llvm.types.appendAssumeCapacity(self.llvm.context.intType(bits)); |
| 2244 | 2306 | return result.type; |
| 2245 | 2307 | } |
| 2246 | 2308 | |
| ... | ... | @@ -2249,7 +2311,7 @@ fn ptrTypeAssumeCapacity(self: *Builder, addr_space: AddrSpace) Type { |
| 2249 | 2311 | .{ .tag = .pointer, .data = @intFromEnum(addr_space) }, |
| 2250 | 2312 | ); |
| 2251 | 2313 | if (self.useLibLlvm() and result.new) |
| 2252 | | self.llvm_types.appendAssumeCapacity(self.llvm_context.pointerType(@intFromEnum(addr_space))); |
| 2314 | self.llvm.types.appendAssumeCapacity(self.llvm.context.pointerType(@intFromEnum(addr_space))); |
| 2253 | 2315 | return result.type; |
| 2254 | 2316 | } |
| 2255 | 2317 | |
| ... | ... | @@ -2286,7 +2348,7 @@ fn vectorTypeAssumeCapacity( |
| 2286 | 2348 | .tag = tag, |
| 2287 | 2349 | .data = self.addTypeExtraAssumeCapacity(data), |
| 2288 | 2350 | }); |
| 2289 | | if (self.useLibLlvm()) self.llvm_types.appendAssumeCapacity(switch (kind) { |
| 2351 | if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity(switch (kind) { |
| 2290 | 2352 | .normal => &llvm.Type.vectorType, |
| 2291 | 2353 | .scalable => &llvm.Type.scalableVectorType, |
| 2292 | 2354 | }(child.toLlvm(self), @intCast(len))); |
| ... | ... | @@ -2319,7 +2381,7 @@ fn arrayTypeAssumeCapacity(self: *Builder, len: u64, child: Type) Type { |
| 2319 | 2381 | .tag = .small_array, |
| 2320 | 2382 | .data = self.addTypeExtraAssumeCapacity(data), |
| 2321 | 2383 | }); |
| 2322 | | if (self.useLibLlvm()) self.llvm_types.appendAssumeCapacity( |
| 2384 | if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( |
| 2323 | 2385 | child.toLlvm(self).arrayType(@intCast(len)), |
| 2324 | 2386 | ); |
| 2325 | 2387 | } |
| ... | ... | @@ -2352,7 +2414,7 @@ fn arrayTypeAssumeCapacity(self: *Builder, len: u64, child: Type) Type { |
| 2352 | 2414 | .tag = .array, |
| 2353 | 2415 | .data = self.addTypeExtraAssumeCapacity(data), |
| 2354 | 2416 | }); |
| 2355 | | if (self.useLibLlvm()) self.llvm_types.appendAssumeCapacity( |
| 2417 | if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( |
| 2356 | 2418 | child.toLlvm(self).arrayType(@intCast(len)), |
| 2357 | 2419 | ); |
| 2358 | 2420 | } |
| ... | ... | @@ -2406,7 +2468,7 @@ fn structTypeAssumeCapacity( |
| 2406 | 2468 | defer allocator.free(llvm_fields); |
| 2407 | 2469 | for (llvm_fields, fields) |*llvm_field, field| llvm_field.* = field.toLlvm(self); |
| 2408 | 2470 | |
| 2409 | | self.llvm_types.appendAssumeCapacity(self.llvm_context.structType( |
| 2471 | self.llvm.types.appendAssumeCapacity(self.llvm.context.structType( |
| 2410 | 2472 | llvm_fields.ptr, |
| 2411 | 2473 | @intCast(llvm_fields.len), |
| 2412 | 2474 | switch (kind) { |
| ... | ... | @@ -2456,8 +2518,8 @@ fn opaqueTypeAssumeCapacity(self: *Builder, name: String) Type { |
| 2456 | 2518 | }); |
| 2457 | 2519 | const result: Type = @enumFromInt(gop.index); |
| 2458 | 2520 | type_gop.value_ptr.* = result; |
| 2459 | | if (self.useLibLlvm()) self.llvm_types.appendAssumeCapacity( |
| 2460 | | self.llvm_context.structCreateNamed(id.toSlice(self) orelse ""), |
| 2521 | if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( |
| 2522 | self.llvm.context.structCreateNamed(id.toSlice(self) orelse ""), |
| 2461 | 2523 | ); |
| 2462 | 2524 | return result; |
| 2463 | 2525 | } |
| ... | ... | @@ -2481,7 +2543,7 @@ fn ensureUnusedTypeCapacity( |
| 2481 | 2543 | self.gpa, |
| 2482 | 2544 | count * (@typeInfo(E).Struct.fields.len + trail_len), |
| 2483 | 2545 | ) else assert(trail_len == 0); |
| 2484 | | if (self.useLibLlvm()) try self.llvm_types.ensureUnusedCapacity(self.gpa, count); |
| 2546 | if (self.useLibLlvm()) try self.llvm.types.ensureUnusedCapacity(self.gpa, count); |
| 2485 | 2547 | } |
| 2486 | 2548 | |
| 2487 | 2549 | fn getOrPutTypeNoExtraAssumeCapacity(self: *Builder, item: Type.Item) struct { new: bool, type: Type } { |
| ... | ... | @@ -2613,9 +2675,9 @@ fn bigIntConstAssumeCapacity( |
| 2613 | 2675 | if (self.useLibLlvm()) { |
| 2614 | 2676 | const llvm_type = ty.toLlvm(self); |
| 2615 | 2677 | if (canonical_value.to(c_longlong)) |small| { |
| 2616 | | self.llvm_constants.appendAssumeCapacity(llvm_type.constInt(@bitCast(small), .True)); |
| 2678 | self.llvm.constants.appendAssumeCapacity(llvm_type.constInt(@bitCast(small), .True)); |
| 2617 | 2679 | } else |_| if (canonical_value.to(c_ulonglong)) |small| { |
| 2618 | | self.llvm_constants.appendAssumeCapacity(llvm_type.constInt(small, .False)); |
| 2680 | self.llvm.constants.appendAssumeCapacity(llvm_type.constInt(small, .False)); |
| 2619 | 2681 | } else |_| { |
| 2620 | 2682 | const llvm_limbs = try allocator.alloc(u64, std.math.divCeil( |
| 2621 | 2683 | usize, |
| ... | ... | @@ -2643,7 +2705,7 @@ fn bigIntConstAssumeCapacity( |
| 2643 | 2705 | } |
| 2644 | 2706 | result_limb.* = llvm_limb; |
| 2645 | 2707 | } |
| 2646 | | self.llvm_constants.appendAssumeCapacity( |
| 2708 | self.llvm.constants.appendAssumeCapacity( |
| 2647 | 2709 | llvm_type.constIntOfArbitraryPrecision(@intCast(llvm_limbs.len), llvm_limbs.ptr), |
| 2648 | 2710 | ); |
| 2649 | 2711 | } |
| ... | ... | @@ -2656,7 +2718,7 @@ fn halfConstAssumeCapacity(self: *Builder, val: f16) Constant { |
| 2656 | 2718 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 2657 | 2719 | .{ .tag = .half, .data = @as(u16, @bitCast(val)) }, |
| 2658 | 2720 | ); |
| 2659 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity( |
| 2721 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity( |
| 2660 | 2722 | if (std.math.isSignalNan(val)) |
| 2661 | 2723 | Type.i16.toLlvm(self).constInt(@as(u16, @bitCast(val)), .False) |
| 2662 | 2724 | .constBitCast(Type.half.toLlvm(self)) |
| ... | ... | @@ -2671,7 +2733,7 @@ fn bfloatConstAssumeCapacity(self: *Builder, val: f32) Constant { |
| 2671 | 2733 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 2672 | 2734 | .{ .tag = .bfloat, .data = @bitCast(val) }, |
| 2673 | 2735 | ); |
| 2674 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity( |
| 2736 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity( |
| 2675 | 2737 | if (std.math.isSignalNan(val)) |
| 2676 | 2738 | Type.i16.toLlvm(self).constInt(@as(u32, @bitCast(val)) >> 16, .False) |
| 2677 | 2739 | .constBitCast(Type.bfloat.toLlvm(self)) |
| ... | ... | @@ -2680,7 +2742,7 @@ fn bfloatConstAssumeCapacity(self: *Builder, val: f32) Constant { |
| 2680 | 2742 | ); |
| 2681 | 2743 | |
| 2682 | 2744 | if (self.useLibLlvm() and result.new) |
| 2683 | | self.llvm_constants.appendAssumeCapacity(Type.bfloat.toLlvm(self).constReal(val)); |
| 2745 | self.llvm.constants.appendAssumeCapacity(Type.bfloat.toLlvm(self).constReal(val)); |
| 2684 | 2746 | return result.constant; |
| 2685 | 2747 | } |
| 2686 | 2748 | |
| ... | ... | @@ -2688,7 +2750,7 @@ fn floatConstAssumeCapacity(self: *Builder, val: f32) Constant { |
| 2688 | 2750 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 2689 | 2751 | .{ .tag = .float, .data = @bitCast(val) }, |
| 2690 | 2752 | ); |
| 2691 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity( |
| 2753 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity( |
| 2692 | 2754 | if (std.math.isSignalNan(val)) |
| 2693 | 2755 | Type.i32.toLlvm(self).constInt(@as(u32, @bitCast(val)), .False) |
| 2694 | 2756 | .constBitCast(Type.float.toLlvm(self)) |
| ... | ... | @@ -2725,7 +2787,7 @@ fn doubleConstAssumeCapacity(self: *Builder, val: f64) Constant { |
| 2725 | 2787 | .hi = @truncate(@as(u64, @bitCast(val))), |
| 2726 | 2788 | }), |
| 2727 | 2789 | }); |
| 2728 | | if (self.useLibLlvm()) self.llvm_constants.appendAssumeCapacity( |
| 2790 | if (self.useLibLlvm()) self.llvm.constants.appendAssumeCapacity( |
| 2729 | 2791 | if (std.math.isSignalNan(val)) |
| 2730 | 2792 | Type.i64.toLlvm(self).constInt(@as(u64, @bitCast(val)), .False) |
| 2731 | 2793 | .constBitCast(Type.double.toLlvm(self)) |
| ... | ... | @@ -2771,7 +2833,7 @@ fn fp128ConstAssumeCapacity(self: *Builder, val: f128) Constant { |
| 2771 | 2833 | @truncate(@as(u128, @bitCast(val))), |
| 2772 | 2834 | @intCast(@as(u128, @bitCast(val)) >> 64), |
| 2773 | 2835 | }; |
| 2774 | | self.llvm_constants.appendAssumeCapacity( |
| 2836 | self.llvm.constants.appendAssumeCapacity( |
| 2775 | 2837 | Type.i128.toLlvm(self) |
| 2776 | 2838 | .constIntOfArbitraryPrecision(@intCast(llvm_limbs.len), &llvm_limbs) |
| 2777 | 2839 | .constBitCast(Type.fp128.toLlvm(self)), |
| ... | ... | @@ -2815,7 +2877,7 @@ fn x86_fp80ConstAssumeCapacity(self: *Builder, val: f80) Constant { |
| 2815 | 2877 | @truncate(@as(u80, @bitCast(val))), |
| 2816 | 2878 | @intCast(@as(u80, @bitCast(val)) >> 64), |
| 2817 | 2879 | }; |
| 2818 | | self.llvm_constants.appendAssumeCapacity( |
| 2880 | self.llvm.constants.appendAssumeCapacity( |
| 2819 | 2881 | Type.i80.toLlvm(self) |
| 2820 | 2882 | .constIntOfArbitraryPrecision(@intCast(llvm_limbs.len), &llvm_limbs) |
| 2821 | 2883 | .constBitCast(Type.x86_fp80.toLlvm(self)), |
| ... | ... | @@ -2857,7 +2919,7 @@ fn ppc_fp128ConstAssumeCapacity(self: *Builder, val: [2]f64) Constant { |
| 2857 | 2919 | }); |
| 2858 | 2920 | if (self.useLibLlvm()) { |
| 2859 | 2921 | const llvm_limbs: *const [2]u64 = @ptrCast(&val); |
| 2860 | | self.llvm_constants.appendAssumeCapacity( |
| 2922 | self.llvm.constants.appendAssumeCapacity( |
| 2861 | 2923 | Type.i128.toLlvm(self) |
| 2862 | 2924 | .constIntOfArbitraryPrecision(@intCast(llvm_limbs.len), llvm_limbs) |
| 2863 | 2925 | .constBitCast(Type.ppc_fp128.toLlvm(self)), |
| ... | ... | @@ -2873,7 +2935,7 @@ fn nullConstAssumeCapacity(self: *Builder, ty: Type) Constant { |
| 2873 | 2935 | .{ .tag = .null, .data = @intFromEnum(ty) }, |
| 2874 | 2936 | ); |
| 2875 | 2937 | if (self.useLibLlvm() and result.new) |
| 2876 | | self.llvm_constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 2938 | self.llvm.constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 2877 | 2939 | return result.constant; |
| 2878 | 2940 | } |
| 2879 | 2941 | |
| ... | ... | @@ -2883,7 +2945,7 @@ fn noneConstAssumeCapacity(self: *Builder, ty: Type) Constant { |
| 2883 | 2945 | .{ .tag = .none, .data = @intFromEnum(ty) }, |
| 2884 | 2946 | ); |
| 2885 | 2947 | if (self.useLibLlvm() and result.new) |
| 2886 | | self.llvm_constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 2948 | self.llvm.constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 2887 | 2949 | return result.constant; |
| 2888 | 2950 | } |
| 2889 | 2951 | |
| ... | ... | @@ -2929,7 +2991,7 @@ fn structConstAssumeCapacity( |
| 2929 | 2991 | defer allocator.free(llvm_vals); |
| 2930 | 2992 | for (llvm_vals, vals) |*llvm_val, val| llvm_val.* = val.toLlvm(self); |
| 2931 | 2993 | |
| 2932 | | self.llvm_constants.appendAssumeCapacity( |
| 2994 | self.llvm.constants.appendAssumeCapacity( |
| 2933 | 2995 | ty.toLlvm(self).constNamedStruct(llvm_vals.ptr, @intCast(llvm_vals.len)), |
| 2934 | 2996 | ); |
| 2935 | 2997 | } |
| ... | ... | @@ -2971,7 +3033,7 @@ fn arrayConstAssumeCapacity( |
| 2971 | 3033 | defer allocator.free(llvm_vals); |
| 2972 | 3034 | for (llvm_vals, vals) |*llvm_val, val| llvm_val.* = val.toLlvm(self); |
| 2973 | 3035 | |
| 2974 | | self.llvm_constants.appendAssumeCapacity( |
| 3036 | self.llvm.constants.appendAssumeCapacity( |
| 2975 | 3037 | type_extra.child.toLlvm(self).constArray(llvm_vals.ptr, @intCast(llvm_vals.len)), |
| 2976 | 3038 | ); |
| 2977 | 3039 | } |
| ... | ... | @@ -2985,8 +3047,8 @@ fn stringConstAssumeCapacity(self: *Builder, val: String) Constant { |
| 2985 | 3047 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 2986 | 3048 | .{ .tag = .string, .data = @intFromEnum(val) }, |
| 2987 | 3049 | ); |
| 2988 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity( |
| 2989 | | self.llvm_context.constString(slice.ptr, @intCast(slice.len), .True), |
| 3050 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity( |
| 3051 | self.llvm.context.constString(slice.ptr, @intCast(slice.len), .True), |
| 2990 | 3052 | ); |
| 2991 | 3053 | return result.constant; |
| 2992 | 3054 | } |
| ... | ... | @@ -2998,8 +3060,8 @@ fn stringNullConstAssumeCapacity(self: *Builder, val: String) Constant { |
| 2998 | 3060 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 2999 | 3061 | .{ .tag = .string_null, .data = @intFromEnum(val) }, |
| 3000 | 3062 | ); |
| 3001 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity( |
| 3002 | | self.llvm_context.constString(slice.ptr, @intCast(slice.len + 1), .True), |
| 3063 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity( |
| 3064 | self.llvm.context.constString(slice.ptr, @intCast(slice.len + 1), .True), |
| 3003 | 3065 | ); |
| 3004 | 3066 | return result.constant; |
| 3005 | 3067 | } |
| ... | ... | @@ -3032,7 +3094,7 @@ fn vectorConstAssumeCapacity( |
| 3032 | 3094 | defer allocator.free(llvm_vals); |
| 3033 | 3095 | for (llvm_vals, vals) |*llvm_val, val| llvm_val.* = val.toLlvm(self); |
| 3034 | 3096 | |
| 3035 | | self.llvm_constants.appendAssumeCapacity( |
| 3097 | self.llvm.constants.appendAssumeCapacity( |
| 3036 | 3098 | llvm.constVector(llvm_vals.ptr, @intCast(llvm_vals.len)), |
| 3037 | 3099 | ); |
| 3038 | 3100 | } |
| ... | ... | @@ -3061,7 +3123,7 @@ fn zeroInitConstAssumeCapacity(self: *Builder, ty: Type) Constant { |
| 3061 | 3123 | .{ .tag = .zeroinitializer, .data = @intFromEnum(ty) }, |
| 3062 | 3124 | ); |
| 3063 | 3125 | if (self.useLibLlvm() and result.new) |
| 3064 | | self.llvm_constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 3126 | self.llvm.constants.appendAssumeCapacity(ty.toLlvm(self).constNull()); |
| 3065 | 3127 | return result.constant; |
| 3066 | 3128 | } |
| 3067 | 3129 | |
| ... | ... | @@ -3078,7 +3140,7 @@ fn undefConstAssumeCapacity(self: *Builder, ty: Type) Constant { |
| 3078 | 3140 | .{ .tag = .undef, .data = @intFromEnum(ty) }, |
| 3079 | 3141 | ); |
| 3080 | 3142 | if (self.useLibLlvm() and result.new) |
| 3081 | | self.llvm_constants.appendAssumeCapacity(ty.toLlvm(self).getUndef()); |
| 3143 | self.llvm.constants.appendAssumeCapacity(ty.toLlvm(self).getUndef()); |
| 3082 | 3144 | return result.constant; |
| 3083 | 3145 | } |
| 3084 | 3146 | |
| ... | ... | @@ -3095,7 +3157,7 @@ fn poisonConstAssumeCapacity(self: *Builder, ty: Type) Constant { |
| 3095 | 3157 | .{ .tag = .poison, .data = @intFromEnum(ty) }, |
| 3096 | 3158 | ); |
| 3097 | 3159 | if (self.useLibLlvm() and result.new) |
| 3098 | | self.llvm_constants.appendAssumeCapacity(ty.toLlvm(self).getUndef()); |
| 3160 | self.llvm.constants.appendAssumeCapacity(ty.toLlvm(self).getUndef()); |
| 3099 | 3161 | return result.constant; |
| 3100 | 3162 | } |
| 3101 | 3163 | |
| ... | ... | @@ -3128,7 +3190,7 @@ fn blockAddrConstAssumeCapacity( |
| 3128 | 3190 | .tag = .blockaddress, |
| 3129 | 3191 | .data = self.addConstantExtraAssumeCapacity(data), |
| 3130 | 3192 | }); |
| 3131 | | if (self.useLibLlvm()) self.llvm_constants.appendAssumeCapacity( |
| 3193 | if (self.useLibLlvm()) self.llvm.constants.appendAssumeCapacity( |
| 3132 | 3194 | function.toLlvm(self).blockAddress(block.toValue(self, function).toLlvm(self, function)), |
| 3133 | 3195 | ); |
| 3134 | 3196 | } |
| ... | ... | @@ -3139,7 +3201,7 @@ fn dsoLocalEquivalentConstAssumeCapacity(self: *Builder, function: Function.Inde |
| 3139 | 3201 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 3140 | 3202 | .{ .tag = .dso_local_equivalent, .data = @intFromEnum(function) }, |
| 3141 | 3203 | ); |
| 3142 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity(undefined); |
| 3204 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity(undefined); |
| 3143 | 3205 | return result.constant; |
| 3144 | 3206 | } |
| 3145 | 3207 | |
| ... | ... | @@ -3147,7 +3209,7 @@ fn noCfiConstAssumeCapacity(self: *Builder, function: Function.Index) Constant { |
| 3147 | 3209 | const result = self.getOrPutConstantNoExtraAssumeCapacity( |
| 3148 | 3210 | .{ .tag = .no_cfi, .data = @intFromEnum(function) }, |
| 3149 | 3211 | ); |
| 3150 | | if (self.useLibLlvm() and result.new) self.llvm_constants.appendAssumeCapacity(undefined); |
| 3212 | if (self.useLibLlvm() and result.new) self.llvm.constants.appendAssumeCapacity(undefined); |
| 3151 | 3213 | return result.constant; |
| 3152 | 3214 | } |
| 3153 | 3215 | |
| ... | ... | @@ -3226,7 +3288,7 @@ fn castConstAssumeCapacity(self: *Builder, tag: Constant.Tag, arg: Constant, ty: |
| 3226 | 3288 | .tag = tag, |
| 3227 | 3289 | .data = self.addConstantExtraAssumeCapacity(data.cast), |
| 3228 | 3290 | }); |
| 3229 | | if (self.useLibLlvm()) self.llvm_constants.appendAssumeCapacity(switch (tag) { |
| 3291 | if (self.useLibLlvm()) self.llvm.constants.appendAssumeCapacity(switch (tag) { |
| 3230 | 3292 | .trunc => &llvm.Value.constTrunc, |
| 3231 | 3293 | .zext => &llvm.Value.constZExt, |
| 3232 | 3294 | .sext => &llvm.Value.constSExt, |
| ... | ... | @@ -3330,7 +3392,7 @@ fn gepConstAssumeCapacity( |
| 3330 | 3392 | defer allocator.free(llvm_indices); |
| 3331 | 3393 | for (llvm_indices, indices) |*llvm_index, index| llvm_index.* = index.toLlvm(self); |
| 3332 | 3394 | |
| 3333 | | self.llvm_constants.appendAssumeCapacity(switch (kind) { |
| 3395 | self.llvm.constants.appendAssumeCapacity(switch (kind) { |
| 3334 | 3396 | .normal => &llvm.Type.constGEP, |
| 3335 | 3397 | .inbounds => &llvm.Type.constInBoundsGEP, |
| 3336 | 3398 | }(ty.toLlvm(self), base.toLlvm(self), llvm_indices.ptr, @intCast(indices.len))); |
| ... | ... | @@ -3374,7 +3436,7 @@ fn binConstAssumeCapacity( |
| 3374 | 3436 | .tag = tag, |
| 3375 | 3437 | .data = self.addConstantExtraAssumeCapacity(data.bin), |
| 3376 | 3438 | }); |
| 3377 | | if (self.useLibLlvm()) self.llvm_constants.appendAssumeCapacity(switch (tag) { |
| 3439 | if (self.useLibLlvm()) self.llvm.constants.appendAssumeCapacity(switch (tag) { |
| 3378 | 3440 | .add => &llvm.Value.constAdd, |
| 3379 | 3441 | .sub => &llvm.Value.constSub, |
| 3380 | 3442 | .mul => &llvm.Value.constMul, |
| ... | ... | @@ -3402,7 +3464,7 @@ fn ensureUnusedConstantCapacity( |
| 3402 | 3464 | self.gpa, |
| 3403 | 3465 | count * (@typeInfo(E).Struct.fields.len + trail_len), |
| 3404 | 3466 | ) else assert(trail_len == 0); |
| 3405 | | if (self.useLibLlvm()) try self.llvm_constants.ensureUnusedCapacity(self.gpa, count); |
| 3467 | if (self.useLibLlvm()) try self.llvm.constants.ensureUnusedCapacity(self.gpa, count); |
| 3406 | 3468 | } |
| 3407 | 3469 | |
| 3408 | 3470 | fn getOrPutConstantNoExtraAssumeCapacity( |
| ... | ... | @@ -3516,13 +3578,15 @@ fn constantExtraData(self: *const Builder, comptime T: type, index: Constant.Ite |
| 3516 | 3578 | return self.constantExtraDataTrail(T, index).data; |
| 3517 | 3579 | } |
| 3518 | 3580 | |
| 3519 | | inline fn useLibLlvm(self: *const Builder) bool { |
| 3581 | pub inline fn useLibLlvm(self: *const Builder) bool { |
| 3520 | 3582 | return build_options.have_llvm and self.use_lib_llvm; |
| 3521 | 3583 | } |
| 3522 | 3584 | |
| 3523 | 3585 | const assert = std.debug.assert; |
| 3524 | 3586 | const build_options = @import("build_options"); |
| 3587 | const builtin = @import("builtin"); |
| 3525 | 3588 | const llvm = @import("bindings.zig"); |
| 3589 | const log = std.log.scoped(.llvm); |
| 3526 | 3590 | const std = @import("std"); |
| 3527 | 3591 | |
| 3528 | 3592 | const Allocator = std.mem.Allocator; |