Skip to content

Commit 2f2214c

Browse files
committed
use CIRDataLayout to get some ABI info
1 parent 09b1536 commit 2f2214c

5 files changed

+37
-23
lines changed

clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "clang/Basic/Module.h"
1818
#include "clang/Basic/TargetInfo.h"
1919
#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
20+
#include "clang/CIR/Dialect/IR/CIRDataLayout.h"
2021
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2122
#include "clang/CIR/Dialect/Passes.h"
2223
#include "clang/CIR/Interfaces/ASTAttrInterfaces.h"
@@ -334,8 +335,9 @@ static void canonicalizeIntrinsicThreeWayCmp(CIRBaseBuilderTy &builder,
334335
void LoweringPreparePass::lowerVAArgOp(VAArgOp op) {
335336
CIRBaseBuilderTy builder(getContext());
336337
builder.setInsertionPoint(op);
338+
::cir::CIRDataLayout datalayout(theModule);
337339

338-
auto res = cxxABI->lowerVAArg(builder, op);
340+
auto res = cxxABI->lowerVAArg(builder, op, datalayout);
339341
if (res) {
340342
op.replaceAllUsesWith(res);
341343
op.erase();

clang/lib/CIR/Dialect/Transforms/LoweringPrepareAArch64CXXABI.cpp

+24-17
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "../IR/MissingFeatures.h"
1616
#include "LoweringPrepareItaniumCXXABI.h"
1717
#include "clang/AST/CharUnits.h"
18+
#include "clang/CIR/Dialect/IR/CIRDataLayout.h"
1819
#include "clang/CIR/Dialect/IR/CIRTypes.h"
1920

2021
#include <assert.h>
@@ -25,20 +26,23 @@ namespace {
2526
class LoweringPrepareAArch64CXXABI : public LoweringPrepareItaniumCXXABI {
2627
public:
2728
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;
3031

3132
private:
3233
AArch64ABIKind Kind;
3334
mlir::Value lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
34-
mlir::cir::VAArgOp op);
35+
mlir::cir::VAArgOp op,
36+
const cir::CIRDataLayout &datalayout);
3537
bool isDarwinPCS() const { return Kind == AArch64ABIKind::DarwinPCS; }
3638
mlir::Value lowerMSVAArg(cir::CIRBaseBuilderTy &builder,
37-
mlir::cir::VAArgOp op) {
39+
mlir::cir::VAArgOp op,
40+
const cir::CIRDataLayout &datalayout) {
3841
llvm_unreachable("MSVC ABI not supported yet");
3942
}
4043
mlir::Value lowerDarwinVAArg(cir::CIRBaseBuilderTy &builder,
41-
mlir::cir::VAArgOp op) {
44+
mlir::cir::VAArgOp op,
45+
const cir::CIRDataLayout &datalayout) {
4246
llvm_unreachable("Darwin ABI not supported yet");
4347
}
4448
};
@@ -49,9 +53,9 @@ cir::LoweringPrepareCXXABI::createAArch64ABI(AArch64ABIKind k) {
4953
return new LoweringPrepareAArch64CXXABI(k);
5054
}
5155

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) {
5559
auto loc = op->getLoc();
5660
auto valist = op->getOperand(0);
5761
auto opResTy = op.getType();
@@ -118,9 +122,10 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
118122
assert(!cir::MissingFeatures::supportTyAlignQueryForAArch64());
119123
// One is just place holder for now, as we don't have a way to query
120124
// 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));
124129

125130
// indirectness, type size and type alignment all
126131
// decide regSize, but they are all ABI defined
@@ -215,9 +220,10 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
215220
uint64_t numMembers = 0;
216221
assert(!cir::MissingFeatures::supportisHomogeneousAggregateQueryForAArch64());
217222
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.
218225
assert(!cir::MissingFeatures::supportisEndianQueryForAArch64());
219-
// TODO: endianess should be query result from ABI info
220-
bool isBigEndian = false;
226+
bool isBigEndian = datalayout.isBigEndian();
221227
assert(!cir::MissingFeatures::supportisAggregateTypeForABIAArch64());
222228
// TODO: isAggregateTypeForABI should be query result from ABI info
223229
bool isAggregateTypeForABI = false;
@@ -336,8 +342,9 @@ LoweringPrepareAArch64CXXABI::lowerAAPCSVAArg(cir::CIRBaseBuilderTy &builder,
336342

337343
mlir::Value
338344
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);
343350
}

clang/lib/CIR/Dialect/Transforms/LoweringPrepareCXXABI.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "mlir/IR/Value.h"
1919
#include "clang/AST/ASTContext.h"
2020
#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
21+
#include "clang/CIR/Dialect/IR/CIRDataLayout.h"
2122
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2223

2324
namespace cir {
@@ -36,7 +37,8 @@ class LoweringPrepareCXXABI {
3637
static LoweringPrepareCXXABI *createAArch64ABI(AArch64ABIKind k);
3738

3839
virtual mlir::Value lowerVAArg(CIRBaseBuilderTy &builder,
39-
mlir::cir::VAArgOp op) = 0;
40+
mlir::cir::VAArgOp op,
41+
const cir::CIRDataLayout &datalayout) = 0;
4042
virtual ~LoweringPrepareCXXABI() {}
4143

4244
virtual mlir::Value lowerDynamicCast(CIRBaseBuilderTy &builder,

clang/lib/CIR/Dialect/Transforms/LoweringPrepareItaniumCXXABI.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "clang/Basic/TargetInfo.h"
2121
#include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
2222
#include "clang/CIR/Dialect/IR/CIRAttrs.h"
23+
#include "clang/CIR/Dialect/IR/CIRDataLayout.h"
2324
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2425

2526
using namespace cir;
@@ -160,8 +161,9 @@ LoweringPrepareItaniumCXXABI::lowerDynamicCast(CIRBaseBuilderTy &builder,
160161
.getResult();
161162
}
162163

163-
mlir::Value LoweringPrepareItaniumCXXABI::lowerVAArg(CIRBaseBuilderTy &builder,
164-
mlir::cir::VAArgOp op) {
164+
mlir::Value LoweringPrepareItaniumCXXABI::lowerVAArg(
165+
CIRBaseBuilderTy &builder, mlir::cir::VAArgOp op,
166+
const ::cir::CIRDataLayout &datalayout) {
165167
// There is no generic cir lowering for var_arg, here we fail
166168
// so to prevent attempt of calling lowerVAArg for ItaniumCXXABI
167169
llvm_unreachable("NYI");

clang/lib/CIR/Dialect/Transforms/LoweringPrepareItaniumCXXABI.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "LoweringPrepareCXXABI.h"
15+
#include "clang/CIR/Dialect/IR/CIRDataLayout.h"
1516

1617
class LoweringPrepareItaniumCXXABI : public cir::LoweringPrepareCXXABI {
1718
public:
1819
mlir::Value lowerDynamicCast(cir::CIRBaseBuilderTy &builder,
1920
clang::ASTContext &astCtx,
2021
mlir::cir::DynamicCastOp op) override;
21-
mlir::Value lowerVAArg(cir::CIRBaseBuilderTy &builder,
22-
mlir::cir::VAArgOp op) override;
22+
mlir::Value lowerVAArg(cir::CIRBaseBuilderTy &builder, mlir::cir::VAArgOp op,
23+
const cir::CIRDataLayout &datalayout) override;
2324
};

0 commit comments

Comments
 (0)