59 lines
2.1 KiB
Zig
59 lines
2.1 KiB
Zig
const std = @import("std");
|
|
const Target = std.Target;
|
|
const llvm = @import("llvm.zig");
|
|
|
|
pub fn getDarwinArchString(self: Target) [:0]const u8 {
|
|
const arch = self.getArch();
|
|
switch (arch) {
|
|
.aarch64 => return "arm64",
|
|
.thumb,
|
|
.arm,
|
|
=> return "arm",
|
|
.powerpc => return "ppc",
|
|
.powerpc64 => return "ppc64",
|
|
.powerpc64le => return "ppc64le",
|
|
// @tagName should be able to return sentinel terminated slice
|
|
else => @panic("TODO https://github.com/ziglang/zig/issues/3779"), //return @tagName(arch),
|
|
}
|
|
}
|
|
|
|
pub fn llvmTargetFromTriple(triple: std.Buffer) !*llvm.Target {
|
|
var result: *llvm.Target = undefined;
|
|
var err_msg: [*:0]u8 = undefined;
|
|
if (llvm.GetTargetFromTriple(triple.toSlice(), &result, &err_msg) != 0) {
|
|
std.debug.warn("triple: {s} error: {s}\n", .{ triple.toSlice(), err_msg });
|
|
return error.UnsupportedTarget;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
pub fn initializeAllTargets() void {
|
|
llvm.InitializeAllTargets();
|
|
llvm.InitializeAllTargetInfos();
|
|
llvm.InitializeAllTargetMCs();
|
|
llvm.InitializeAllAsmPrinters();
|
|
llvm.InitializeAllAsmParsers();
|
|
}
|
|
|
|
pub fn getTriple(allocator: *std.mem.Allocator, self: std.Target) !std.Buffer {
|
|
var result = try std.Buffer.initSize(allocator, 0);
|
|
errdefer result.deinit();
|
|
|
|
// LLVM WebAssembly output support requires the target to be activated at
|
|
// build type with -DCMAKE_LLVM_EXPIERMENTAL_TARGETS_TO_BUILD=WebAssembly.
|
|
//
|
|
// LLVM determines the output format based on the abi suffix,
|
|
// defaulting to an object based on the architecture. The default format in
|
|
// LLVM 6 sets the wasm arch output incorrectly to ELF. We need to
|
|
// explicitly set this ourself in order for it to work.
|
|
//
|
|
// This is fixed in LLVM 7 and you will be able to get wasm output by
|
|
// using the target triple `wasm32-unknown-unknown-unknown`.
|
|
const env_name = if (self.isWasm()) "wasm" else @tagName(self.getAbi());
|
|
|
|
var out = &std.io.BufferOutStream.init(&result).stream;
|
|
try out.print("{}-unknown-{}-{}", .{ @tagName(self.getArch()), @tagName(self.getOs()), env_name });
|
|
|
|
return result;
|
|
}
|