@@ -6057,11 +6057,13 @@ SDValue AArch64TargetLowering::LowerWin64_VASTART(SDValue Op,
6057
6057
}
6058
6058
6059
6059
SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
6060
- SelectionDAG &DAG) const {
6060
+ SelectionDAG &DAG) const {
6061
6061
// The layout of the va_list struct is specified in the AArch64 Procedure Call
6062
6062
// Standard, section B.3.
6063
6063
MachineFunction &MF = DAG.getMachineFunction();
6064
6064
AArch64FunctionInfo *FuncInfo = MF.getInfo<AArch64FunctionInfo>();
6065
+ unsigned PtrSize = Subtarget->isTargetILP32() ? 4 : 8;
6066
+ auto PtrMemVT = getPointerMemTy(DAG.getDataLayout());
6065
6067
auto PtrVT = getPointerTy(DAG.getDataLayout());
6066
6068
SDLoc DL(Op);
6067
6069
@@ -6071,56 +6073,65 @@ SDValue AArch64TargetLowering::LowerAAPCS_VASTART(SDValue Op,
6071
6073
SmallVector<SDValue, 4> MemOps;
6072
6074
6073
6075
// void *__stack at offset 0
6076
+ unsigned Offset = 0;
6074
6077
SDValue Stack = DAG.getFrameIndex(FuncInfo->getVarArgsStackIndex(), PtrVT);
6078
+ Stack = DAG.getZExtOrTrunc(Stack, DL, PtrMemVT);
6075
6079
MemOps.push_back(DAG.getStore(Chain, DL, Stack, VAList,
6076
- MachinePointerInfo(SV), /* Alignment = */ 8));
6080
+ MachinePointerInfo(SV),
6081
+ /* Alignment = */ PtrSize));
6077
6082
6078
- // void *__gr_top at offset 8
6083
+ // void *__gr_top at offset 8 (4 on ILP32)
6084
+ Offset += PtrSize;
6079
6085
int GPRSize = FuncInfo->getVarArgsGPRSize();
6080
6086
if (GPRSize > 0) {
6081
6087
SDValue GRTop, GRTopAddr;
6082
6088
6083
- GRTopAddr =
6084
- DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(8 , DL, PtrVT));
6089
+ GRTopAddr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
6090
+ DAG.getConstant(Offset , DL, PtrVT));
6085
6091
6086
6092
GRTop = DAG.getFrameIndex(FuncInfo->getVarArgsGPRIndex(), PtrVT);
6087
6093
GRTop = DAG.getNode(ISD::ADD, DL, PtrVT, GRTop,
6088
6094
DAG.getConstant(GPRSize, DL, PtrVT));
6095
+ GRTop = DAG.getZExtOrTrunc(GRTop, DL, PtrMemVT);
6089
6096
6090
6097
MemOps.push_back(DAG.getStore(Chain, DL, GRTop, GRTopAddr,
6091
- MachinePointerInfo(SV, 8 ),
6092
- /* Alignment = */ 8 ));
6098
+ MachinePointerInfo(SV, Offset ),
6099
+ /* Alignment = */ PtrSize ));
6093
6100
}
6094
6101
6095
- // void *__vr_top at offset 16
6102
+ // void *__vr_top at offset 16 (8 on ILP32)
6103
+ Offset += PtrSize;
6096
6104
int FPRSize = FuncInfo->getVarArgsFPRSize();
6097
6105
if (FPRSize > 0) {
6098
6106
SDValue VRTop, VRTopAddr;
6099
6107
VRTopAddr = DAG.getNode(ISD::ADD, DL, PtrVT, VAList,
6100
- DAG.getConstant(16 , DL, PtrVT));
6108
+ DAG.getConstant(Offset , DL, PtrVT));
6101
6109
6102
6110
VRTop = DAG.getFrameIndex(FuncInfo->getVarArgsFPRIndex(), PtrVT);
6103
6111
VRTop = DAG.getNode(ISD::ADD, DL, PtrVT, VRTop,
6104
6112
DAG.getConstant(FPRSize, DL, PtrVT));
6113
+ VRTop = DAG.getZExtOrTrunc(VRTop, DL, PtrMemVT);
6105
6114
6106
6115
MemOps.push_back(DAG.getStore(Chain, DL, VRTop, VRTopAddr,
6107
- MachinePointerInfo(SV, 16 ),
6108
- /* Alignment = */ 8 ));
6116
+ MachinePointerInfo(SV, Offset ),
6117
+ /* Alignment = */ PtrSize ));
6109
6118
}
6110
6119
6111
- // int __gr_offs at offset 24
6120
+ // int __gr_offs at offset 24 (12 on ILP32)
6121
+ Offset += PtrSize;
6112
6122
SDValue GROffsAddr =
6113
- DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(24 , DL, PtrVT));
6123
+ DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(Offset , DL, PtrVT));
6114
6124
MemOps.push_back(DAG.getStore(
6115
6125
Chain, DL, DAG.getConstant(-GPRSize, DL, MVT::i32), GROffsAddr,
6116
- MachinePointerInfo(SV, 24 ), /* Alignment = */ 4));
6126
+ MachinePointerInfo(SV, Offset ), /* Alignment = */ 4));
6117
6127
6118
- // int __vr_offs at offset 28
6128
+ // int __vr_offs at offset 28 (16 on ILP32)
6129
+ Offset += 4;
6119
6130
SDValue VROffsAddr =
6120
- DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(28 , DL, PtrVT));
6131
+ DAG.getNode(ISD::ADD, DL, PtrVT, VAList, DAG.getConstant(Offset , DL, PtrVT));
6121
6132
MemOps.push_back(DAG.getStore(
6122
6133
Chain, DL, DAG.getConstant(-FPRSize, DL, MVT::i32), VROffsAddr,
6123
- MachinePointerInfo(SV, 28 ), /* Alignment = */ 4));
6134
+ MachinePointerInfo(SV, Offset ), /* Alignment = */ 4));
6124
6135
6125
6136
return DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOps);
6126
6137
}
@@ -6143,8 +6154,10 @@ SDValue AArch64TargetLowering::LowerVACOPY(SDValue Op,
6143
6154
// pointer.
6144
6155
SDLoc DL(Op);
6145
6156
unsigned PtrSize = Subtarget->isTargetILP32() ? 4 : 8;
6146
- unsigned VaListSize = (Subtarget->isTargetDarwin() ||
6147
- Subtarget->isTargetWindows()) ? PtrSize : 32;
6157
+ unsigned VaListSize =
6158
+ (Subtarget->isTargetDarwin() || Subtarget->isTargetWindows())
6159
+ ? PtrSize
6160
+ : Subtarget->isTargetILP32() ? 20 : 32;
6148
6161
const Value *DestSV = cast<SrcValueSDNode>(Op.getOperand(3))->getValue();
6149
6162
const Value *SrcSV = cast<SrcValueSDNode>(Op.getOperand(4))->getValue();
6150
6163
0 commit comments