aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/llvm.zig
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-05-22 11:30:52 +0200
committerJakub Konka <kubkon@jakubkonka.com>2022-05-22 22:31:41 +0200
commitcbefd354a662800c5bc662773146ce978631f717 (patch)
tree1f5bf963940028b12f347f3851dedb2517b7d79c /src/codegen/llvm.zig
parente306d04473818ac8b58779aa1ff20b12edb8e94a (diff)
downloadzig-cbefd354a662800c5bc662773146ce978631f717.tar.gz
zig-cbefd354a662800c5bc662773146ce978631f717.zip
Bump support macOS versions; clean up allocs in llvm.targetTriple
Diffstat (limited to 'src/codegen/llvm.zig')
-rw-r--r--src/codegen/llvm.zig134
1 files changed, 62 insertions, 72 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 452bb9b497..6de001e5fd 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -26,6 +26,9 @@ const x86_64_abi = @import("../arch/x86_64/abi.zig");
const Error = error{ OutOfMemory, CodegenFail };
pub fn targetTriple(allocator: Allocator, target: std.Target) ![:0]u8 {
+ var llvm_triple = std.ArrayList(u8).init(allocator);
+ defer llvm_triple.deinit();
+
const llvm_arch = switch (target.cpu.arch) {
.arm => "arm",
.armeb => "armeb",
@@ -85,78 +88,64 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![:0]u8 {
.spirv32 => return error.@"LLVM backend does not support SPIR-V",
.spirv64 => return error.@"LLVM backend does not support SPIR-V",
};
-
- var arena = std.heap.ArenaAllocator.init(allocator);
- defer arena.deinit();
-
- const llvm_os = blk: {
- if (target.os.tag.isDarwin()) {
- const min_version = target.os.version_range.semver.min;
- const llvm_os = switch (target.os.tag) {
- .macos => "macosx",
- .ios => "ios",
- .tvos => "tvos",
- .watchos => "watchos",
- else => unreachable,
- };
- break :blk try std.fmt.allocPrintZ(arena.allocator(), "{s}{d}.{d}.{d}", .{
- llvm_os,
- min_version.major,
- min_version.minor,
- min_version.patch,
- });
- }
-
- const llvm_os = switch (target.os.tag) {
- .freestanding => "unknown",
- .ananas => "ananas",
- .cloudabi => "cloudabi",
- .dragonfly => "dragonfly",
- .freebsd => "freebsd",
- .fuchsia => "fuchsia",
- .kfreebsd => "kfreebsd",
- .linux => "linux",
- .lv2 => "lv2",
- .netbsd => "netbsd",
- .openbsd => "openbsd",
- .solaris => "solaris",
- .windows => "windows",
- .zos => "zos",
- .haiku => "haiku",
- .minix => "minix",
- .rtems => "rtems",
- .nacl => "nacl",
- .aix => "aix",
- .cuda => "cuda",
- .nvcl => "nvcl",
- .amdhsa => "amdhsa",
- .ps4 => "ps4",
- .elfiamcu => "elfiamcu",
- .mesa3d => "mesa3d",
- .contiki => "contiki",
- .amdpal => "amdpal",
- .hermit => "hermit",
- .hurd => "hurd",
- .wasi => "wasi",
- .emscripten => "emscripten",
- .uefi => "windows",
-
- .opencl,
- .glsl450,
- .vulkan,
- .plan9,
- .other,
- => "unknown",
-
- .macos,
- .ios,
- .tvos,
- .watchos,
- => unreachable,
- };
-
- break :blk llvm_os;
+ try llvm_triple.appendSlice(llvm_arch);
+ try llvm_triple.appendSlice("-unknown-");
+
+ const llvm_os = switch (target.os.tag) {
+ .freestanding => "unknown",
+ .ananas => "ananas",
+ .cloudabi => "cloudabi",
+ .dragonfly => "dragonfly",
+ .freebsd => "freebsd",
+ .fuchsia => "fuchsia",
+ .kfreebsd => "kfreebsd",
+ .linux => "linux",
+ .lv2 => "lv2",
+ .netbsd => "netbsd",
+ .openbsd => "openbsd",
+ .solaris => "solaris",
+ .windows => "windows",
+ .zos => "zos",
+ .haiku => "haiku",
+ .minix => "minix",
+ .rtems => "rtems",
+ .nacl => "nacl",
+ .aix => "aix",
+ .cuda => "cuda",
+ .nvcl => "nvcl",
+ .amdhsa => "amdhsa",
+ .ps4 => "ps4",
+ .elfiamcu => "elfiamcu",
+ .mesa3d => "mesa3d",
+ .contiki => "contiki",
+ .amdpal => "amdpal",
+ .hermit => "hermit",
+ .hurd => "hurd",
+ .wasi => "wasi",
+ .emscripten => "emscripten",
+ .uefi => "windows",
+ .macos => "macosx",
+ .ios => "ios",
+ .tvos => "tvos",
+ .watchos => "watchos",
+ .opencl,
+ .glsl450,
+ .vulkan,
+ .plan9,
+ .other,
+ => "unknown",
};
+ try llvm_triple.appendSlice(llvm_os);
+
+ if (target.os.tag.isDarwin()) {
+ const min_version = target.os.version_range.semver.min;
+ try llvm_triple.writer().print("{d}.{d}.{d}", .{
+ min_version.major,
+ min_version.minor,
+ min_version.patch,
+ });
+ }
+ try llvm_triple.append('-');
const llvm_abi = switch (target.abi) {
.none => "unknown",
@@ -182,8 +171,9 @@ pub fn targetTriple(allocator: Allocator, target: std.Target) ![:0]u8 {
.simulator => "simulator",
.macabi => "macabi",
};
+ try llvm_triple.appendSlice(llvm_abi);
- return std.fmt.allocPrintZ(allocator, "{s}-unknown-{s}-{s}", .{ llvm_arch, llvm_os, llvm_abi });
+ return llvm_triple.toOwnedSliceSentinel(0);
}
pub const Object = struct {