authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-03-16 21:56:00-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2021-03-16 21:56:00-07:00
log4683de1e918c708ded3b111ae43fc702d28b1d52
tree1d1eec82de669cc7f59a05db8069e78c509f61d7
parentc558a1ae26eaa8c59e97e80ec01990e35ef50f3a
parente8aa6f90d6e8c69f3af32942d0ae2bdf44e34783
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #8252 from tadeokondrak/llvm-bool

stage2 llvm bindings: use correct type for LLVMBool for ABI compat

2 files changed, 34 insertions(+), 21 deletions(-)

src/codegen/llvm.zig+11-11
......@@ -219,7 +219,7 @@ pub const LLVMIRModule = struct {
219219
220220 var error_message: [*:0]const u8 = undefined;
221221 var target: *const llvm.Target = undefined;
222 if (llvm.Target.getFromTriple(llvm_target_triple.ptr, &target, &error_message)) {
222 if (llvm.Target.getFromTriple(llvm_target_triple.ptr, &target, &error_message).toBool()) {
223223 defer llvm.disposeMessage(error_message);
224224
225225 const stderr = std.io.getStdErr().writer();
......@@ -303,7 +303,7 @@ pub const LLVMIRModule = struct {
303303 // verifyModule always allocs the error_message even if there is no error
304304 defer llvm.disposeMessage(error_message);
305305
306 if (self.llvm_module.verify(.ReturnStatus, &error_message)) {
306 if (self.llvm_module.verify(.ReturnStatus, &error_message).toBool()) {
307307 const stderr = std.io.getStdErr().writer();
308308 try stderr.print("broken LLVM module found: {s}\nThis is a bug in the Zig compiler.", .{error_message});
309309 return error.BrokenLLVMModule;
......@@ -319,7 +319,7 @@ pub const LLVMIRModule = struct {
319319 object_pathZ.ptr,
320320 .ObjectFile,
321321 &error_message,
322 )) {
322 ).toBool()) {
323323 defer llvm.disposeMessage(error_message);
324324
325325 const stderr = std.io.getStdErr().writer();
......@@ -614,7 +614,7 @@ pub const LLVMIRModule = struct {
614614
615615 var indices: [2]*const llvm.Value = .{
616616 index_type.constNull(),
617 index_type.constInt(1, false),
617 index_type.constInt(1, .False),
618618 };
619619
620620 return self.builder.buildLoad(self.builder.buildInBoundsGEP(operand, &indices, 2, ""), "");
......@@ -676,7 +676,7 @@ pub const LLVMIRModule = struct {
676676 const signed = inst.base.ty.isSignedInt();
677677 // TODO: Should we use intcast here or just a simple bitcast?
678678 // LLVM does truncation vs bitcast (+signed extension) in the intcast depending on the sizes
679 return self.builder.buildIntCast2(val, try self.getLLVMType(inst.base.ty, inst.base.src), signed, "");
679 return self.builder.buildIntCast2(val, try self.getLLVMType(inst.base.ty, inst.base.src), llvm.Bool.fromBool(signed), "");
680680 }
681681
682682 fn genBitCast(self: *LLVMIRModule, inst: *Inst.UnOp) !?*const llvm.Value {
......@@ -782,7 +782,7 @@ pub const LLVMIRModule = struct {
782782 if (bigint.limbs.len != 1) {
783783 return self.fail(src, "TODO implement bigger bigint", .{});
784784 }
785 const llvm_int = llvm_type.constInt(bigint.limbs[0], false);
785 const llvm_int = llvm_type.constInt(bigint.limbs[0], .False);
786786 if (!bigint.positive) {
787787 return llvm.constNeg(llvm_int);
788788 }
......@@ -820,7 +820,7 @@ pub const LLVMIRModule = struct {
820820 return self.fail(src, "TODO handle other sentinel values", .{});
821821 } else false;
822822
823 return self.context.constString(payload.data.ptr, @intCast(c_uint, payload.data.len), !zero_sentinel);
823 return self.context.constString(payload.data.ptr, @intCast(c_uint, payload.data.len), llvm.Bool.fromBool(!zero_sentinel));
824824 } else {
825825 return self.fail(src, "TODO handle more array values", .{});
826826 }
......@@ -836,13 +836,13 @@ pub const LLVMIRModule = struct {
836836 llvm_child_type.constNull(),
837837 self.context.intType(1).constNull(),
838838 };
839 return self.context.constStruct(&optional_values, 2, false);
839 return self.context.constStruct(&optional_values, 2, .False);
840840 } else {
841841 var optional_values: [2]*const llvm.Value = .{
842842 try self.genTypedValue(src, .{ .ty = child_type, .val = tv.val }),
843843 self.context.intType(1).constAllOnes(),
844844 };
845 return self.context.constStruct(&optional_values, 2, false);
845 return self.context.constStruct(&optional_values, 2, .False);
846846 }
847847 } else {
848848 return self.fail(src, "TODO implement const of optional pointer", .{});
......@@ -882,7 +882,7 @@ pub const LLVMIRModule = struct {
882882 try self.getLLVMType(child_type, src),
883883 self.context.intType(1),
884884 };
885 return self.context.structType(&optional_types, 2, false);
885 return self.context.structType(&optional_types, 2, .False);
886886 } else {
887887 return self.fail(src, "TODO implement optional pointers as actual pointers", .{});
888888 }
......@@ -934,7 +934,7 @@ pub const LLVMIRModule = struct {
934934 try self.getLLVMType(return_type, src),
935935 if (fn_param_len == 0) null else llvm_param.ptr,
936936 @intCast(c_uint, fn_param_len),
937 false,
937 .False,
938938 );
939939 const llvm_fn = self.llvm_module.addFunction(func.name, fn_type);
940940
src/codegen/llvm/bindings.zig+23-10
......@@ -1,7 +1,20 @@
11//! We do this instead of @cImport because the self-hosted compiler is easier
22//! to bootstrap if it does not depend on translate-c.
33
4const LLVMBool = bool;
4/// Do not compare directly to .True, use toBool() instead.
5pub const Bool = enum(c_int) {
6 False,
7 True,
8 _,
9
10 pub fn fromBool(b: bool) Bool {
11 return @intToEnum(Bool, @boolToInt(b));
12 }
13
14 pub fn toBool(b: Bool) bool {
15 return b != .False;
16 }
17};
518pub const AttributeIndex = c_uint;
619
720/// Make sure to use the *InContext functions instead of the global ones.
......@@ -22,13 +35,13 @@ pub const Context = opaque {
2235 extern fn LLVMVoidTypeInContext(C: *const Context) *const Type;
2336
2437 pub const structType = LLVMStructTypeInContext;
25 extern fn LLVMStructTypeInContext(C: *const Context, ElementTypes: [*]*const Type, ElementCount: c_uint, Packed: LLVMBool) *const Type;
38 extern fn LLVMStructTypeInContext(C: *const Context, ElementTypes: [*]*const Type, ElementCount: c_uint, Packed: Bool) *const Type;
2639
2740 pub const constString = LLVMConstStringInContext;
28 extern fn LLVMConstStringInContext(C: *const Context, Str: [*]const u8, Length: c_uint, DontNullTerminate: LLVMBool) *const Value;
41 extern fn LLVMConstStringInContext(C: *const Context, Str: [*]const u8, Length: c_uint, DontNullTerminate: Bool) *const Value;
2942
3043 pub const constStruct = LLVMConstStructInContext;
31 extern fn LLVMConstStructInContext(C: *const Context, ConstantVals: [*]*const Value, Count: c_uint, Packed: LLVMBool) *const Value;
44 extern fn LLVMConstStructInContext(C: *const Context, ConstantVals: [*]*const Value, Count: c_uint, Packed: Bool) *const Value;
3245
3346 pub const createBasicBlock = LLVMCreateBasicBlockInContext;
3447 extern fn LLVMCreateBasicBlockInContext(C: *const Context, Name: [*:0]const u8) *const BasicBlock;
......@@ -59,7 +72,7 @@ pub const Value = opaque {
5972
6073pub const Type = opaque {
6174 pub const functionType = LLVMFunctionType;
62 extern fn LLVMFunctionType(ReturnType: *const Type, ParamTypes: ?[*]*const Type, ParamCount: c_uint, IsVarArg: LLVMBool) *const Type;
75 extern fn LLVMFunctionType(ReturnType: *const Type, ParamTypes: ?[*]*const Type, ParamCount: c_uint, IsVarArg: Bool) *const Type;
6376
6477 pub const constNull = LLVMConstNull;
6578 extern fn LLVMConstNull(Ty: *const Type) *const Value;
......@@ -68,7 +81,7 @@ pub const Type = opaque {
6881 extern fn LLVMConstAllOnes(Ty: *const Type) *const Value;
6982
7083 pub const constInt = LLVMConstInt;
71 extern fn LLVMConstInt(IntTy: *const Type, N: c_ulonglong, SignExtend: LLVMBool) *const Value;
84 extern fn LLVMConstInt(IntTy: *const Type, N: c_ulonglong, SignExtend: Bool) *const Value;
7285
7386 pub const constArray = LLVMConstArray;
7487 extern fn LLVMConstArray(ElementTy: *const Type, ConstantVals: ?[*]*const Value, Length: c_uint) *const Value;
......@@ -91,7 +104,7 @@ pub const Module = opaque {
91104 extern fn LLVMDisposeModule(*const Module) void;
92105
93106 pub const verify = LLVMVerifyModule;
94 extern fn LLVMVerifyModule(*const Module, Action: VerifierFailureAction, OutMessage: *[*:0]const u8) LLVMBool;
107 extern fn LLVMVerifyModule(*const Module, Action: VerifierFailureAction, OutMessage: *[*:0]const u8) Bool;
95108
96109 pub const addFunction = LLVMAddFunction;
97110 extern fn LLVMAddFunction(*const Module, Name: [*:0]const u8, FunctionTy: *const Type) *const Value;
......@@ -191,7 +204,7 @@ pub const Builder = opaque {
191204 extern fn LLVMBuildNUWSub(*const Builder, LHS: *const Value, RHS: *const Value, Name: [*:0]const u8) *const Value;
192205
193206 pub const buildIntCast2 = LLVMBuildIntCast2;
194 extern fn LLVMBuildIntCast2(*const Builder, Val: *const Value, DestTy: *const Type, IsSigned: LLVMBool, Name: [*:0]const u8) *const Value;
207 extern fn LLVMBuildIntCast2(*const Builder, Val: *const Value, DestTy: *const Type, IsSigned: Bool, Name: [*:0]const u8) *const Value;
195208
196209 pub const buildBitCast = LLVMBuildBitCast;
197210 extern fn LLVMBuildBitCast(*const Builder, Val: *const Value, DestTy: *const Type, Name: [*:0]const u8) *const Value;
......@@ -258,7 +271,7 @@ pub const TargetMachine = opaque {
258271 Filename: [*:0]const u8,
259272 codegen: CodeGenFileType,
260273 ErrorMessage: *[*:0]const u8,
261 ) LLVMBool;
274 ) Bool;
262275};
263276
264277pub const CodeMode = extern enum {
......@@ -295,7 +308,7 @@ pub const CodeGenFileType = extern enum {
295308
296309pub const Target = opaque {
297310 pub const getFromTriple = LLVMGetTargetFromTriple;
298 extern fn LLVMGetTargetFromTriple(Triple: [*:0]const u8, T: **const Target, ErrorMessage: *[*:0]const u8) LLVMBool;
311 extern fn LLVMGetTargetFromTriple(Triple: [*:0]const u8, T: **const Target, ErrorMessage: *[*:0]const u8) Bool;
299312};
300313
301314extern fn LLVMInitializeAArch64TargetInfo() void;