authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-09-26 02:03:58+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-09-26 16:24:59+02:00
loge98630aacf816c5fedb7bb504001584bfa425f6c
tree9b5bb975b735de31c2cd34858482846a1625a2c5
parentd16ff4d049d15b63f1dc7ea84b02734eca5d5bd4
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

aro: TypeStore: synchronize __va_list_tag logic with Zig's std.builtin.VaList

https://github.com/Vexu/arocc/pull/893 closes #25361

1 files changed, 156 insertions(+), 13 deletions(-)

lib/compiler/aro/aro/TypeStore.zig+156-13
...@@ -2046,27 +2046,69 @@ fn generateNsConstantStringType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2046,27 +2046,69 @@ fn generateNsConstantStringType(ts: *TypeStore, comp: *Compilation) !QualType {
2046}2046}
20472047
2048fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {2048fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2049 const Kind = enum { aarch64_va_list, x86_64_va_list };2049 const Kind = enum {
2050 aarch64_va_list,
2051 arm_va_list,
2052 hexagon_va_list,
2053 powerpc_va_list,
2054 s390x_va_list,
2055 x86_64_va_list,
2056 xtensa_va_list,
2057 };
2050 const kind: Kind = switch (comp.target.cpu.arch) {2058 const kind: Kind = switch (comp.target.cpu.arch) {
2059 .amdgcn,
2060 .msp430,
2061 .nvptx,
2062 .nvptx64,
2063 .powerpc64,
2064 .powerpc64le,
2065 .x86,
2066 => return .char_pointer,
2067 .arc,
2068 .avr,
2069 .bpfel,
2070 .bpfeb,
2071 .csky,
2072 .lanai,
2073 .loongarch32,
2074 .loongarch64,
2075 .m68k,
2076 .mips,
2077 .mipsel,
2078 .mips64,
2079 .mips64el,
2080 .riscv32,
2081 .riscv32be,
2082 .riscv64,
2083 .riscv64be,
2084 .sparc,
2085 .sparc64,
2086 .spirv32,
2087 .spirv64,
2088 .ve,
2089 .wasm32,
2090 .wasm64,
2091 .xcore,
2092 => return .void_pointer,
2051 .aarch64, .aarch64_be => switch (comp.target.os.tag) {2093 .aarch64, .aarch64_be => switch (comp.target.os.tag) {
2052 .windows => return .char_pointer,2094 .driverkit, .ios, .macos, .tvos, .visionos, .watchos, .windows => return .char_pointer,
2053 .ios, .macos, .tvos, .watchos => return .char_pointer,
2054 else => .aarch64_va_list,2095 else => .aarch64_va_list,
2055 },2096 },
2056 .arm, .armeb, .thumb, .thumbeb => switch (comp.target.os.tag) {2097 .arm, .armeb, .thumb, .thumbeb => .arm_va_list,
2057 .ios, .macos, .tvos, .watchos, .visionos => return .char_pointer,2098 .hexagon => if (comp.target.abi.isMusl())
2058 else => return .void_pointer,2099 .hexagon_va_list
2059 },2100 else
2060 .sparc, .wasm32, .wasm64, .bpfel, .bpfeb, .riscv32, .riscv64, .avr, .spirv32, .spirv64 => return .void_pointer,2101 return .char_pointer,
2061 .powerpc => switch (comp.target.os.tag) {2102 .powerpc, .powerpcle => switch (comp.target.os.tag) {
2062 .ios, .macos, .tvos, .watchos, .aix => return .char_pointer,2103 .aix => return .char_pointer,
2063 else => return .void, // unknown2104 else => .powerpc_va_list,
2064 },2105 },
2065 .x86, .msp430 => return .char_pointer,2106 .s390x => .s390x_va_list,
2066 .x86_64 => switch (comp.target.os.tag) {2107 .x86_64 => switch (comp.target.os.tag) {
2067 .windows => return .char_pointer,2108 .uefi, .windows => return .char_pointer,
2068 else => .x86_64_va_list,2109 else => .x86_64_va_list,
2069 },2110 },
2111 .xtensa => .xtensa_va_list,
2070 else => return .void, // unknown2112 else => return .void, // unknown
2071 };2113 };
20722114
...@@ -2093,6 +2135,87 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2093,6 +2135,87 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
20932135
2094 break :blk qt;2136 break :blk qt;
2095 },2137 },
2138 .arm_va_list => blk: {
2139 var record: Type.Record = .{
2140 .name = try comp.internString("__va_list_tag"),
2141 .decl_node = undefined, // TODO
2142 .layout = null,
2143 .fields = &.{},
2144 };
2145 const qt = try ts.put(comp.gpa, .{ .@"struct" = record });
2146
2147 var fields: [1]Type.Record.Field = .{
2148 .{ .name = try comp.internString("__ap"), .qt = .void_pointer },
2149 };
2150 record.fields = &fields;
2151 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2152 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
2153
2154 break :blk qt;
2155 },
2156 .hexagon_va_list => blk: {
2157 var record: Type.Record = .{
2158 .name = try comp.internString("__va_list_tag"),
2159 .decl_node = undefined, // TODO
2160 .layout = null,
2161 .fields = &.{},
2162 };
2163 const qt = try ts.put(comp.gpa, .{ .@"struct" = record });
2164
2165 var fields: [4]Type.Record.Field = .{
2166 .{ .name = try comp.internString("__gpr"), .qt = .long },
2167 .{ .name = try comp.internString("__fpr"), .qt = .long },
2168 .{ .name = try comp.internString("__overflow_arg_area"), .qt = .void_pointer },
2169 .{ .name = try comp.internString("__reg_save_area"), .qt = .void_pointer },
2170 };
2171 record.fields = &fields;
2172 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2173 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
2174
2175 break :blk qt;
2176 },
2177 .powerpc_va_list => blk: {
2178 var record: Type.Record = .{
2179 .name = try comp.internString("__va_list_tag"),
2180 .decl_node = undefined, // TODO
2181 .layout = null,
2182 .fields = &.{},
2183 };
2184 const qt = try ts.put(comp.gpa, .{ .@"struct" = record });
2185
2186 var fields: [5]Type.Record.Field = .{
2187 .{ .name = try comp.internString("gpr"), .qt = .uchar },
2188 .{ .name = try comp.internString("fpr"), .qt = .uchar },
2189 .{ .name = try comp.internString("reserved"), .qt = .ushort },
2190 .{ .name = try comp.internString("overflow_arg_area"), .qt = .void_pointer },
2191 .{ .name = try comp.internString("reg_save_area"), .qt = .void_pointer },
2192 };
2193 record.fields = &fields;
2194 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2195 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
2196
2197 break :blk qt;
2198 },
2199 .s390x_va_list => blk: {
2200 var record: Type.Record = .{
2201 .name = try comp.internString("__va_list_tag"),
2202 .decl_node = undefined, // TODO
2203 .layout = null,
2204 .fields = &.{},
2205 };
2206 const qt = try ts.put(comp.gpa, .{ .@"struct" = record });
2207
2208 var fields: [3]Type.Record.Field = .{
2209 .{ .name = try comp.internString("__current_saved_reg_area_pointer"), .qt = .void_pointer },
2210 .{ .name = try comp.internString("__saved_reg_area_end_pointer"), .qt = .void_pointer },
2211 .{ .name = try comp.internString("__overflow_area_pointer"), .qt = .void_pointer },
2212 };
2213 record.fields = &fields;
2214 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2215 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
2216
2217 break :blk qt;
2218 },
2096 .x86_64_va_list => blk: {2219 .x86_64_va_list => blk: {
2097 var record: Type.Record = .{2220 var record: Type.Record = .{
2098 .name = try comp.internString("__va_list_tag"),2221 .name = try comp.internString("__va_list_tag"),
...@@ -2112,6 +2235,26 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {...@@ -2112,6 +2235,26 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType {
2112 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;2235 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2113 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));2236 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
21142237
2238 break :blk qt;
2239 },
2240 .xtensa_va_list => blk: {
2241 var record: Type.Record = .{
2242 .name = try comp.internString("__va_list_tag"),
2243 .decl_node = undefined, // TODO
2244 .layout = null,
2245 .fields = &.{},
2246 };
2247 const qt = try ts.put(comp.gpa, .{ .@"struct" = record });
2248
2249 var fields: [3]Type.Record.Field = .{
2250 .{ .name = try comp.internString("__va_stk"), .qt = .int_pointer },
2251 .{ .name = try comp.internString("__va_reg"), .qt = .int_pointer },
2252 .{ .name = try comp.internString("__va_ndx"), .qt = .int },
2253 };
2254 record.fields = &fields;
2255 record.layout = record_layout.compute(&fields, qt, comp, null) catch unreachable;
2256 try ts.set(comp.gpa, .{ .@"struct" = record }, @intFromEnum(qt._index));
2257
2115 break :blk qt;2258 break :blk qt;
2116 },2259 },
2117 };2260 };