https://github.com/Fznamznon updated 
https://github.com/llvm/llvm-project/pull/229494

>From 5e73d15620e1543f8de059c423c4cfb69650b12d Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Tue, 6 Oct 2026 12:11:07 -0500
Subject: [PATCH 01/10] [CIR] Record if c++ ABI was overridden via -fc++-abi
 flag

Add an optional string module attribute that holds overridden ABI value.
In case it is not present, C++ ABI will be derived from the triple.
---
 .../clang/CIR/Dialect/IR/CIRDialect.td        |  2 ++
 clang/lib/CIR/CodeGen/CIRGenModule.cpp        |  7 ++++++
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp       | 16 +++++++++++++
 .../Transforms/TargetLowering/LowerModule.cpp |  6 +++++
 .../Transforms/TargetLowering/LowerModule.h   |  4 +---
 clang/test/CIR/CodeGen/cxx-abi-override.cpp   | 24 +++++++++++++++++++
 clang/test/CIR/IR/invalid-cxx-abi.cir         | 20 ++++++++++++++++
 clang/test/CIR/IR/lowering-lang-options.cir   |  3 ++-
 8 files changed, 78 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/CIR/CodeGen/cxx-abi-override.cpp
 create mode 100644 clang/test/CIR/IR/invalid-cxx-abi.cir

