Skip to content

Commit 94a5b92

Browse files
committed
[CIR] [Lowering] [X86_64] Support VAArg in shape
1 parent f429d5c commit 94a5b92

File tree

16 files changed

+543
-112
lines changed

16 files changed

+543
-112
lines changed

clang/include/clang/CIR/ABIArgInfo.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ class ABIArgInfo {
254254
bool isExpand() const { return TheKind == Expand; }
255255
bool isCoerceAndExpand() const { return TheKind == CoerceAndExpand; }
256256

257+
bool isIgnore() const { return TheKind == Ignore; }
258+
257259
bool isSignExt() const {
258260
assert(isExtend() && "Invalid kind!");
259261
return SignExt;

clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,17 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
4949
getAttr<mlir::cir::IntAttr>(ty, val));
5050
}
5151

52+
mlir::Value getSignedInt(mlir::Location loc, int64_t val, unsigned numBits) {
53+
return getConstAPSInt(
54+
loc, llvm::APSInt(llvm::APInt(numBits, val), /*isUnsigned=*/false));
55+
}
56+
57+
mlir::Value getUnsignedInt(mlir::Location loc, uint64_t val,
58+
unsigned numBits) {
59+
return getConstAPSInt(
60+
loc, llvm::APSInt(llvm::APInt(numBits, val), /*isUnsigned=*/true));
61+
}
62+
5263
mlir::Value getConstAPInt(mlir::Location loc, mlir::Type typ,
5364
const llvm::APInt &val) {
5465
return create<mlir::cir::ConstantOp>(loc, typ,

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,16 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
126126

127127
void setASTContext(clang::ASTContext *c) {
128128
astCtx = c;
129-
auto abiStr = c->getTargetInfo().getABI();
129+
const clang::TargetInfo &target = c->getTargetInfo();
130+
auto abiStr = target.getABI();
130131
switch (c->getCXXABIKind()) {
131132
case clang::TargetCXXABI::GenericItanium:
133+
if (target.getTriple().getArch() == llvm::Triple::x86_64) {
134+
cxxABI.reset(
135+
::cir::LoweringPrepareCXXABI::createX86ABI(/*is64bit=*/true));
136+
break;
137+
}
138+
132139
cxxABI.reset(::cir::LoweringPrepareCXXABI::createItaniumABI());
133140
break;
134141
case clang::TargetCXXABI::GenericAArch64:

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class LoweringPrepareCXXABI {
2828
public:
2929
static LoweringPrepareCXXABI *createItaniumABI();
3030
static LoweringPrepareCXXABI *createAArch64ABI(::cir::AArch64ABIKind k);
31+
static LoweringPrepareCXXABI *createX86ABI(bool is64Bit);
3132

3233
virtual mlir::Value lowerVAArg(CIRBaseBuilderTy &builder,
3334
mlir::cir::VAArgOp op,

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

Whitespace-only changes.

clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,5 +54,12 @@ CIRCXXABI::RecordArgABI getRecordArgABI(const StructType RT,
5454
return CXXABI.getRecordArgABI(RT);
5555
}
5656

57+
CIRCXXABI::RecordArgABI getRecordArgABI(mlir::Type ty, CIRCXXABI &CXXABI) {
58+
auto sTy = dyn_cast<StructType>(ty);
59+
if (!sTy)
60+
return CIRCXXABI::RAA_Default;
61+
return getRecordArgABI(sTy, CXXABI);
62+
}
63+
5764
} // namespace cir
5865
} // namespace mlir

clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ bool isAggregateTypeForABI(Type T);
3131
Type useFirstFieldIfTransparentUnion(Type Ty);
3232

3333
CIRCXXABI::RecordArgABI getRecordArgABI(const StructType RT, CIRCXXABI &CXXABI);
34+
CIRCXXABI::RecordArgABI getRecordArgABI(mlir::Type ty, CIRCXXABI &CXXABI);
3435

3536
} // namespace cir
3637
} // namespace mlir

clang/lib/CIR/Dialect/Transforms/TargetLowering/CIRCXXABI.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,24 +68,4 @@ CIRCXXABI *CreateItaniumCXXABI(LowerModule &CGM);
6868
} // namespace cir
6969
} // namespace mlir
7070

71-
// FIXME(cir): Merge this into the CIRCXXABI class above. To do so, this code
72-
// should be updated to follow some level of codegen parity.
73-
namespace cir {
74-
75-
class LoweringPrepareCXXABI {
76-
public:
77-
static LoweringPrepareCXXABI *createItaniumABI();
78-
static LoweringPrepareCXXABI *createAArch64ABI(::cir::AArch64ABIKind k);
79-
80-
virtual mlir::Value lowerVAArg(CIRBaseBuilderTy &builder,
81-
mlir::cir::VAArgOp op,
82-
const cir::CIRDataLayout &datalayout) = 0;
83-
virtual ~LoweringPrepareCXXABI() {}
84-
85-
virtual mlir::Value lowerDynamicCast(CIRBaseBuilderTy &builder,
86-
clang::ASTContext &astCtx,
87-
mlir::cir::DynamicCastOp op) = 0;
88-
};
89-
} // namespace cir
90-
9171
#endif // LLVM_CLANG_LIB_CIR_DIALECT_TRANSFORMS_TARGETLOWERING_CIRCXXABI_H

clang/lib/CIR/Dialect/Transforms/TargetLowering/CIRLowerContext.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,18 @@ clang::TypeInfo CIRLowerContext::getTypeInfoImpl(const Type T) const {
9494
Align = Target->getDoubleAlign();
9595
break;
9696
}
97+
if (auto longDoubleTy = dyn_cast<LongDoubleType>(T)) {
98+
if (getLangOpts().OpenMP && getLangOpts().OpenMPIsTargetDevice &&
99+
(Target->getLongDoubleWidth() != AuxTarget->getLongDoubleWidth() ||
100+
Target->getLongDoubleAlign() != AuxTarget->getLongDoubleAlign())) {
101+
Width = AuxTarget->getLongDoubleWidth();
102+
Align = AuxTarget->getLongDoubleAlign();
103+
} else {
104+
Width = Target->getLongDoubleWidth();
105+
Align = Target->getLongDoubleAlign();
106+
}
107+
break;
108+
}
97109
cir_cconv_unreachable("Unknown builtin type!");
98110
break;
99111
}

clang/lib/CIR/Dialect/Transforms/TargetLowering/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ add_clang_library(TargetLowering
1717
Targets/X86.cpp
1818
Targets/LoweringPrepareAArch64CXXABI.cpp
1919
Targets/LoweringPrepareItaniumCXXABI.cpp
20+
Targets/LoweringPrepareX86CXXABI.cpp
2021

2122
DEPENDS
2223
clangBasic

0 commit comments

Comments
 (0)