https://github.com/bcardosolopes updated 
https://github.com/llvm/llvm-project/pull/179825

>From 87b5b6128344e60c92376df8c752a60a70c64ff1 Mon Sep 17 00:00:00 2001
From: Bruno Cardoso Lopes <[email protected]>
Date: Fri, 30 Jan 2026 14:36:53 -0800
Subject: [PATCH] [CIR] Add ASTVarDeclInterface for AST attribute access

Add the ASTVarDeclInterface which provides methods to access clang AST
VarDecl information from CIR attributes. This interface enables:
- mangleStaticGuardVariable: Mangle guard variable names using clang's
  MangleContext
- isLocalVarDecl: Check if a variable is function-local
- getTLSKind: Get thread-local storage kind
- isInline: Check if the variable is inline
- getTemplateSpecializationKind: Get template specialization info
- getVarDecl: Direct access to the underlying VarDecl pointer

This infrastructure is needed for proper handling of static local
variables with guard variables in LoweringPrepare.
---
 .../clang/CIR/Interfaces/ASTAttrInterfaces.h  | 22 ++++++++
 .../clang/CIR/Interfaces/ASTAttrInterfaces.td | 51 +++++++++++++++++++
 .../clang/CIR/Interfaces/CMakeLists.txt       |  9 ++++
 .../lib/CIR/Interfaces/ASTAttrInterfaces.cpp  | 21 ++++++++
 clang/lib/CIR/Interfaces/CMakeLists.txt       |  2 +
 5 files changed, 105 insertions(+)
 create mode 100644 clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.h
 create mode 100644 clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.td
 create mode 100644 clang/lib/CIR/Interfaces/ASTAttrInterfaces.cpp

diff --git a/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.h 
b/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.h
new file mode 100644
index 0000000000000..9b06feb1fa06e
--- /dev/null
+++ b/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.h
@@ -0,0 +1,22 @@
+//===- ASTAttrInterfaces.h - CIR AST Interfaces -----------------*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_CIR_INTERFACES_AST_ATTR_INTERFACES_H
+#define CLANG_CIR_INTERFACES_AST_ATTR_INTERFACES_H
+
+#include "mlir/IR/Attributes.h"
+#include "llvm/Support/raw_ostream.h"
+
+#include "clang/AST/Attr.h"
+#include "clang/AST/DeclTemplate.h"
+#include "clang/AST/Mangle.h"
+
+/// Include the generated interface declarations.
+#include "clang/CIR/Interfaces/ASTAttrInterfaces.h.inc"
+
+#endif // CLANG_CIR_INTERFACES_AST_ATTR_INTERFACES_H
diff --git a/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.td 
b/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.td
new file mode 100644
index 0000000000000..8d627b1dff6e9
--- /dev/null
+++ b/clang/include/clang/CIR/Interfaces/ASTAttrInterfaces.td
@@ -0,0 +1,51 @@
+//===- ASTAttrInterfaces.td - CIR AST Interface Definitions -----*- C++ 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_CIR_INTERFACES_AST_ATTR_INTERFACES
+#define MLIR_CIR_INTERFACES_AST_ATTR_INTERFACES
+
+include "mlir/IR/OpBase.td"
+
+let cppNamespace = "::cir" in {
+  def ASTVarDeclInterface : AttrInterface<"ASTVarDeclInterface"> {
+    let methods = [
+      InterfaceMethod<"", "void", "mangleStaticGuardVariable",
+                      (ins "llvm::raw_ostream&":$out), [{}],
+                      /*defaultImplementation=*/[{
+        std::unique_ptr<clang::MangleContext> mangleCtx(
+          $_attr.getAst()->getASTContext().createMangleContext());
+        mangleCtx->mangleStaticGuardVariable($_attr.getAst(), out);
+      }]>,
+      InterfaceMethod<"", "bool", "isLocalVarDecl", (ins), [{}],
+                      /*defaultImplementation=*/[{
+        return $_attr.getAst()->isLocalVarDecl();
+      }]>,
+      InterfaceMethod<"", "clang::VarDecl::TLSKind", "getTLSKind",
+                      (ins), [{}],
+                      /*defaultImplementation=*/[{
+        return $_attr.getAst()->getTLSKind();
+      }]>,
+      InterfaceMethod<"", "bool", "isInline", (ins), [{}],
+                      /*defaultImplementation=*/[{
+        return $_attr.getAst()->isInline();
+      }]>,
+      InterfaceMethod<"", "clang::TemplateSpecializationKind",
+                      "getTemplateSpecializationKind", (ins), [{}],
+                      /*defaultImplementation=*/[{
+        return $_attr.getAst()->getTemplateSpecializationKind();
+      }]>,
+      InterfaceMethod<"Get the underlying VarDecl pointer.",
+                      "const clang::VarDecl *", "getVarDecl", (ins), [{}],
+                      /*defaultImplementation=*/[{
+        return $_attr.getAst();
+      }]>
+    ];
+  }
+} // namespace cir
+
+#endif // MLIR_CIR_INTERFACES_AST_ATTR_INTERFACES
diff --git a/clang/include/clang/CIR/Interfaces/CMakeLists.txt 
b/clang/include/clang/CIR/Interfaces/CMakeLists.txt
index bc8d94ff9dc56..b7f8bd2f64cdb 100644
--- a/clang/include/clang/CIR/Interfaces/CMakeLists.txt
+++ b/clang/include/clang/CIR/Interfaces/CMakeLists.txt
@@ -3,6 +3,14 @@
 # directory which is not the case for CIR (and also FIR, both have similar
 # workarounds).
 