diff --git a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td 
b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
index 70647fa1943292..3b950e7f4da1ce 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td
@@ -43,6 +43,8 @@ def CIR_Dialect : Dialect {
     static llvm::StringRef getTripleAttrName() { return "cir.triple"; }
     // TargetInfo::getABI(), e.g. "avx512" on x86 or "aapcs" on ARM.
     static llvm::StringRef getTargetABIAttrName() { return "cir.target_abi"; }
+    // -fc++-abi override, if not present the target default is used.
+    static llvm::StringRef getCXXABIAttrName() { return "cir.cxx_abi"; }
     static llvm::StringRef getSizeTypeWidthAttrName() { return 
"cir.size_type_width"; }
     static llvm::StringRef getIntTypeWidthAttrName() { return 
"cir.int_type_width"; }
     static llvm::StringRef getOptInfoAttrName() { return "cir.opt_info"; }
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.cpp 
b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
index 5063b6a4cc7799..358758f8edd224 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.cpp
@@ -159,6 +159,13 @@ CIRGenModule::CIRGenModule(mlir::MLIRContext &mlirContext,
                      builder.getStringAttr(getTriple().str()));
   theModule->setAttr(cir::CIRDialect::getTargetABIAttrName(),
                      builder.getStringAttr(getTarget().getABI()));
+
+  // If cxxabi was overridden via -fc++-abi, record it.
+  if (langOpts.CXXABI)
+    theModule->setAttr(
+        cir::CIRDialect::getCXXABIAttrName(),
+        builder.getStringAttr(TargetCXXABI::getSpelling(*langOpts.CXXABI)));
+
   if (llvm::VersionTuple sdkVersion = getTarget().getSDKVersion();
       !sdkVersion.empty())
     theModule->setAttr(cir::CIRDialect::getSDKVersionAttrName(),
diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 15cebd358040e3..1496fae50fc18d 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -28,6 +28,7 @@
 
 #include "clang/CIR/Dialect/IR/CIROpsDialect.cpp.inc"
 #include "clang/CIR/Dialect/IR/CIROpsEnums.cpp.inc"
+#include "clang/Basic/TargetCXXABI.h"
 #include "clang/CIR/MissingFeatures.h"
 #include "llvm/ADT/SetOperations.h"
 #include "llvm/ADT/SmallSet.h"
@@ -257,6 +258,21 @@ cir::CIRDialect::verifyOperationAttribute(mlir::Operation 
*op,
   if (isOpenCLVersionAttrName(attrName))
     return verifyOpenCLVersionAttr(op, attr);
 
+  if (attrName == getCXXABIAttrName()) {
+    if (!mlir::isa<mlir::ModuleOp>(op))
+      return op->emitOpError() << "expects '" << getCXXABIAttrName()
+                               << "' attribute to be attached to '"
+                               << mlir::ModuleOp::getOperationName() << "'";
+    auto abi = mlir::dyn_cast<mlir::StringAttr>(attr.getValue());
+    if (!abi)
+      return op->emitOpError()
+             << "expects '" << getCXXABIAttrName() << "' to be a string";
+
+    if (!clang::TargetCXXABI::isABI(abi.getValue()))
+      return op->emitOpError() << "unknown C++ ABI '" << abi.getValue() << "'";
+    return success();
+  }
+
   if (attrName == getOffloadContainerAttrName()) {
     if (!mlir::isa<mlir::UnitAttr>(attr.getValue()))
       return op->emitOpError() << "expects '" << getOffloadContainerAttrName()
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
index 03044286e8cf71..be16903f80f4c7 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
@@ -114,6 +114,12 @@ std::unique_ptr<LowerModule> 
createLowerModule(mlir::ModuleOp module) {
     langOpts.setClangABICompat(static_cast<clang::LangOptions::ClangABI>(
         loweringLangOpts.getClangAbiCompat()));
   }
+  // Some langopts are still not lowered.
+  assert(!cir::MissingFeatures::lowerModuleLangOpts());
+
+  if (auto cxxABI = module->getAttrOfType<mlir::StringAttr>(
+          cir::CIRDialect::getCXXABIAttrName()))
+    langOpts.CXXABI = clang::TargetCXXABI::getKind(cxxABI.getValue());
 
   // FIXME(cir): This just uses the default code generation options. We need to
   // account for custom options.
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
index 56fcd0a9b58cda..c0a650d0eb6a01 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
@@ -21,7 +21,6 @@
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/CIR/Dialect/IR/CIRDialect.h"
-#include "clang/CIR/MissingFeatures.h"
 #include <memory>
 
 namespace cir {
@@ -46,8 +45,7 @@ class LowerModule {
   const clang::LangOptions &getLangOpts() const { return langOpts; }
 
   clang::TargetCXXABI::Kind getCXXABIKind() const {
-    assert(!cir::MissingFeatures::lowerModuleLangOpts());
-    return target->getCXXABI().getKind();
+    return langOpts.CXXABI.value_or(target->getCXXABI().getKind());
   }
 
   CIRCXXABI &getCXXABI() const { return *abi; }
diff --git a/clang/test/CIR/CodeGen/cxx-abi-override.cpp 
b/clang/test/CIR/CodeGen/cxx-abi-override.cpp
new file mode 100644
index 00000000000000..199ecb936bc51d
--- /dev/null
+++ b/clang/test/CIR/CodeGen/cxx-abi-override.cpp
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 -std=c++17 -triple aarch64-unknown-linux-gnu 
-fc++-abi=itanium \
+// RUN:   -fclangir -emit-cir %s -o - | FileCheck %s --check-prefix=CIR-ITANIUM
+// RUN: %clang_cc1 -std=c++17 -triple aarch64-unknown-linux-gnu 
-fc++-abi=itanium \
+// RUN:   -fclangir -emit-llvm %s -o - | FileCheck %s 
--check-prefix=LLVM-ITANIUM
+// RUN: %clang_cc1 -std=c++17 -triple aarch64-unknown-linux-gnu -fclangir \
+// RUN:   -emit-cir %s -o - | FileCheck %s --check-prefix=CIR-ARM
+// RUN: %clang_cc1 -std=c++17 -triple aarch64-unknown-linux-gnu \
+// RUN:   -fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM-ARM
+
+// Make sure CXXABI can be overridden with a flag. Check that by excersizing
+// pointer to member on arm with itanium cxxabi.
+
+// CIR-ITANIUM: cir.cxx_abi = "itanium"
+// No attribute, C++ ABI is derived from the triple.
+// CIR-ARM-NOT: cir.cxx_abi = "aarch64"
+
+struct S { virtual void v(); };
+void (S::*pv)() = &S::v;
+
+// CIR-ITANIUM: cir.global external @pv = #cir.const_record<{#cir.int<1> : 
!s64i, #cir.int<0> : !s64i}>
+// CIR-ARM: cir.global external @pv = #cir.const_record<{#cir.int<0> : !s64i, 
#cir.int<1> : !s64i}>
+
+// LLVM-ITANIUM: @pv = {{.*}}{ i64, i64 } { i64 1, i64 0 }
+// LLVM-ARM: @pv = {{.*}}{ i64, i64 } { i64 0, i64 1 }
diff --git a/clang/test/CIR/IR/invalid-cxx-abi.cir 
b/clang/test/CIR/IR/invalid-cxx-abi.cir
new file mode 100644
index 00000000000000..bb7d71bffa028a
--- /dev/null
+++ b/clang/test/CIR/IR/invalid-cxx-abi.cir
@@ -0,0 +1,20 @@
+// RUN: cir-opt %s -verify-diagnostics -split-input-file
+
+// expected-error@+1 {{unknown C++ ABI 'bla'}}
+module attributes {cir.cxx_abi = "bla"} {
+}
+
+// -----
+
+// expected-error@+1 {{'builtin.module' op expects 'cir.cxx_abi' to be a 
string}}
+module attributes {cir.cxx_abi = 1 : i32} {
+}
+
+// -----
+
+module {
+  // expected-error@+1 {{'cir.func' op expects 'cir.cxx_abi' attribute to be 
attached to 'builtin.module'}}
+  cir.func @f() attributes {cir.cxx_abi = "itanium"} {
+    cir.return
+  }
+}
diff --git a/clang/test/CIR/IR/lowering-lang-options.cir 
b/clang/test/CIR/IR/lowering-lang-options.cir
index 2ef90bd94ed4e2..e2bf59783aa556 100644
--- a/clang/test/CIR/IR/lowering-lang-options.cir
+++ b/clang/test/CIR/IR/lowering-lang-options.cir
@@ -7,9 +7,10 @@
 module attributes {cir.lowering_lang_options = #cir.lowering_lang_options<
   exceptions = true, threadsafe_statics = false, cuda = true,
   cuda_is_device = true, hip = true, gpu_rdc = true, openmp = true,
-  openmp_is_target_device = true, clang_abi_compat = 9>} {
+  openmp_is_target_device = true, clang_abi_compat = 9>, cir.cxx_abi = 
"itanium"} {
 }
 
+// CHECK: cir.cxx_abi = "itanium"
 // CHECK: cir.lowering_lang_options = #cir.lowering_lang_options<
 // CHECK-SAME: exceptions = true, threadsafe_statics = false, cuda = true,
 // CHECK-SAME: cuda_is_device = true, hip = true, gpu_rdc = true, openmp = 
true,

>From 59ef1c7f945a35e866cc60c7afc096b1aaeb93e9 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Wed, 7 Oct 2026 06:01:35 -0500
Subject: [PATCH 02/10] Format

---
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 79f9d80f96e8a3..1519b938067091 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -26,9 +26,9 @@
 #include "mlir/Interfaces/FunctionImplementation.h"
 #include "mlir/Support/LLVM.h"
 
+#include "clang/Basic/TargetCXXABI.h"
 #include "clang/CIR/Dialect/IR/CIROpsDialect.cpp.inc"
 #include "clang/CIR/Dialect/IR/CIROpsEnums.cpp.inc"
-#include "clang/Basic/TargetCXXABI.h"
 #include "clang/CIR/MissingFeatures.h"
 #include "llvm/ADT/SetOperations.h"
 #include "llvm/ADT/SmallSet.h"

>From 5b156ab360c32555f877b0b43d9cda4f6c329f02 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Wed, 7 Oct 2026 06:02:30 -0500
Subject: [PATCH 03/10] Typo

---
 clang/test/CIR/CodeGen/cxx-abi-override.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/test/CIR/CodeGen/cxx-abi-override.cpp 
b/clang/test/CIR/CodeGen/cxx-abi-override.cpp
index 199ecb936bc51d..d9b483fd1d34dd 100644
--- a/clang/test/CIR/CodeGen/cxx-abi-override.cpp
+++ b/clang/test/CIR/CodeGen/cxx-abi-override.cpp
@@ -7,7 +7,7 @@
 // RUN: %clang_cc1 -std=c++17 -triple aarch64-unknown-linux-gnu \
 // RUN:   -fclangir -emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM-ARM
 
-// Make sure CXXABI can be overridden with a flag. Check that by excersizing
+// Make sure CXXABI can be overridden with a flag. Check that by exercising
 // pointer to member on arm with itanium cxxabi.
 
 // CIR-ITANIUM: cir.cxx_abi = "itanium"

>From 40533b33fb2f7358d032dd141cb971d6321c76d2 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Wed, 7 Oct 2026 06:38:40 -0500
Subject: [PATCH 04/10] Verify specified abi together with the triple and if it
 is supported

---
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 23 ++++++++++++++++++++++-
 clang/test/CIR/IR/invalid-cxx-abi.cir   | 12 ++++++++++++
 2 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index 1519b938067091..e86d300c292c5d 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -268,8 +268,29 @@ cir::CIRDialect::verifyOperationAttribute(mlir::Operation 
*op,
       return op->emitOpError()
              << "expects '" << getCXXABIAttrName() << "' to be a string";
 
-    if (!clang::TargetCXXABI::isABI(abi.getValue()))
+    StringRef abival = abi.getValue();
+    if (!clang::TargetCXXABI::isABI(abival))
       return op->emitOpError() << "unknown C++ ABI '" << abi.getValue() << "'";
+
+    clang::TargetCXXABI::Kind kind =
+        clang::TargetCXXABI::getKind(abival);
+    if (auto triple = op->getAttrOfType<mlir::StringAttr>(getTripleAttrName()))
+      if (!clang::TargetCXXABI::isSupportedCXXABI(
+              llvm::Triple(triple.getValue()), kind))
+        return op->emitOpError()
+               << "C++ ABI '" << abi.getValue()
+               << "' is not supported on target '" << triple.getValue() << "'";
+
+    switch (kind) {
+    case clang::TargetCXXABI::GenericItanium:
+    case clang::TargetCXXABI::GenericAArch64:
+    case clang::TargetCXXABI::AppleARM64:
+    case clang::TargetCXXABI::Microsoft:
+      break;
+    default:
+      return op->emitOpError() << "C++ ABI '" << abi.getValue()
+                               << "' is not yet supported by CIR";
+    }
     return success();
   }
 
diff --git a/clang/test/CIR/IR/invalid-cxx-abi.cir 
b/clang/test/CIR/IR/invalid-cxx-abi.cir
index bb7d71bffa028a..5d9ce74313c4fe 100644
--- a/clang/test/CIR/IR/invalid-cxx-abi.cir
+++ b/clang/test/CIR/IR/invalid-cxx-abi.cir
@@ -18,3 +18,15 @@ module {
     cir.return
   }
 }
+
+// -----
+
+// expected-error@+1 {{C++ ABI 'microsoft' is not supported on target 
'x86_64-unknown-linux-gnu'}}
+module attributes {cir.triple = "x86_64-unknown-linux-gnu", cir.cxx_abi = 
"microsoft"} {
+}
+
+// -----
+
+// expected-error@+1 {{C++ ABI 'fuchsia' is not yet supported by CIR}}
+module attributes {cir.triple = "aarch64-unknown-fuchsia", cir.cxx_abi = 
"fuchsia"} {
+}

