diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm.zig | 52 | ||||
| -rw-r--r-- | src/codegen/llvm/Builder.zig | 89 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 17 |
3 files changed, 58 insertions, 100 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index 2e61356b3a..89803e62ec 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -148,6 +148,7 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![]const u8 { .watchos => "watchos", .driverkit => "driverkit", .shadermodel => "shadermodel", + .liteos => "liteos", .opencl, .glsl450, .vulkan, @@ -254,6 +255,7 @@ pub fn targetOs(os_tag: std.Target.Os.Tag) llvm.OSType { .emscripten => .Emscripten, .driverkit => .DriverKit, .shadermodel => .ShaderModel, + .liteos => .LiteOS, }; } @@ -419,8 +421,12 @@ const DataLayoutBuilder = struct { if (idx != size) try writer.print(":{d}", .{idx}); } } - if (self.target.cpu.arch.isArmOrThumb()) - try writer.writeAll("-Fi8"); // for thumb interwork + if (self.target.cpu.arch.isArmOrThumb()) try writer.writeAll("-Fi8") // for thumb interwork + else if (self.target.cpu.arch == .powerpc64 and + self.target.os.tag != .freebsd and self.target.abi != .musl) + try writer.writeAll("-Fi64") + else if (self.target.cpu.arch.isPPC() or self.target.cpu.arch.isPPC64()) + try writer.writeAll("-Fn32"); if (self.target.cpu.arch != .hexagon) { if (self.target.cpu.arch == .arc or self.target.cpu.arch == .s390x) try self.typeAlignment(.integer, 1, 8, 8, false, writer); @@ -10507,16 +10513,17 @@ fn llvmAddrSpaceInfo(target: std.Target) []const AddrSpaceInfo { .{ .zig = .constant, .llvm = Builder.AddrSpace.amdgpu.constant, .force_in_data_layout = true }, .{ .zig = .local, .llvm = Builder.AddrSpace.amdgpu.private, .size = 32, .abi = 32 }, .{ .zig = null, .llvm = Builder.AddrSpace.amdgpu.constant_32bit, .size = 32, .abi = 32 }, - .{ .zig = null, .llvm = Builder.AddrSpace.amdgpu.buffer_fat_pointer, .non_integral = true }, + .{ .zig = null, .llvm = Builder.AddrSpace.amdgpu.buffer_fat_pointer, .non_integral = true, .size = 160, .abi = 256, .idx = 32 }, + .{ .zig = null, .llvm = Builder.AddrSpace.amdgpu.buffer_resource, .non_integral = true, .size = 128, .abi = 128 }, }, .avr => &.{ .{ .zig = .generic, .llvm = .default, .abi = 8 }, - .{ .zig = .flash, .llvm = Builder.AddrSpace.avr.flash, .abi = 8 }, - .{ .zig = .flash1, .llvm = Builder.AddrSpace.avr.flash1, .abi = 8 }, - .{ .zig = .flash2, .llvm = Builder.AddrSpace.avr.flash2, .abi = 8 }, - .{ .zig = .flash3, .llvm = Builder.AddrSpace.avr.flash3, .abi = 8 }, - .{ .zig = .flash4, .llvm = Builder.AddrSpace.avr.flash4, .abi = 8 }, - .{ .zig = .flash5, .llvm = Builder.AddrSpace.avr.flash5, .abi = 8 }, + .{ .zig = .flash, .llvm = Builder.AddrSpace.avr.program, .abi = 8 }, + .{ .zig = .flash1, .llvm = Builder.AddrSpace.avr.program1, .abi = 8 }, + .{ .zig = .flash2, .llvm = Builder.AddrSpace.avr.program2, .abi = 8 }, + .{ .zig = .flash3, .llvm = Builder.AddrSpace.avr.program3, .abi = 8 }, + .{ .zig = .flash4, .llvm = Builder.AddrSpace.avr.program4, .abi = 8 }, + .{ .zig = .flash5, .llvm = Builder.AddrSpace.avr.program5, .abi = 8 }, }, .wasm32, .wasm64 => &.{ .{ .zig = .generic, .llvm = .default, .force_in_data_layout = true }, @@ -10667,6 +10674,17 @@ fn lowerFnRetTy(o: *Object, fn_info: InternPool.Key.FuncType) Allocator.Error!Bu return o.builder.structType(.normal, &.{ .i64, .i64 }); }, .byval => return o.lowerType(return_type), + .fields => { + var types_len: usize = 0; + var types: [8]Builder.Type = undefined; + for (0..return_type.structFieldCount(mod)) |field_index| { + const field_ty = return_type.structFieldType(field_index, mod); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; + types[types_len] = try o.lowerType(field_ty); + types_len += 1; + } + return o.builder.structType(.normal, types[0..types_len]); + }, } }, // TODO investigate C ABI for other architectures @@ -10880,14 +10898,24 @@ const ParamTypeIterator = struct { .riscv32, .riscv64 => { it.zig_index += 1; it.llvm_index += 1; - if (ty.toIntern() == .f16_type) { - return .as_u16; - } + if (ty.toIntern() == .f16_type and + !std.Target.riscv.featureSetHas(target.cpu.features, .d)) return .as_u16; switch (riscv_c_abi.classifyType(ty, mod)) { .memory => return .byref_mut, .byval => return .byval, .integer => return .abi_sized_int, .double_integer => return Lowering{ .i64_array = 2 }, + .fields => { + it.types_len = 0; + for (0..ty.structFieldCount(mod)) |field_index| { + const field_ty = ty.structFieldType(field_index, mod); + if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; + it.types_buffer[it.types_len] = try it.object.lowerType(field_ty); + it.types_len += 1; + } + it.llvm_index += it.types_len - 1; + return .multiple_llvm_types; + }, } }, // TODO investigate C ABI for other architectures diff --git a/src/codegen/llvm/Builder.zig b/src/codegen/llvm/Builder.zig index 00b3826d7d..e3e1fb5ad9 100644 --- a/src/codegen/llvm/Builder.zig +++ b/src/codegen/llvm/Builder.zig @@ -1873,12 +1873,13 @@ pub const AddrSpace = enum(u24) { // See llvm/lib/Target/AVR/AVR.h pub const avr = struct { - pub const flash: AddrSpace = @enumFromInt(1); - pub const flash1: AddrSpace = @enumFromInt(2); - pub const flash2: AddrSpace = @enumFromInt(3); - pub const flash3: AddrSpace = @enumFromInt(4); - pub const flash4: AddrSpace = @enumFromInt(5); - pub const flash5: AddrSpace = @enumFromInt(6); + pub const data: AddrSpace = @enumFromInt(0); + pub const program: AddrSpace = @enumFromInt(1); + pub const program1: AddrSpace = @enumFromInt(2); + pub const program2: AddrSpace = @enumFromInt(3); + pub const program3: AddrSpace = @enumFromInt(4); + pub const program4: AddrSpace = @enumFromInt(5); + pub const program5: AddrSpace = @enumFromInt(6); }; // See llvm/lib/Target/NVPTX/NVPTX.h @@ -1901,6 +1902,7 @@ pub const AddrSpace = enum(u24) { pub const private: AddrSpace = @enumFromInt(5); pub const constant_32bit: AddrSpace = @enumFromInt(6); pub const buffer_fat_pointer: AddrSpace = @enumFromInt(7); + pub const buffer_resource: AddrSpace = @enumFromInt(8); pub const param_d: AddrSpace = @enumFromInt(6); pub const param_i: AddrSpace = @enumFromInt(7); pub const constant_buffer_0: AddrSpace = @enumFromInt(8); @@ -1921,7 +1923,7 @@ pub const AddrSpace = enum(u24) { pub const constant_buffer_15: AddrSpace = @enumFromInt(23); }; - // See llvm/lib/Target/WebAssembly/Utils/WebAssemblyTypeUtilities.h + // See llvm/include/llvm/CodeGen/WasmAddressSpaces.h pub const wasm = struct { pub const variable: AddrSpace = @enumFromInt(1); pub const externref: AddrSpace = @enumFromInt(10); @@ -7181,7 +7183,6 @@ pub const Constant = enum(u32) { @"and", @"or", xor, - select, @"asm", @"asm sideeffect", @"asm alignstack", @@ -7293,12 +7294,6 @@ pub const Constant = enum(u32) { rhs: Constant, }; - pub const Select = extern struct { - cond: Constant, - lhs: Constant, - rhs: Constant, - }; - pub const Assembly = extern struct { type: Type, assembly: String, @@ -7430,7 +7425,6 @@ pub const Constant = enum(u32) { .@"or", .xor, => builder.constantExtraData(Binary, item.data).lhs.typeOf(builder), - .select => builder.constantExtraData(Select, item.data).lhs.typeOf(builder), .@"asm", .@"asm sideeffect", .@"asm alignstack", @@ -7820,15 +7814,6 @@ pub const Constant = enum(u32) { extra.rhs.fmt(data.builder), }); }, - .select => |tag| { - const extra = data.builder.constantExtraData(Select, item.data); - try writer.print("{s} ({%}, {%}, {%})", .{ - @tagName(tag), - extra.cond.fmt(data.builder), - extra.lhs.fmt(data.builder), - extra.rhs.fmt(data.builder), - }); - }, .@"asm", .@"asm sideeffect", .@"asm alignstack", @@ -9224,20 +9209,6 @@ pub fn binValue(self: *Builder, tag: Constant.Tag, lhs: Constant, rhs: Constant) return (try self.binConst(tag, lhs, rhs)).toValue(); } -pub fn selectConst( - self: *Builder, - cond: Constant, - lhs: Constant, - rhs: Constant, -) Allocator.Error!Constant { - try self.ensureUnusedConstantCapacity(1, Constant.Select, 0); - return self.selectConstAssumeCapacity(cond, lhs, rhs); -} - -pub fn selectValue(self: *Builder, cond: Constant, lhs: Constant, rhs: Constant) Allocator.Error!Value { - return (try self.selectConst(cond, lhs, rhs)).toValue(); -} - pub fn asmConst( self: *Builder, ty: Type, @@ -10125,7 +10096,7 @@ fn arrayTypeAssumeCapacity(self: *Builder, len: u64, child: Type) Type { .data = self.addTypeExtraAssumeCapacity(data), }); if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( - child.toLlvm(self).arrayType(@intCast(len)), + child.toLlvm(self).arrayType2(len), ); } return @enumFromInt(gop.index); @@ -10158,7 +10129,7 @@ fn arrayTypeAssumeCapacity(self: *Builder, len: u64, child: Type) Type { .data = self.addTypeExtraAssumeCapacity(data), }); if (self.useLibLlvm()) self.llvm.types.appendAssumeCapacity( - child.toLlvm(self).arrayType(@intCast(len)), + child.toLlvm(self).arrayType2(len), ); } return @enumFromInt(gop.index); @@ -10823,7 +10794,7 @@ fn arrayConstAssumeCapacity( for (llvm_vals, vals) |*llvm_val, val| llvm_val.* = val.toLlvm(self); self.llvm.constants.appendAssumeCapacity( - type_extra.child.toLlvm(self).constArray(llvm_vals.ptr, @intCast(llvm_vals.len)), + type_extra.child.toLlvm(self).constArray2(llvm_vals.ptr, llvm_vals.len), ); } return result.constant; @@ -11536,42 +11507,6 @@ fn binConstAssumeCapacity( return @enumFromInt(gop.index); } -comptime { - _ = &selectValue; -} - -fn selectConstAssumeCapacity(self: *Builder, cond: Constant, lhs: Constant, rhs: Constant) Constant { - const Adapter = struct { - builder: *const Builder, - pub fn hash(_: @This(), key: Constant.Select) u32 { - return @truncate(std.hash.Wyhash.hash( - std.hash.uint32(@intFromEnum(Constant.Tag.select)), - std.mem.asBytes(&key), - )); - } - pub fn eql(ctx: @This(), lhs_key: Constant.Select, _: void, rhs_index: usize) bool { - if (ctx.builder.constant_items.items(.tag)[rhs_index] != .select) return false; - const rhs_data = ctx.builder.constant_items.items(.data)[rhs_index]; - const rhs_extra = ctx.builder.constantExtraData(Constant.Select, rhs_data); - return std.meta.eql(lhs_key, rhs_extra); - } - }; - const data = Constant.Select{ .cond = cond, .lhs = lhs, .rhs = rhs }; - const gop = self.constant_map.getOrPutAssumeCapacityAdapted(data, Adapter{ .builder = self }); - if (!gop.found_existing) { - gop.key_ptr.* = {}; - gop.value_ptr.* = {}; - self.constant_items.appendAssumeCapacity(.{ - .tag = .select, - .data = self.addConstantExtraAssumeCapacity(data), - }); - if (self.useLibLlvm()) self.llvm.constants.appendAssumeCapacity( - cond.toLlvm(self).constSelect(lhs.toLlvm(self), rhs.toLlvm(self)), - ); - } - return @enumFromInt(gop.index); -} - fn asmConstAssumeCapacity( self: *Builder, ty: Type, diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index 66826caa42..8b3470bbf2 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -238,13 +238,6 @@ pub const Value = opaque { pub const constAddrSpaceCast = LLVMConstAddrSpaceCast; extern fn LLVMConstAddrSpaceCast(ConstantVal: *Value, ToType: *Type) *Value; - pub const constSelect = LLVMConstSelect; - extern fn LLVMConstSelect( - ConstantCondition: *Value, - ConstantIfTrue: *Value, - ConstantIfFalse: *Value, - ) *Value; - pub const constExtractElement = LLVMConstExtractElement; extern fn LLVMConstExtractElement(VectorConstant: *Value, IndexConstant: *Value) *Value; @@ -336,8 +329,8 @@ pub const Type = opaque { pub const constReal = LLVMConstReal; extern fn LLVMConstReal(RealTy: *Type, N: f64) *Value; - pub const constArray = LLVMConstArray; - extern fn LLVMConstArray(ElementTy: *Type, ConstantVals: [*]const *Value, Length: c_uint) *Value; + pub const constArray2 = LLVMConstArray2; + extern fn LLVMConstArray2(ElementTy: *Type, ConstantVals: [*]const *Value, Length: u64) *Value; pub const constNamedStruct = LLVMConstNamedStruct; extern fn LLVMConstNamedStruct( @@ -352,8 +345,8 @@ pub const Type = opaque { pub const getPoison = LLVMGetPoison; extern fn LLVMGetPoison(Ty: *Type) *Value; - pub const arrayType = LLVMArrayType; - extern fn LLVMArrayType(ElementType: *Type, ElementCount: c_uint) *Type; + pub const arrayType2 = LLVMArrayType2; + extern fn LLVMArrayType2(ElementType: *Type, ElementCount: u64) *Type; pub const vectorType = LLVMVectorType; extern fn LLVMVectorType(ElementType: *Type, ElementCount: c_uint) *Type; @@ -1167,6 +1160,7 @@ pub const OSType = enum(c_int) { NetBSD, OpenBSD, Solaris, + UEFI, Win32, ZOS, Haiku, @@ -1191,6 +1185,7 @@ pub const OSType = enum(c_int) { WASI, Emscripten, ShaderModel, + LiteOS, }; pub const ArchType = enum(c_int) { |
