diff options
Diffstat (limited to 'src/codegen')
| -rw-r--r-- | src/codegen/llvm.zig | 95 | ||||
| -rw-r--r-- | src/codegen/llvm/bindings.zig | 30 |
2 files changed, 95 insertions, 30 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index b28c371466..1e190a53d0 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -7,6 +7,7 @@ const link = @import("../link.zig"); const log = std.log.scoped(.codegen); const math = std.math; +const build_options = @import("build_options"); const Module = @import("../Module.zig"); const TypedValue = @import("../TypedValue.zig"); const Zir = @import("../Zir.zig"); @@ -31,6 +32,7 @@ pub fn targetTriple(allocator: *Allocator, target: std.Target) ![:0]u8 { .bpfeb => "bpfeb", .csky => "csky", .hexagon => "hexagon", + .m68k => "m68k", .mips => "mips", .mipsel => "mipsel", .mips64 => "mips64", @@ -140,6 +142,7 @@ pub fn targetTriple(allocator: *Allocator, target: std.Target) ![:0]u8 { .musl => "musl", .musleabi => "musleabi", .musleabihf => "musleabihf", + .muslx32 => "muslx32", .msvc => "msvc", .itanium => "itanium", .cygnus => "cygnus", @@ -1548,6 +1551,7 @@ pub const FuncGen = struct { llvm.Bool.fromBool(is_volatile), .False, .ATT, + .False, ); return self.builder.buildCall( asm_fn, @@ -2024,17 +2028,15 @@ pub const FuncGen = struct { new_value = self.builder.buildZExt(new_value, abi_ty, ""); } } - const success_order = toLlvmAtomicOrdering(extra.successOrder()); - const failure_order = toLlvmAtomicOrdering(extra.failureOrder()); - const result = self.builder.buildCmpXchg( + const result = self.builder.buildAtomicCmpXchg( ptr, expected_value, new_value, - success_order, - failure_order, - is_weak, - self.single_threaded, + toLlvmAtomicOrdering(extra.successOrder()), + toLlvmAtomicOrdering(extra.failureOrder()), + llvm.Bool.fromBool(self.single_threaded), ); + result.setWeak(llvm.Bool.fromBool(is_weak)); const optional_ty = self.air.typeOfIndex(inst); var buffer: Type.Payload.ElemType = undefined; @@ -2083,7 +2085,7 @@ fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { llvm.LLVMInitializeAMDGPUAsmPrinter(); llvm.LLVMInitializeAMDGPUAsmParser(); }, - .arm, .armeb => { + .thumb, .thumbeb, .arm, .armeb => { llvm.LLVMInitializeARMTarget(); llvm.LLVMInitializeARMTargetInfo(); llvm.LLVMInitializeARMTargetMC(); @@ -2186,25 +2188,66 @@ fn initializeLLVMTarget(arch: std.Target.Cpu.Arch) void { llvm.LLVMInitializeXCoreTargetInfo(); llvm.LLVMInitializeXCoreTargetMC(); llvm.LLVMInitializeXCoreAsmPrinter(); - // There is no LLVMInitializeXCoreAsmParser function available. + // There is no LLVMInitializeXCoreAsmParser function. + }, + .m68k => { + if (build_options.llvm_has_m68k) { + llvm.LLVMInitializeM68kTarget(); + llvm.LLVMInitializeM68kTargetInfo(); + llvm.LLVMInitializeM68kTargetMC(); + llvm.LLVMInitializeM68kAsmPrinter(); + llvm.LLVMInitializeM68kAsmParser(); + } + }, + .csky => { + if (build_options.llvm_has_csky) { + llvm.LLVMInitializeCSKYTarget(); + llvm.LLVMInitializeCSKYTargetInfo(); + llvm.LLVMInitializeCSKYTargetMC(); + // There is no LLVMInitializeCSKYAsmPrinter function. + llvm.LLVMInitializeCSKYAsmParser(); + } }, - .arc => {}, - .csky => {}, - .r600 => {}, - .tce, .tcele => {}, - .thumb, .thumbeb => {}, - .le32, .le64 => {}, - .amdil, .amdil64 => {}, - .hsail, .hsail64 => {}, - .spir, .spir64 => {}, - .kalimba => {}, - .shave => {}, - .renderscript32 => {}, - .renderscript64 => {}, - .ve => {}, - .spu_2 => {}, - .spirv32 => {}, - .spirv64 => {}, + .ve => { + if (build_options.llvm_has_ve) { + llvm.LLVMInitializeVETarget(); + llvm.LLVMInitializeVETargetInfo(); + llvm.LLVMInitializeVETargetMC(); + llvm.LLVMInitializeVEAsmPrinter(); + llvm.LLVMInitializeVEAsmParser(); + } + }, + .arc => { + if (build_options.llvm_has_arc) { + llvm.LLVMInitializeARCTarget(); + llvm.LLVMInitializeARCTargetInfo(); + llvm.LLVMInitializeARCTargetMC(); + llvm.LLVMInitializeARCAsmPrinter(); + // There is no LLVMInitializeARCAsmParser function. + } + }, + + // LLVM backends that have no initialization functions. + .tce, + .tcele, + .r600, + .le32, + .le64, + .amdil, + .amdil64, + .hsail, + .hsail64, + .shave, + .spir, + .spir64, + .kalimba, + .renderscript32, + .renderscript64, + => {}, + + .spu_2 => unreachable, // LLVM does not support this backend + .spirv32 => unreachable, // LLVM does not support this backend + .spirv64 => unreachable, // LLVM does not support this backend } } diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig index b4bd91708d..1e6201a42a 100644 --- a/src/codegen/llvm/bindings.zig +++ b/src/codegen/llvm/bindings.zig @@ -133,6 +133,9 @@ pub const Value = opaque { pub const constIntToPtr = LLVMConstIntToPtr; extern fn LLVMConstIntToPtr(ConstantVal: *const Value, ToType: *const Type) *const Value; + + pub const setWeak = LLVMSetWeak; + extern fn LLVMSetWeak(CmpXchgInst: *const Value, IsWeak: Bool) void; }; pub const Type = opaque { @@ -259,6 +262,7 @@ extern fn LLVMGetInlineAsm( HasSideEffects: Bool, IsAlignStack: Bool, Dialect: InlineAsmDialect, + CanThrow: Bool, ) *const Value; pub const functionType = LLVMFunctionType; @@ -502,16 +506,15 @@ pub const Builder = opaque { Name: [*:0]const u8, ) *const Value; - pub const buildCmpXchg = ZigLLVMBuildCmpXchg; - extern fn ZigLLVMBuildCmpXchg( + pub const buildAtomicCmpXchg = LLVMBuildAtomicCmpXchg; + extern fn LLVMBuildAtomicCmpXchg( builder: *const Builder, ptr: *const Value, cmp: *const Value, new_val: *const Value, success_ordering: AtomicOrdering, failure_ordering: AtomicOrdering, - is_weak: bool, - is_single_threaded: bool, + is_single_threaded: Bool, ) *const Value; pub const buildSelect = LLVMBuildSelect; @@ -660,6 +663,10 @@ pub extern fn LLVMInitializeSystemZTargetInfo() void; pub extern fn LLVMInitializeWebAssemblyTargetInfo() void; pub extern fn LLVMInitializeX86TargetInfo() void; pub extern fn LLVMInitializeXCoreTargetInfo() void; +pub extern fn LLVMInitializeM68kTargetInfo() void; +pub extern fn LLVMInitializeCSKYTargetInfo() void; +pub extern fn LLVMInitializeVETargetInfo() void; +pub extern fn LLVMInitializeARCTargetInfo() void; pub extern fn LLVMInitializeAArch64Target() void; pub extern fn LLVMInitializeAMDGPUTarget() void; @@ -678,6 +685,10 @@ pub extern fn LLVMInitializeSystemZTarget() void; pub extern fn LLVMInitializeWebAssemblyTarget() void; pub extern fn LLVMInitializeX86Target() void; pub extern fn LLVMInitializeXCoreTarget() void; +pub extern fn LLVMInitializeM68kTarget() void; +pub extern fn LLVMInitializeVETarget() void; +pub extern fn LLVMInitializeCSKYTarget() void; +pub extern fn LLVMInitializeARCTarget() void; pub extern fn LLVMInitializeAArch64TargetMC() void; pub extern fn LLVMInitializeAMDGPUTargetMC() void; @@ -696,6 +707,10 @@ pub extern fn LLVMInitializeSystemZTargetMC() void; pub extern fn LLVMInitializeWebAssemblyTargetMC() void; pub extern fn LLVMInitializeX86TargetMC() void; pub extern fn LLVMInitializeXCoreTargetMC() void; +pub extern fn LLVMInitializeM68kTargetMC() void; +pub extern fn LLVMInitializeCSKYTargetMC() void; +pub extern fn LLVMInitializeVETargetMC() void; +pub extern fn LLVMInitializeARCTargetMC() void; pub extern fn LLVMInitializeAArch64AsmPrinter() void; pub extern fn LLVMInitializeAMDGPUAsmPrinter() void; @@ -714,6 +729,9 @@ pub extern fn LLVMInitializeSystemZAsmPrinter() void; pub extern fn LLVMInitializeWebAssemblyAsmPrinter() void; pub extern fn LLVMInitializeX86AsmPrinter() void; pub extern fn LLVMInitializeXCoreAsmPrinter() void; +pub extern fn LLVMInitializeM68kAsmPrinter() void; +pub extern fn LLVMInitializeVEAsmPrinter() void; +pub extern fn LLVMInitializeARCAsmPrinter() void; pub extern fn LLVMInitializeAArch64AsmParser() void; pub extern fn LLVMInitializeAMDGPUAsmParser() void; @@ -730,6 +748,9 @@ pub extern fn LLVMInitializeSparcAsmParser() void; pub extern fn LLVMInitializeSystemZAsmParser() void; pub extern fn LLVMInitializeWebAssemblyAsmParser() void; pub extern fn LLVMInitializeX86AsmParser() void; +pub extern fn LLVMInitializeM68kAsmParser() void; +pub extern fn LLVMInitializeCSKYAsmParser() void; +pub extern fn LLVMInitializeVEAsmParser() void; extern fn ZigLLDLinkCOFF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool) c_int; extern fn ZigLLDLinkELF(argc: c_int, argv: [*:null]const ?[*:0]const u8, can_exit_early: bool) c_int; @@ -809,6 +830,7 @@ pub const ArchType = enum(c_int) { bpfeb, csky, hexagon, + m68k, mips, mipsel, mips64, |