>From 82419973a44d3a1b197bfd22fab53be1c639cf49 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Wed, 7 Oct 2026 06:46:06 -0500
Subject: [PATCH 05/10] Move roundtrip test to a separate file

---
 clang/test/CIR/IR/cxx-abi.cir               | 9 +++++++++
 clang/test/CIR/IR/lowering-lang-options.cir | 3 +--
 2 files changed, 10 insertions(+), 2 deletions(-)
 create mode 100644 clang/test/CIR/IR/cxx-abi.cir

diff --git a/clang/test/CIR/IR/cxx-abi.cir b/clang/test/CIR/IR/cxx-abi.cir
new file mode 100644
index 00000000000000..953df77d378eb1
--- /dev/null
+++ b/clang/test/CIR/IR/cxx-abi.cir
@@ -0,0 +1,9 @@
+// RUN: cir-opt %s --verify-roundtrip | FileCheck %s
+
+// Check that cxx_abi attribute round-trips just fine.
+
+module attributes {cir.cxx_abi = "itanium", 
cir.triple="aarch64-unknown-linux-gnu"} {
+}
+
+// CHECK: cir.cxx_abi = "itanium"
+// CHECK: cir.triple = "aarch64-unknown-linux-gnu"
diff --git a/clang/test/CIR/IR/lowering-lang-options.cir 
b/clang/test/CIR/IR/lowering-lang-options.cir
index e2bf59783aa556..2ef90bd94ed4e2 100644
--- a/clang/test/CIR/IR/lowering-lang-options.cir
+++ b/clang/test/CIR/IR/lowering-lang-options.cir
@@ -7,10 +7,9 @@
 module attributes {cir.lowering_lang_options = #cir.lowering_lang_options<
   exceptions = true, threadsafe_statics = false, cuda = true,
   cuda_is_device = true, hip = true, gpu_rdc = true, openmp = true,
-  openmp_is_target_device = true, clang_abi_compat = 9>, cir.cxx_abi = 
"itanium"} {
+  openmp_is_target_device = true, clang_abi_compat = 9>} {
 }
 
