authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-10 19:52:03+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-03-10 19:52:03+02:00
log673fafc23142b0bdc467efcb8554cd4e70bba17b
treea10668eb6404339839ad51897f51738fabd8bfb3
parente0fb0770d1012e1a5afba947ba96dc53fe2ca45c

stage2 llvm: implement lowerParentPtr for int_{u,i}64


1 files changed, 25 insertions(+), 7 deletions(-)

src/codegen/llvm.zig+25-7
...@@ -1472,12 +1472,12 @@ pub const DeclGen = struct {...@@ -1472,12 +1472,12 @@ pub const DeclGen = struct {
1472 return llvm_int.constIntToPtr(try dg.llvmType(tv.ty));1472 return llvm_int.constIntToPtr(try dg.llvmType(tv.ty));
1473 },1473 },
1474 .field_ptr, .opt_payload_ptr, .eu_payload_ptr => {1474 .field_ptr, .opt_payload_ptr, .eu_payload_ptr => {
1475 const parent = try dg.lowerParentPtr(tv.val);1475 const parent = try dg.lowerParentPtr(tv.val, tv.ty);
1476 return parent.llvm_ptr.constBitCast(try dg.llvmType(tv.ty));1476 return parent.llvm_ptr.constBitCast(try dg.llvmType(tv.ty));
1477 },1477 },
1478 .elem_ptr => {1478 .elem_ptr => {
1479 const elem_ptr = tv.val.castTag(.elem_ptr).?.data;1479 const elem_ptr = tv.val.castTag(.elem_ptr).?.data;
1480 const parent = try dg.lowerParentPtr(elem_ptr.array_ptr);1480 const parent = try dg.lowerParentPtr(elem_ptr.array_ptr, tv.ty);
1481 const llvm_usize = try dg.llvmType(Type.usize);1481 const llvm_usize = try dg.llvmType(Type.usize);
1482 if (parent.llvm_ptr.typeOf().getElementType().getTypeKind() == .Array) {1482 if (parent.llvm_ptr.typeOf().getElementType().getTypeKind() == .Array) {
1483 const indices: [2]*const llvm.Value = .{1483 const indices: [2]*const llvm.Value = .{
...@@ -2683,7 +2683,7 @@ pub const DeclGen = struct {...@@ -2683,7 +2683,7 @@ pub const DeclGen = struct {
2683 };2683 };
2684 }2684 }
26852685
2686 fn lowerParentPtr(dg: *DeclGen, ptr_val: Value) Error!ParentPtr {2686 fn lowerParentPtr(dg: *DeclGen, ptr_val: Value, base_ty: Type) Error!ParentPtr {
2687 switch (ptr_val.tag()) {2687 switch (ptr_val.tag()) {
2688 .decl_ref_mut => {2688 .decl_ref_mut => {
2689 const decl = ptr_val.castTag(.decl_ref_mut).?.data.decl;2689 const decl = ptr_val.castTag(.decl_ref_mut).?.data.decl;
...@@ -2697,9 +2697,27 @@ pub const DeclGen = struct {...@@ -2697,9 +2697,27 @@ pub const DeclGen = struct {
2697 const decl = ptr_val.castTag(.variable).?.data.owner_decl;2697 const decl = ptr_val.castTag(.variable).?.data.owner_decl;
2698 return dg.lowerParentPtrDecl(ptr_val, decl);2698 return dg.lowerParentPtrDecl(ptr_val, decl);
2699 },2699 },
2700 .int_i64 => {
2701 const int = ptr_val.castTag(.int_i64).?.data;
2702 const llvm_usize = try dg.llvmType(Type.usize);
2703 const llvm_int = llvm_usize.constInt(@bitCast(u64, int), .False);
2704 return ParentPtr{
2705 .llvm_ptr = llvm_int.constIntToPtr(try dg.llvmType(base_ty)),
2706 .ty = base_ty,
2707 };
2708 },
2709 .int_u64 => {
2710 const int = ptr_val.castTag(.int_u64).?.data;
2711 const llvm_usize = try dg.llvmType(Type.usize);
2712 const llvm_int = llvm_usize.constInt(int, .False);
2713 return ParentPtr{
2714 .llvm_ptr = llvm_int.constIntToPtr(try dg.llvmType(base_ty)),
2715 .ty = base_ty,
2716 };
2717 },
2700 .field_ptr => {2718 .field_ptr => {
2701 const field_ptr = ptr_val.castTag(.field_ptr).?.data;2719 const field_ptr = ptr_val.castTag(.field_ptr).?.data;
2702 const parent = try dg.lowerParentPtr(field_ptr.container_ptr);2720 const parent = try dg.lowerParentPtr(field_ptr.container_ptr, base_ty);
2703 const field_index = @intCast(u32, field_ptr.field_index);2721 const field_index = @intCast(u32, field_ptr.field_index);
2704 const llvm_u32 = dg.context.intType(32);2722 const llvm_u32 = dg.context.intType(32);
2705 const target = dg.module.getTarget();2723 const target = dg.module.getTarget();
...@@ -2753,7 +2771,7 @@ pub const DeclGen = struct {...@@ -2753,7 +2771,7 @@ pub const DeclGen = struct {
2753 },2771 },
2754 .elem_ptr => {2772 .elem_ptr => {
2755 const elem_ptr = ptr_val.castTag(.elem_ptr).?.data;2773 const elem_ptr = ptr_val.castTag(.elem_ptr).?.data;
2756 const parent = try dg.lowerParentPtr(elem_ptr.array_ptr);2774 const parent = try dg.lowerParentPtr(elem_ptr.array_ptr, base_ty);
2757 const llvm_usize = try dg.llvmType(Type.usize);2775 const llvm_usize = try dg.llvmType(Type.usize);
2758 const indices: [2]*const llvm.Value = .{2776 const indices: [2]*const llvm.Value = .{
2759 llvm_usize.constInt(0, .False),2777 llvm_usize.constInt(0, .False),
...@@ -2766,7 +2784,7 @@ pub const DeclGen = struct {...@@ -2766,7 +2784,7 @@ pub const DeclGen = struct {
2766 },2784 },
2767 .opt_payload_ptr => {2785 .opt_payload_ptr => {
2768 const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;2786 const opt_payload_ptr = ptr_val.castTag(.opt_payload_ptr).?.data;
2769 const parent = try dg.lowerParentPtr(opt_payload_ptr);2787 const parent = try dg.lowerParentPtr(opt_payload_ptr, base_ty);
2770 var buf: Type.Payload.ElemType = undefined;2788 var buf: Type.Payload.ElemType = undefined;
2771 const payload_ty = parent.ty.optionalChild(&buf);2789 const payload_ty = parent.ty.optionalChild(&buf);
2772 if (!payload_ty.hasRuntimeBits() or parent.ty.isPtrLikeOptional()) {2790 if (!payload_ty.hasRuntimeBits() or parent.ty.isPtrLikeOptional()) {
...@@ -2790,7 +2808,7 @@ pub const DeclGen = struct {...@@ -2790,7 +2808,7 @@ pub const DeclGen = struct {
2790 },2808 },
2791 .eu_payload_ptr => {2809 .eu_payload_ptr => {
2792 const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data;2810 const eu_payload_ptr = ptr_val.castTag(.eu_payload_ptr).?.data;
2793 const parent = try dg.lowerParentPtr(eu_payload_ptr);2811 const parent = try dg.lowerParentPtr(eu_payload_ptr, base_ty);
2794 const payload_ty = parent.ty.errorUnionPayload();2812 const payload_ty = parent.ty.errorUnionPayload();
2795 if (!payload_ty.hasRuntimeBits()) {2813 if (!payload_ty.hasRuntimeBits()) {
2796 // In this case, we represent pointer to error union the same as pointer2814 // In this case, we represent pointer to error union the same as pointer