| ... | @@ -2046,27 +2046,69 @@ fn generateNsConstantStringType(ts: *TypeStore, comp: *Compilation) !QualType { | ... | @@ -2046,27 +2046,69 @@ fn generateNsConstantStringType(ts: *TypeStore, comp: *Compilation) !QualType { |
| 2046 | } | 2046 | } |
| 2047 | | 2047 | |
| 2048 | fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { | 2048 | fn 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, // unknown | 2104 | 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, // unknown | 2112 | else => return .void, // unknown |
| 2071 | }; | 2113 | }; |
| 2072 | | 2114 | |
| ... | @@ -2093,6 +2135,87 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { | ... | @@ -2093,6 +2135,87 @@ fn generateVaListType(ts: *TypeStore, comp: *Compilation) !QualType { |
| 2093 | | 2135 | |
| 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)); |
| 2114 | | 2237 | |
| | 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 | }; |