[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-25 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman closed 
https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-25 Thread via cfe-commits

dingxiangfei2009 wrote:

@AaronBallman Yes, please. I don't have the merge right, so I would like to ask 
for your assistance. Many thanks!

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-25 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman approved this pull request.

LGTM! The precommit CI failures appear to be unrelated.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-23 Thread Aaron Ballman via cfe-commits

AaronBallman wrote:

Precommit CI found a relevant failure on Windows (it looks like we're crashing, 
IIRC that's `STATUS_HEAP_CORRUPTION` as a failure code):
```
 FAIL: Clang :: Index/inline-assembly.c (13090 of 21590)
 TEST 'Clang :: Index/inline-assembly.c' FAILED 

Exit Code: 2

Command Output (stdout):
--
# RUN: at line 13
c:\_work\llvm-project\llvm-project\build\bin\c-index-test.exe 
-test-inline-assembly 
C:\_work\llvm-project\llvm-project\clang\test\Index\inline-assembly.c 2>&1 | 
c:\_work\llvm-project\llvm-project\build\bin\filecheck.exe 
C:\_work\llvm-project\llvm-project\clang\test\Index\inline-assembly.c
# executed command: 
'c:\_work\llvm-project\llvm-project\build\bin\c-index-test.exe' 
-test-inline-assembly 
'C:\_work\llvm-project\llvm-project\clang\test\Index\inline-assembly.c'
# note: command had no output on stdout or stderr
# error: command failed with exit status: 0xc374
# executed command: 
'c:\_work\llvm-project\llvm-project\build\bin\filecheck.exe' 
'C:\_work\llvm-project\llvm-project\clang\test\Index\inline-assembly.c'
# .---command stderr
# | FileCheck error: '' is empty.
# | FileCheck command line:  
c:\_work\llvm-project\llvm-project\build\bin\filecheck.exe 
C:\_work\llvm-project\llvm-project\clang\test\Index\inline-assembly.c
# `-
# error: command failed with exit status: 2

--


```

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-23 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From cbfed6b195083d07330694ae497f59f4007e6a1f Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH 1/2] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  94 +++-
 clang/test/Index/inline-assembly.c  |  48 ++
 clang/tools/c-index-test/c-index-test.c |  52 +++
 clang/tools/libclang/CIndex.cpp | 112 
 clang/tools/libclang/libclang.map   |  10 +++
 5 files changed, 315 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..06732f5942843 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assem

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-22 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From aed0d6e3ead7e691b34f16b7cd8e830860758f2f Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH 1/2] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  94 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 321 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..06732f5942843 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assembly.

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumInputs();
+  }

dingxiangfei2009 wrote:

Applied

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }

dingxiangfei2009 wrote:

Applied as part of the incoming commit.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }

dingxiangfei2009 wrote:

Applied

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);

dingxiangfei2009 wrote:

I replaced it with the proper type.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.

dingxiangfei2009 wrote:

I have given it a good thought. An inline assembly blocking being simple is the 
property that the block contains only the template without register 
placeholders. I think that this property is only interesting to Clang internals 
but it is probably not very remarkable to AST analyzers.

I have decided to remove this API.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);

dingxiangfei2009 wrote:

Note added

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,

dingxiangfei2009 wrote:

Note added

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,

dingxiangfei2009 wrote:

I added a note to explain the return values.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.

dingxiangfei2009 wrote:

I have added a comment to explain how one should interpret the return value. In 
principle, I propose to return `NULL` or `0` in case of counting in case the 
pre-conditions are not met.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-20 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From 830f4e9503e1bc48521dc38397b95546bbcaebe2 Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH 1/2] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  94 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 321 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..06732f5942843 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assembly.

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.

AaronBallman wrote:

What does it mean for assembly to be "simple"?

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }

AaronBallman wrote:

```suggestion
  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor)))