+function(add_clang_mlir_attr_interface interface)
+  set(LLVM_TARGET_DEFINITIONS ${interface}.td)
+  mlir_tablegen(${interface}.h.inc -gen-attr-interface-decls)
+  mlir_tablegen(${interface}.cpp.inc -gen-attr-interface-defs)
+  add_public_tablegen_target(MLIRCIR${interface}IncGen)
+  add_dependencies(mlir-generic-headers MLIRCIR${interface}IncGen)
+endfunction()
+
 function(add_clang_mlir_op_interface interface)
   set(LLVM_TARGET_DEFINITIONS ${interface}.td)
   mlir_tablegen(${interface}.h.inc -gen-op-interface-decls)
@@ -19,6 +27,7 @@ function(add_clang_mlir_type_interface interface)
   add_dependencies(mlir-generic-headers MLIR${interface}IncGen)
 endfunction()
 
+add_clang_mlir_attr_interface(ASTAttrInterfaces)
 add_clang_mlir_op_interface(CIROpInterfaces)
 add_clang_mlir_op_interface(CIRLoopOpInterface)
 add_clang_mlir_type_interface(CIRTypeInterfaces)
diff --git a/clang/lib/CIR/Interfaces/ASTAttrInterfaces.cpp 
b/clang/lib/CIR/Interfaces/ASTAttrInterfaces.cpp
new file mode 100644
index 0000000000000..cffcc94de695d
--- /dev/null
+++ b/clang/lib/CIR/Interfaces/ASTAttrInterfaces.cpp
@@ -0,0 +1,21 @@
+//====- ASTAttrInterfaces.cpp - Interface to AST Attributes 
---------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Defines the interface to AST variable declaration attributes.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/CIR/Interfaces/ASTAttrInterfaces.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/Mangle.h"
+#include "clang/CIR/Dialect/IR/CIRAttrs.h"
+
+using namespace cir;
+
+/// Include the generated attribute interfaces.
+#include "clang/CIR/Interfaces/ASTAttrInterfaces.cpp.inc"
diff --git a/clang/lib/CIR/Interfaces/CMakeLists.txt 
b/clang/lib/CIR/Interfaces/CMakeLists.txt
index 13e4c2040f1c7..33eb169708a4f 100644
--- a/clang/lib/CIR/Interfaces/CMakeLists.txt
+++ b/clang/lib/CIR/Interfaces/CMakeLists.txt
@@ -1,4 +1,5 @@
 add_clang_library(MLIRCIRInterfaces
+  ASTAttrInterfaces.cpp
   CIROpInterfaces.cpp
   CIRLoopOpInterface.cpp
   CIRTypeInterfaces.cpp
@@ -7,6 +8,7 @@ add_clang_library(MLIRCIRInterfaces
   ${MLIR_MAIN_INCLUDE_DIR}/mlir/Interfaces
 
   DEPENDS
+  MLIRCIRASTAttrInterfacesIncGen
   MLIRCIREnumsGen
   MLIRCIRTypeInterfacesIncGen
   MLIRCIRLoopOpInterfaceIncGen

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

Reply via email to