-// CHECK: cir.cxx_abi = "itanium"
 // CHECK: cir.lowering_lang_options = #cir.lowering_lang_options<
 // CHECK-SAME: exceptions = true, threadsafe_statics = false, cuda = true,
 // CHECK-SAME: cuda_is_device = true, hip = true, gpu_rdc = true, openmp = 
true,

>From 0ed6e660aaa69b99107355c2202af76dab02ca59 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Thu, 8 Oct 2026 05:54:22 -0500
Subject: [PATCH 06/10] Format

---
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index e86d300c292c5d..956acf90da6f21 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -272,8 +272,7 @@ cir::CIRDialect::verifyOperationAttribute(mlir::Operation 
*op,
     if (!clang::TargetCXXABI::isABI(abival))
       return op->emitOpError() << "unknown C++ ABI '" << abi.getValue() << "'";
 
-    clang::TargetCXXABI::Kind kind =
-        clang::TargetCXXABI::getKind(abival);
+    clang::TargetCXXABI::Kind kind = clang::TargetCXXABI::getKind(abival);
     if (auto triple = op->getAttrOfType<mlir::StringAttr>(getTripleAttrName()))
       if (!clang::TargetCXXABI::isSupportedCXXABI(
               llvm::Triple(triple.getValue()), kind))

>From bb32b05fa8d73869bb0534d7b0b3c9bc2ecc8115 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Thu, 8 Oct 2026 10:34:12 -0500
Subject: [PATCH 07/10] Emit an error in LowerItaniumCXXABI

---
 clang/lib/CIR/Dialect/IR/CIRDialect.cpp                | 10 ----------
 .../Transforms/TargetLowering/LowerItaniumCXXABI.cpp   |  3 ++-
 .../Dialect/Transforms/TargetLowering/LowerModule.h    |  3 +++
 clang/test/CIR/IR/invalid-cxx-abi.cir                  |  4 ++--
 4 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp 
b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
index b44cf6f0391e91..832dc217fabd14 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -280,16 +280,6 @@ cir::CIRDialect::verifyOperationAttribute(mlir::Operation 
*op,
                << "C++ ABI '" << abi.getValue()
                << "' is not supported on target '" << triple.getValue() << "'";
 
-    switch (kind) {
-    case clang::TargetCXXABI::GenericItanium:
-    case clang::TargetCXXABI::GenericAArch64:
-    case clang::TargetCXXABI::AppleARM64:
-    case clang::TargetCXXABI::Microsoft:
-      break;
-    default:
-      return op->emitOpError() << "C++ ABI '" << abi.getValue()
-                               << "' is not yet supported by CIR";
-    }
     return success();
   }
 
diff --git 
a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
index 26dbe40c2c93fa..43a27abb98ed16 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
@@ -153,7 +153,8 @@ std::unique_ptr<CIRCXXABI> createItaniumCXXABI(LowerModule 
&lm) {
   case clang::TargetCXXABI::Microsoft:
     llvm_unreachable("Microsoft ABI is not Itanium-based");
   default:
-    llvm_unreachable("Other Itanium ABI?");
+    lm.emitError("createItaniumCXXABI: C++ ABI kind NYI in CIR");
+    return nullptr;
   }
 }
 
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
index c0a650d0eb6a01..1684c0961b95d1 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
@@ -21,6 +21,7 @@
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/CIR/Dialect/IR/CIRDialect.h"
+#include "llvm/ADT/StringRef.h"
 #include <memory>
 
 namespace cir {
@@ -52,6 +53,8 @@ class LowerModule {
   const clang::TargetInfo &getTarget() const { return *target; }
   mlir::MLIRContext *getMLIRContext() { return module.getContext(); }
 
+  void emitError(llvm::StringRef error) const { module->emitError(error); }
+
   const TargetLoweringInfo &getTargetLoweringInfo();
 };
 
diff --git a/clang/test/CIR/IR/invalid-cxx-abi.cir 
b/clang/test/CIR/IR/invalid-cxx-abi.cir
index 5d9ce74313c4fe..dfca283555a797 100644
--- a/clang/test/CIR/IR/invalid-cxx-abi.cir
+++ b/clang/test/CIR/IR/invalid-cxx-abi.cir
@@ -1,4 +1,4 @@
-// RUN: cir-opt %s -verify-diagnostics -split-input-file
+// RUN: cir-opt %s -verify-diagnostics --cir-cxxabi-lowering -split-input-file
 
 // expected-error@+1 {{unknown C++ ABI 'bla'}}
 module attributes {cir.cxx_abi = "bla"} {
@@ -27,6 +27,6 @@ module attributes {cir.triple = "x86_64-unknown-linux-gnu", 
cir.cxx_abi = "micro
 
 // -----
 
-// expected-error@+1 {{C++ ABI 'fuchsia' is not yet supported by CIR}}
+// expected-error@+1 {{createItaniumCXXABI: C++ ABI kind NYI in CIR}}
 module attributes {cir.triple = "aarch64-unknown-fuchsia", cir.cxx_abi = 
"fuchsia"} {
 }

>From e056ae22c4342ff5584e1981b43458d0947e9ba8 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Fri, 9 Oct 2026 08:55:08 -0500
Subject: [PATCH 08/10] Handle the null CXXABI

---
 clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp |  6 +++---
 .../Transforms/TargetLowering/LowerModule.cpp        | 12 +++++++++---
 .../Dialect/Transforms/TargetLowering/LowerModule.h  |  4 ++++
 clang/test/CIR/IR/invalid-cxx-abi.cir                |  1 +
 .../CIR/Transforms/lowering-prepare-no-triple.cir    |  2 +-
 5 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index 3646821ad4b166..c37ddd0c15aa95 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -3183,9 +3183,9 @@ void LoweringPreparePass::runOnOperation() {
 
   lowerModule = cir::createLowerModule(mlirModule);
   if (!lowerModule) {
-    mlirModule.emitError() << getArgument()
-                           << " requires a module with a triple";
-    return signalPassFailure();
+    mlirModule.emitWarning("Cannot create a CIR lower module, skipping the ")
+        << getName() << " pass";
+    return;
   }
 
   llvm::SmallVector<mlir::Operation *> opsToTransform;
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
index be16903f80f4c7..962d340cac1cf0 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
@@ -132,9 +132,15 @@ std::unique_ptr<LowerModule> 
createLowerModule(mlir::ModuleOp module) {
     codeGenOpts.OptimizeSize = optInfo.getSize();
   }
 
-  return std::make_unique<LowerModule>(std::move(langOpts),
-                                       std::move(codeGenOpts), module,
-                                       std::move(targetInfo));
+  auto res =
+      std::make_unique<LowerModule>(std::move(langOpts), 
std::move(codeGenOpts),
+                                    module, std::move(targetInfo));
+
+  // FIXME(cir) this should never happen when all ABIs are implemented.
+  if (!res->hasCXXABI())
+    return nullptr;
+
+  return res;
 }
 
 } // namespace cir
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
index 1684c0961b95d1..d8eb0c901f1680 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
@@ -50,6 +50,10 @@ class LowerModule {
   }
 
   CIRCXXABI &getCXXABI() const { return *abi; }
+
+  // FIXME remove this once all ABIs are supported.
+  bool hasCXXABI() const { return abi != nullptr; }
+
   const clang::TargetInfo &getTarget() const { return *target; }
   mlir::MLIRContext *getMLIRContext() { return module.getContext(); }
 
diff --git a/clang/test/CIR/IR/invalid-cxx-abi.cir 
b/clang/test/CIR/IR/invalid-cxx-abi.cir
index dfca283555a797..08bd7c9cd31a58 100644
--- a/clang/test/CIR/IR/invalid-cxx-abi.cir
+++ b/clang/test/CIR/IR/invalid-cxx-abi.cir
@@ -27,6 +27,7 @@ module attributes {cir.triple = "x86_64-unknown-linux-gnu", 
cir.cxx_abi = "micro
 
 // -----
 
+// expected-warning@+2 {{Cannot create a CIR lower module, skipping the 
CXXABILowering pass}}
 // expected-error@+1 {{createItaniumCXXABI: C++ ABI kind NYI in CIR}}
 module attributes {cir.triple = "aarch64-unknown-fuchsia", cir.cxx_abi = 
"fuchsia"} {
 }
diff --git a/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir 
b/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
index bebdf3dd57f737..d4d6bb1bff3b73 100644
--- a/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
+++ b/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
@@ -1,5 +1,5 @@
 // RUN: cir-opt %s --cir-lowering-prepare -verify-diagnostics
 
-// expected-error @below {{cir-lowering-prepare requires a module with a 
triple}}
+// expected-warning@+1 {{Cannot create a CIR lower module, skipping the 
LoweringPrepare pass}}
 module {
 }

