aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-08-05 19:15:59 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-08-05 19:19:19 -0700
commitc03a04a58942446b48e9294df991a17a3a6f7b48 (patch)
tree9e306df81d9c1443bee81ccc499d76f620e23923 /src/codegen
parente9e3a2994696a3131125ebc4b1f0eec7ca5306d9 (diff)
downloadzig-c03a04a58942446b48e9294df991a17a3a6f7b48.tar.gz
zig-c03a04a58942446b48e9294df991a17a3a6f7b48.zip
stage2: return type expressions of generic functions
* ZIR encoding for function instructions have a body for the return type. This lets Sema for generic functions do the same thing it does for parameters, handling `error.GenericPoison` in the evaluation of the return type by marking the function as generic. * Sema: fix missing block around the new Decl arena finalization. This led to a memory corruption. * Added some floating point support to the LLVM backend but didn't get far enough to pass any new tests.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig16
-rw-r--r--src/codegen/llvm/bindings.zig18
2 files changed, 33 insertions, 1 deletions
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 0e73469687..91b48ffcfb 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -575,6 +575,14 @@ pub const DeclGen = struct {
const info = t.intInfo(self.module.getTarget());
return self.context.intType(info.bits);
},
+ .Float => switch (t.floatBits(self.module.getTarget())) {
+ 16 => return self.context.halfType(),
+ 32 => return self.context.floatType(),
+ 64 => return self.context.doubleType(),
+ 80 => return self.context.x86FP80Type(),
+ 128 => return self.context.fp128Type(),
+ else => unreachable,
+ },
.Bool => return self.context.intType(1),
.Pointer => {
if (t.isSlice()) {
@@ -661,7 +669,6 @@ pub const DeclGen = struct {
.BoundFn => @panic("TODO remove BoundFn from the language"),
- .Float,
.Enum,
.Union,
.Opaque,
@@ -699,6 +706,13 @@ pub const DeclGen = struct {
}
return llvm_int;
},
+ .Float => {
+ if (tv.ty.floatBits(self.module.getTarget()) <= 64) {
+ const llvm_ty = try self.llvmType(tv.ty);
+ return llvm_ty.constReal(tv.val.toFloat(f64));
+ }
+ return self.todo("bitcast to f128 from an integer", .{});
+ },
.Pointer => switch (tv.val.tag()) {
.decl_ref => {
if (tv.ty.isSlice()) {
diff --git a/src/codegen/llvm/bindings.zig b/src/codegen/llvm/bindings.zig
index 4af3cadd84..675c5539fb 100644
--- a/src/codegen/llvm/bindings.zig
+++ b/src/codegen/llvm/bindings.zig
@@ -31,6 +31,21 @@ pub const Context = opaque {
pub const intType = LLVMIntTypeInContext;
extern fn LLVMIntTypeInContext(C: *const Context, NumBits: c_uint) *const Type;
+ pub const halfType = LLVMHalfTypeInContext;
+ extern fn LLVMHalfTypeInContext(C: *const Context) *const Type;
+
+ pub const floatType = LLVMFloatTypeInContext;
+ extern fn LLVMFloatTypeInContext(C: *const Context) *const Type;
+
+ pub const doubleType = LLVMDoubleTypeInContext;
+ extern fn LLVMDoubleTypeInContext(C: *const Context) *const Type;
+
+ pub const x86FP80Type = LLVMX86FP80TypeInContext;
+ extern fn LLVMX86FP80TypeInContext(C: *const Context) *const Type;
+
+ pub const fp128Type = LLVMFP128TypeInContext;
+ extern fn LLVMFP128TypeInContext(C: *const Context) *const Type;
+
pub const voidType = LLVMVoidTypeInContext;
extern fn LLVMVoidTypeInContext(C: *const Context) *const Type;
@@ -127,6 +142,9 @@ pub const Type = opaque {
pub const constInt = LLVMConstInt;
extern fn LLVMConstInt(IntTy: *const Type, N: c_ulonglong, SignExtend: Bool) *const Value;
+ pub const constReal = LLVMConstReal;
+ extern fn LLVMConstReal(RealTy: *const Type, N: f64) *const Value;
+
pub const constArray = LLVMConstArray;
extern fn LLVMConstArray(ElementTy: *const Type, ConstantVals: [*]*const Value, Length: c_uint) *const Value;