|
15 | 15 | #include "clang/AST/CharUnits.h"
|
16 | 16 | #include "clang/AST/Mangle.h"
|
17 | 17 | #include "clang/Basic/Module.h"
|
| 18 | +#include "clang/Basic/TargetInfo.h" |
18 | 19 | #include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
|
| 20 | +#include "clang/CIR/Dialect/IR/CIRDataLayout.h" |
19 | 21 | #include "clang/CIR/Dialect/IR/CIRDialect.h"
|
20 | 22 | #include "clang/CIR/Dialect/Passes.h"
|
21 | 23 | #include "clang/CIR/Interfaces/ASTAttrInterfaces.h"
|
@@ -70,6 +72,7 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
|
70 | 72 |
|
71 | 73 | void runOnOp(Operation *op);
|
72 | 74 | void lowerThreeWayCmpOp(CmpThreeWayOp op);
|
| 75 | + void lowerVAArgOp(VAArgOp op); |
73 | 76 | void lowerGlobalOp(GlobalOp op);
|
74 | 77 | void lowerDynamicCastOp(DynamicCastOp op);
|
75 | 78 | void lowerStdFindOp(StdFindOp op);
|
@@ -108,15 +111,24 @@ struct LoweringPreparePass : public LoweringPrepareBase<LoweringPreparePass> {
|
108 | 111 |
|
109 | 112 | void setASTContext(clang::ASTContext *c) {
|
110 | 113 | astCtx = c;
|
| 114 | + auto abiStr = c->getTargetInfo().getABI(); |
111 | 115 | switch (c->getCXXABIKind()) {
|
112 | 116 | case clang::TargetCXXABI::GenericItanium:
|
| 117 | + cxxABI.reset(::cir::LoweringPrepareCXXABI::createItaniumABI()); |
| 118 | + break; |
113 | 119 | case clang::TargetCXXABI::GenericAArch64:
|
114 | 120 | case clang::TargetCXXABI::AppleARM64:
|
115 |
| - // TODO: this isn't quite right, clang uses AppleARM64CXXABI which |
116 |
| - // inherits from ARMCXXABI. We'll have to follow suit. |
117 |
| - cxxABI.reset(::cir::LoweringPrepareCXXABI::createItaniumABI()); |
| 121 | + // TODO: This is temporary solution. ABIKind info should be |
| 122 | + // propagated from the targetInfo managed by ABI lowering |
| 123 | + // query system. |
| 124 | + assert(abiStr == "aapcs" || abiStr == "darwinpcs" || |
| 125 | + abiStr == "aapcs-soft"); |
| 126 | + cxxABI.reset(::cir::LoweringPrepareCXXABI::createAArch64ABI( |
| 127 | + abiStr == "aapcs" |
| 128 | + ? ::cir::AArch64ABIKind::AAPCS |
| 129 | + : (abiStr == "darwinpccs" ? ::cir::AArch64ABIKind::DarwinPCS |
| 130 | + : ::cir::AArch64ABIKind::AAPCSSoft))); |
118 | 131 | break;
|
119 |
| - |
120 | 132 | default:
|
121 | 133 | llvm_unreachable("NYI");
|
122 | 134 | }
|
@@ -320,6 +332,19 @@ static void canonicalizeIntrinsicThreeWayCmp(CIRBaseBuilderTy &builder,
|
320 | 332 | op.erase();
|
321 | 333 | }
|
322 | 334 |
|
| 335 | +void LoweringPreparePass::lowerVAArgOp(VAArgOp op) { |
| 336 | + CIRBaseBuilderTy builder(getContext()); |
| 337 | + builder.setInsertionPoint(op); |
| 338 | + ::cir::CIRDataLayout datalayout(theModule); |
| 339 | + |
| 340 | + auto res = cxxABI->lowerVAArg(builder, op, datalayout); |
| 341 | + if (res) { |
| 342 | + op.replaceAllUsesWith(res); |
| 343 | + op.erase(); |
| 344 | + } |
| 345 | + return; |
| 346 | +} |
| 347 | + |
323 | 348 | void LoweringPreparePass::lowerThreeWayCmpOp(CmpThreeWayOp op) {
|
324 | 349 | CIRBaseBuilderTy builder(getContext());
|
325 | 350 | builder.setInsertionPointAfter(op);
|
@@ -603,6 +628,8 @@ void LoweringPreparePass::lowerIterEndOp(IterEndOp op) {
|
603 | 628 | void LoweringPreparePass::runOnOp(Operation *op) {
|
604 | 629 | if (auto threeWayCmp = dyn_cast<CmpThreeWayOp>(op)) {
|
605 | 630 | lowerThreeWayCmpOp(threeWayCmp);
|
| 631 | + } else if (auto vaArgOp = dyn_cast<VAArgOp>(op)) { |
| 632 | + lowerVAArgOp(vaArgOp); |
606 | 633 | } else if (auto getGlobal = dyn_cast<GlobalOp>(op)) {
|
607 | 634 | lowerGlobalOp(getGlobal);
|
608 | 635 | } else if (auto dynamicCast = dyn_cast<DynamicCastOp>(op)) {
|
@@ -635,8 +662,9 @@ void LoweringPreparePass::runOnOperation() {
|
635 | 662 |
|
636 | 663 | SmallVector<Operation *> opsToTransform;
|
637 | 664 | op->walk([&](Operation *op) {
|
638 |
| - if (isa<CmpThreeWayOp, GlobalOp, DynamicCastOp, StdFindOp, IterEndOp, |
639 |
| - IterBeginOp, ArrayCtor, ArrayDtor, mlir::cir::FuncOp>(op)) |
| 665 | + if (isa<CmpThreeWayOp, VAArgOp, GlobalOp, DynamicCastOp, StdFindOp, |
| 666 | + IterEndOp, IterBeginOp, ArrayCtor, ArrayDtor, mlir::cir::FuncOp>( |
| 667 | + op)) |
640 | 668 | opsToTransform.push_back(op);
|
641 | 669 | });
|
642 | 670 |
|
|
0 commit comments