return Stmt->getNumOutputs();
```

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumInputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor, unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr) {

AaronBallman wrote:

`Expr` is a type name same as `Stmt`.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);

AaronBallman wrote:

What does this return on error?

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman commented:

Thanks for working on this! Mostly just nits, the implementation itself looks 
pretty reasonable so far.

Please be sure to add a release note to `clang/docs/ReleaseNotes.rst` so users 
know about the new functionality.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumInputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor, unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr) {
+  if (!clang_isStatement(Cursor.kind) || !Constraint || !Expr)
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor));
+  Stmt && Index < Stmt->getNumInputs()) {
+auto Constraint_ = Stmt->getInputConstraint(Index);
+auto const *Expr_ = Stmt->getInputExpr(Index);

AaronBallman wrote:

Same here about `auto`, but also, try to pick names without a trailing 
underscore a well (which don't conflict with type names, like `Expr`).

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);

AaronBallman wrote:

Please don't use `auto` unless the types are spelled out in the initialization.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.

AaronBallman wrote:

What kind of things does the function return via its return value?

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,

AaronBallman wrote:

What does this return on error? An empty string? Something else?

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {

AaronBallman wrote:

`Stmt` is a type name, better to pick a name which doesn't conflict with a type 
(this helps folks who have editors that don't handle conflicts with type and 
object names for things like autocomplete). Same issue happens in a bunch of 
other functions as well.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -8648,6 +8646,119 @@ void clang_annotateTokens(CXTranslationUnit TU, CXToken 
*Tokens,
   }
 }
 
+//===--===//
+// Operations for querying information of a GCC inline assembly block under a
+// cursor.
+//===--===//
+CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return cxstring::createEmpty();
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+auto const &C = getCursorContext(Cursor);
+auto AsmTemplate = Stmt->generateAsmString(C);
+return cxstring::createDup(AsmTemplate);
+  }
+  return cxstring::createEmpty();
+}
+
+unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->isAsmGoto();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumOutputs();
+  }
+  return 0;
+}
+
+unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor Cursor) {
+  if (!clang_isStatement(Cursor.kind))
+return 0;
+  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor))) {
+return Stmt->getNumInputs();
+  }

AaronBallman wrote:

```suggestion
  if (auto const *Stmt = dyn_cast_or_null(getCursorStmt(Cursor)))
