aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig52
-rw-r--r--src/codegen/llvm/Builder.zig89
-rw-r--r--src/codegen/llvm/bindings.zig17
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) {