>From 5b8c635da211817e6f0082da17d300817a2c4f8f Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Fri, 9 Oct 2026 14:25:14 -0500
Subject: [PATCH 09/10] Move error reporting to CXXABILowering

---
 clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp  |  8 ++++++++
 clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp |  6 +++---
 .../Transforms/TargetLowering/LowerItaniumCXXABI.cpp |  3 ++-
 .../Transforms/TargetLowering/LowerModule.cpp        | 12 +++---------
 .../Dialect/Transforms/TargetLowering/LowerModule.h  |  2 --
 clang/test/CIR/IR/invalid-cxx-abi.cir                |  3 +--
 .../CIR/Transforms/lowering-prepare-no-triple.cir    |  2 +-
 7 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp 
b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
index af25d662dbb5df..904ee67cd76cd6 100644
--- a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
@@ -908,6 +908,14 @@ void CXXABILoweringPass::runOnOperation() {
     return;
   }
 
+  if (!lowerModule->hasCXXABI()) {
+    mod.emitError() << "C++ ABI '"
+                    << clang::TargetCXXABI::getSpelling(
+                           lowerModule->getCXXABIKind())
+                    << "' is not yet supported by CIR";
+    return signalPassFailure();
+  }
+
   mlir::DataLayout dataLayout(mod);
   CIRABITypeConverter typeConverter(*ctx, dataLayout, *lowerModule);
 