return Stmt->getNumInputs();
```

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits


@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,

AaronBallman wrote:

Same question here.

https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-16 Thread Aaron Ballman via cfe-commits

https://github.com/AaronBallman edited 
https://github.com/llvm/llvm-project/pull/143424
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-10 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From 510960fb00d48ec770f7c46b14418936439a9fe1 Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  94 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 321 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..06732f5942843 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..e1d573b18331c
--- /dev/null
+++ b/clang/test/Index/inline-assembly.c
@@

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-10 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From 78ee7fe5c988061ea64c3f5b3a0dbea84269d67f Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  94 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 321 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..06732f5942843 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,98 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor 
Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor,
+   unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assembly.c
@@

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-09 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From 4f9e599067c954a3ed3028efdc2abd72aa2b775f Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  93 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 320 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..340d050654a69 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,97 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor, unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assembly.c
@@ -0,0 +1,48 @@
+static void inline_assembly_template_regardless_of_target_machine() {
+int tmp;
+asm volatile (
+

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-09 Thread via cfe-commits

https://github.com/dingxiangfei2009 updated 
https://github.com/llvm/llvm-project/pull/143424

>From 2d531acf50a4bdb139736693afd52559830acbbe Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  93 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 320 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..340d050654a69 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,97 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor, unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..2223dd2985f51
--- /dev/null
+++ b/clang/test/Index/inline-assembly.c
@@ -0,0 +1,48 @@
+static void inline_assembly_template_regardless_of_target_machine() {
+int tmp;
+asm volatile (
+

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-09 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang

Author: wieDasDing (dingxiangfei2009)


Changes

[Discourse 
link](https://discourse.llvm.org/t/a-small-proposal-for-extraction-of-inline-assembly-block-information/86658)

We strive for exposing such information using existing stable ABIs. In doing 
so, queries are limited to what the original source holds or the LLVM IR `asm` 
block would expose in connection with attributes that the queries are concerned.

These APIs opens new opportunities for `rust-bindgen` to translate inline 
assemblies in reasonably cases into Rust inline assembly blocks, which would 
further aid better interoperability with other existing code.

---
Full diff: https://github.com/llvm/llvm-project/pull/143424.diff


5 Files Affected:

- (modified) clang/include/clang-c/Index.h (+92-1) 
- (added) clang/test/Index/inline-assembly.c (+48) 
- (modified) clang/tools/c-index-test/c-index-test.c (+52) 
- (modified) clang/tools/libclang/CIndex.cpp (+118-7) 
- (modified) clang/tools/libclang/libclang.map (+10) 


``diff
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..340d050654a69 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,97 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor, unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is simple.
+ */
+
+unsigned clang_Cursor_isGCCAssemblySimple(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is
+ * `volatile`.
+ */
+
+unsigned clang_Cursor_isGCCAssemblyVolatile(CXCursor Cursor);
+
 /**
  * @}
  */
diff --git a/clang/test/Index/inline-assembly.c 
b/clang/test/Index/inline-assembly.c
new file mode 100644
index 0..1953d3d9033ff
--- /dev/null
+++ b/clang/test/Index/inline-assembly.c
@@ -0,0 +1,48 @@
+static void inline_assembly_template_regardl

[clang] [clang-c] introduce queries on GCC-style inline assembly statements (PR #143424)

2025-06-09 Thread via cfe-commits

https://github.com/dingxiangfei2009 created 
https://github.com/llvm/llvm-project/pull/143424

[Discourse 
link](https://discourse.llvm.org/t/a-small-proposal-for-extraction-of-inline-assembly-block-information/86658)

We strive for exposing such information using existing stable ABIs. In doing 
so, queries are limited to what the original source holds or the LLVM IR `asm` 
block would expose in connection with attributes that the queries are concerned.

These APIs opens new opportunities for `rust-bindgen` to translate inline 
assemblies in reasonably cases into Rust inline assembly blocks, which would 
further aid better interoperability with other existing code.

>From 3fca575677fec603a542db59e706077a2aa3a8d4 Mon Sep 17 00:00:00 2001
From: Xiangfei Ding 
Date: Mon, 9 Jun 2025 13:57:18 +
Subject: [PATCH] [clang-c] introduce queries on GCC-style inline assembly
 statements

We strive for exposing such information using existing stable ABIs.
In doing so, queries are limited to what the original source holds
or the LLVM IR `asm` block would expose in connection with attributes
that the queries are concerned.

Signed-off-by: Xiangfei Ding 
---
 clang/include/clang-c/Index.h   |  93 +-
 clang/test/Index/inline-assembly.c  |  48 +
 clang/tools/c-index-test/c-index-test.c |  52 ++
 clang/tools/libclang/CIndex.cpp | 125 ++--
 clang/tools/libclang/libclang.map   |  10 ++
 5 files changed, 320 insertions(+), 8 deletions(-)
 create mode 100644 clang/test/Index/inline-assembly.c

diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index e4cb4327fbaac..340d050654a69 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -36,7 +36,7 @@
 #define CINDEX_VERSION_MAJOR 0
 #define CINDEX_VERSION_MINOR 64
 
-#define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1))
+#define CINDEX_VERSION_ENCODE(major, minor) (((major) * 1) + ((minor) * 1))
 
 #define CINDEX_VERSION 
\
   CINDEX_VERSION_ENCODE(CINDEX_VERSION_MAJOR, CINDEX_VERSION_MINOR)
@@ -4495,6 +4495,97 @@ CINDEX_LINKAGE CXStringSet 
*clang_Cursor_getCXXManglings(CXCursor);
  */
 CINDEX_LINKAGE CXStringSet *clang_Cursor_getObjCManglings(CXCursor);
 
+/**
+ * @}
+ */
+
+/**
+ * \defgroup CINDEX_MODULE Inline Assembly introspection
+ *
+ * The functions in this group provide access to information about GCC-style
+ * inline assembly statements.
+ *
+ * @{
+ */
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, return the assembly template string.
+ * As per LLVM IR Assembly Template language, template placeholders for
+ * inputs and outputs are either of the form $N where N is a decimal number
+ * as an index into the input-output specification,
+ * or ${N:M} where N is a decimal number also as an index into the
+ * input-output specification and M is the template argument modifier.
+ * The index N in both cases points into the the total inputs and outputs,
+ * or more specifically, into the list of outputs followed by the inputs,
+ * starting from index 0 as the first available template argument.
+ */
+
+CINDEX_LINKAGE CXString clang_Cursor_getGCCAssemblyTemplate(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the assembly block has goto
+ * labels.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_isGCCAssemblyHasGoto(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of outputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumOutputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the number of inputs
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyNumInputs(CXCursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th input.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyInput(CXCursor Cursor,
+ unsigned Index,
+ CXString *Constraint,
+ CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the constraint and expression cursor
+ * to the Index-th output.
+ */
+
+CINDEX_LINKAGE unsigned clang_Cursor_getGCCAssemblyOutput(CXCursor Cursor,
+  unsigned Index,
+  CXString *Constraint,
+  CXCursor *Expr);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, count the clobbers in it.
+ */
+
+unsigned clang_Cursor_getGCCAssemblyNumClobbers(CXCursor Cursor);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, get the Index-th clobber of it.
+ */
+
+CXString clang_Cursor_getGCCAssemblyClobber(CXCursor Cursor, unsigned Index);
+
+/**
+ * Given a CXCursor_GCCAsmStmt cursor, check if the inline assembly is