15
15
#include " ../IR/MissingFeatures.h"
16
16
#include " LoweringPrepareItaniumCXXABI.h"
17
17
#include " clang/AST/CharUnits.h"
18
+ #include " clang/CIR/Dialect/IR/CIRDataLayout.h"
18
19
#include " clang/CIR/Dialect/IR/CIRTypes.h"
19
20
20
21
#include < assert.h>
@@ -25,20 +26,23 @@ namespace {
25
26
class LoweringPrepareAArch64CXXABI : public LoweringPrepareItaniumCXXABI {
26
27
public:
27
28
LoweringPrepareAArch64CXXABI (AArch64ABIKind k) : Kind(k) {}
28
- mlir::Value lowerVAArg (cir::CIRBaseBuilderTy &builder,
29
- mlir:: cir::VAArgOp op ) override ;
29
+ mlir::Value lowerVAArg (cir::CIRBaseBuilderTy &builder, mlir::cir::VAArgOp op,
30
+ const cir::CIRDataLayout &datalayout ) override ;
30
31
31
32
private:
32
33
AArch64ABIKind Kind;
33
34
mlir::Value lowerAAPCSVAArg (cir::CIRBaseBuilderTy &builder,
34
- mlir::cir::VAArgOp op);
35
+ mlir::cir::VAArgOp op,
36
+ const cir::CIRDataLayout &datalayout);
35
37
bool isDarwinPCS () const { return Kind == AArch64ABIKind::DarwinPCS; }
36
38
mlir::Value lowerMSVAArg (cir::CIRBaseBuilderTy &builder,
37
- mlir::cir::VAArgOp op) {
39
+ mlir::cir::VAArgOp op,
40
+ const cir::CIRDataLayout &datalayout) {
38
41
llvm_unreachable (" MSVC ABI not supported yet" );
39
42
}
40
43
mlir::Value lowerDarwinVAArg (cir::CIRBaseBuilderTy &builder,
41
- mlir::cir::VAArgOp op) {
44
+ mlir::cir::VAArgOp op,
45
+ const cir::CIRDataLayout &datalayout) {
42
46
llvm_unreachable (" Darwin ABI not supported yet" );
43
47
}
44
48
};
@@ -49,9 +53,9 @@ cir::LoweringPrepareCXXABI::createAArch64ABI(AArch64ABIKind k) {
49
53
return new LoweringPrepareAArch64CXXABI (k);
50
54
}
51
55
52
- mlir::Value
53
- LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg ( cir::CIRBaseBuilderTy &builder,
54
- mlir:: cir::VAArgOp op ) {
56
+ mlir::Value LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg (
57
+ cir::CIRBaseBuilderTy &builder, mlir::cir::VAArgOp op ,
58
+ const cir::CIRDataLayout &datalayout ) {
55
59
auto loc = op->getLoc ();
56
60
auto valist = op->getOperand (0 );
57
61
auto opResTy = op.getType ();
@@ -118,9 +122,10 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
118
122
assert (!cir::MissingFeatures::supportTyAlignQueryForAArch64 ());
119
123
// One is just place holder for now, as we don't have a way to query
120
124
// type size and alignment.
121
- clang::CharUnits tySize = clang::CharUnits::One ();
122
- clang::CharUnits tyAlign = clang::CharUnits::One ();
123
- ;
125
+ clang::CharUnits tySize =
126
+ clang::CharUnits::fromQuantity (datalayout.getTypeStoreSize (opResTy));
127
+ clang::CharUnits tyAlign =
128
+ clang::CharUnits::fromQuantity (datalayout.getAlignment (opResTy, true ));
124
129
125
130
// indirectness, type size and type alignment all
126
131
// decide regSize, but they are all ABI defined
@@ -215,9 +220,10 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
215
220
uint64_t numMembers = 0 ;
216
221
assert (!cir::MissingFeatures::supportisHomogeneousAggregateQueryForAArch64 ());
217
222
bool isHFA = false ;
223
+ // though endianess can be known from datalayout, it might need an unified
224
+ // ABI lowering query system to answer the question.
218
225
assert (!cir::MissingFeatures::supportisEndianQueryForAArch64 ());
219
- // TODO: endianess should be query result from ABI info
220
- bool isBigEndian = false ;
226
+ bool isBigEndian = datalayout.isBigEndian ();
221
227
assert (!cir::MissingFeatures::supportisAggregateTypeForABIAArch64 ());
222
228
// TODO: isAggregateTypeForABI should be query result from ABI info
223
229
bool isAggregateTypeForABI = false ;
@@ -336,8 +342,9 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
336
342
337
343
mlir::Value
338
344
LoweringPrepareAArch64CXXABI::lowerVAArg (cir::CIRBaseBuilderTy &builder,
339
- mlir::cir::VAArgOp op) {
340
- return Kind == AArch64ABIKind::Win64 ? lowerMSVAArg (builder, op)
341
- : isDarwinPCS () ? lowerDarwinVAArg (builder, op)
342
- : lowerAAPCSVAArg (builder, op);
345
+ mlir::cir::VAArgOp op,
346
+ const cir::CIRDataLayout &datalayout) {
347
+ return Kind == AArch64ABIKind::Win64 ? lowerMSVAArg (builder, op, datalayout)
348
+ : isDarwinPCS () ? lowerDarwinVAArg (builder, op, datalayout)
349
+ : lowerAAPCSVAArg (builder, op, datalayout);
343
350
}
0 commit comments