diff --git a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp 
b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
index c37ddd0c15aa95..3646821ad4b166 100644
--- a/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/LoweringPrepare.cpp
@@ -3183,9 +3183,9 @@ void LoweringPreparePass::runOnOperation() {
 
   lowerModule = cir::createLowerModule(mlirModule);
   if (!lowerModule) {
-    mlirModule.emitWarning("Cannot create a CIR lower module, skipping the ")
-        << getName() << " pass";
-    return;
+    mlirModule.emitError() << getArgument()
+                           << " requires a module with a triple";
+    return signalPassFailure();
   }
 
   llvm::SmallVector<mlir::Operation *> opsToTransform;
diff --git 
a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
index 43a27abb98ed16..54fbea11b1d5db 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
@@ -153,7 +153,8 @@ std::unique_ptr<CIRCXXABI> createItaniumCXXABI(LowerModule 
&lm) {
   case clang::TargetCXXABI::Microsoft:
     llvm_unreachable("Microsoft ABI is not Itanium-based");
   default:
-    lm.emitError("createItaniumCXXABI: C++ ABI kind NYI in CIR");
+    // FIXME: not all ABIS are implemented. The error is reported by consumers
+    // of LowerModule/CIRCXXABI when missing CIRCXXABI is encountered.
     return nullptr;
   }
 }
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
index 962d340cac1cf0..be16903f80f4c7 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.cpp
@@ -132,15 +132,9 @@ std::unique_ptr<LowerModule> 
createLowerModule(mlir::ModuleOp module) {
     codeGenOpts.OptimizeSize = optInfo.getSize();
   }
 
-  auto res =
-      std::make_unique<LowerModule>(std::move(langOpts), 
std::move(codeGenOpts),
-                                    module, std::move(targetInfo));
-
-  // FIXME(cir) this should never happen when all ABIs are implemented.
-  if (!res->hasCXXABI())
-    return nullptr;
-
-  return res;
+  return std::make_unique<LowerModule>(std::move(langOpts),
+                                       std::move(codeGenOpts), module,
+                                       std::move(targetInfo));
 }
 
 } // namespace cir
diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
index d8eb0c901f1680..d05d5ed4abd886 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerModule.h
@@ -57,8 +57,6 @@ class LowerModule {
   const clang::TargetInfo &getTarget() const { return *target; }
   mlir::MLIRContext *getMLIRContext() { return module.getContext(); }
 
-  void emitError(llvm::StringRef error) const { module->emitError(error); }
-
   const TargetLoweringInfo &getTargetLoweringInfo();
 };
 
diff --git a/clang/test/CIR/IR/invalid-cxx-abi.cir 
b/clang/test/CIR/IR/invalid-cxx-abi.cir
index 08bd7c9cd31a58..d421367e291a97 100644
--- a/clang/test/CIR/IR/invalid-cxx-abi.cir
+++ b/clang/test/CIR/IR/invalid-cxx-abi.cir
@@ -27,7 +27,6 @@ module attributes {cir.triple = "x86_64-unknown-linux-gnu", 
cir.cxx_abi = "micro
 
 // -----
 
-// expected-warning@+2 {{Cannot create a CIR lower module, skipping the 
CXXABILowering pass}}
-// expected-error@+1 {{createItaniumCXXABI: C++ ABI kind NYI in CIR}}
+// expected-error@+1 {{C++ ABI 'fuchsia' is not yet supported by CIR}}
 module attributes {cir.triple = "aarch64-unknown-fuchsia", cir.cxx_abi = 
"fuchsia"} {
 }
diff --git a/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir 
b/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
index d4d6bb1bff3b73..bebdf3dd57f737 100644
--- a/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
+++ b/clang/test/CIR/Transforms/lowering-prepare-no-triple.cir
@@ -1,5 +1,5 @@
 // RUN: cir-opt %s --cir-lowering-prepare -verify-diagnostics
 
-// expected-warning@+1 {{Cannot create a CIR lower module, skipping the 
LoweringPrepare pass}}
+// expected-error @below {{cir-lowering-prepare requires a module with a 
triple}}
 module {
 }

>From 59c3595ccb11ba9951a57c2434c200822db28f32 Mon Sep 17 00:00:00 2001
From: Mariya Podchishchaeva <[email protected]>
Date: Tue, 20 Oct 2026 03:51:25 -0500
Subject: [PATCH 10/10] Modify the switch

---
 .../TargetLowering/LowerItaniumCXXABI.cpp        | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git 
a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp 
b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
index c8729f0662e82a..962cdd3782adad 100644
--- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/LowerItaniumCXXABI.cpp
@@ -150,13 +150,21 @@ std::unique_ptr<CIRCXXABI> 
createItaniumCXXABI(LowerModule &lm) {
   case clang::TargetCXXABI::GenericItanium:
     return std::make_unique<LowerItaniumCXXABI>(lm);
 
+  case clang::TargetCXXABI::GenericARM:
+  case clang::TargetCXXABI::iOS:
+  case clang::TargetCXXABI::WatchOS:
+  case clang::TargetCXXABI::Fuchsia:
+  case clang::TargetCXXABI::GenericMIPS:
+  case clang::TargetCXXABI::WebAssembly:
+  case clang::TargetCXXABI::XL:
+    // FIXME: these ABIS are not yet implemented by CIR. The error is reported
+    // by consumers of LowerModule/CIRCXXABI when missing CIRCXXABI is
+    // encountered.
+    return nullptr;
   case clang::TargetCXXABI::Microsoft:
     llvm_unreachable("Microsoft ABI is not Itanium-based");
-  default:
-    // FIXME: not all ABIS are implemented. The error is reported by consumers
-    // of LowerModule/CIRCXXABI when missing CIRCXXABI is encountered.
-    return nullptr;
   }
+  llvm_unreachable("bad ABI kind");
 }
 
 static cir::IntType getPtrDiffCIRTy(LowerModule &lm) {

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to