aboutsummaryrefslogtreecommitdiff
path: root/clang/tools/c-index-test/c-index-test.c
diff options
context:
space:
mode:
authorwieDasDing <6884440+dingxiangfei2009@users.noreply.github.com>2025-06-25 16:08:56 +0200
committerGitHub <noreply@github.com>2025-06-25 10:08:56 -0400
commitd76fdf7f536c45adc08bdbeaf8b78439d604faf5 (patch)
tree03c5195da69f5dda599051d8912b45c579ec5426 /clang/tools/c-index-test/c-index-test.c
parentfd3cc204de96728991837259ba3959dd69a235b6 (diff)
downloadllvm-d76fdf7f536c45adc08bdbeaf8b78439d604faf5.zip
llvm-d76fdf7f536c45adc08bdbeaf8b78439d604faf5.tar.gz
llvm-d76fdf7f536c45adc08bdbeaf8b78439d604faf5.tar.bz2
[clang-c] introduce queries on GCC-style inline assembly statements (#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. --------- Signed-off-by: Xiangfei Ding <dingxiangfei2009@protonmail.ch>
Diffstat (limited to 'clang/tools/c-index-test/c-index-test.c')
-rw-r--r--clang/tools/c-index-test/c-index-test.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c
index 4a887cd..cb32457 100644
--- a/clang/tools/c-index-test/c-index-test.c
+++ b/clang/tools/c-index-test/c-index-test.c
@@ -1989,6 +1989,51 @@ static enum CXChildVisitResult PrintDeclAttributes(CXCursor cursor, CXCursor p,
}
/******************************************************************************/
+/* Inline assembly cursor testing */
+/******************************************************************************/
+
+static enum CXChildVisitResult
+PrintGCCInlineAssembly(CXCursor cursor, CXCursor p, CXClientData d) {
+ CXString Constraint, Template, Clobber;
+ CXCursor Expr;
+ unsigned hasGoto, i, e;
+ if (clang_getCursorKind(cursor) != CXCursor_AsmStmt)
+ return CXChildVisit_Recurse;
+
+ hasGoto = clang_Cursor_isGCCAssemblyHasGoto(cursor);
+ printf("===ASM TEMPLATE%s===\n", hasGoto ? " (WITH GOTO)" : "");
+ Template = clang_Cursor_getGCCAssemblyTemplate(cursor);
+ printf("%s", clang_getCString(Template));
+ clang_disposeString(Template);
+ printf("\n===ASM TEMPLATE END===\n");
+
+ printf("volatile: %s\n",
+ clang_Cursor_isGCCAssemblyVolatile(cursor) ? "true" : "false");
+
+ for (i = 0, e = clang_Cursor_getGCCAssemblyNumOutputs(cursor); i < e; ++i) {
+ clang_Cursor_getGCCAssemblyOutput(cursor, i, &Constraint, &Expr);
+ printf("Output #%d Constraint (%s): ", i, clang_getCString(Constraint));
+ PrintCursor(Expr, NULL);
+ printf("\n");
+ clang_disposeString(Constraint);
+ }
+ for (i = 0, e = clang_Cursor_getGCCAssemblyNumInputs(cursor); i < e; ++i) {
+ clang_Cursor_getGCCAssemblyInput(cursor, i, &Constraint, &Expr);
+ printf("Input #%d Constraint (%s): ", i, clang_getCString(Constraint));
+ PrintCursor(Expr, NULL);
+ printf("\n");
+ clang_disposeString(Constraint);
+ }
+ for (i = 0, e = clang_Cursor_getGCCAssemblyNumClobbers(cursor); i < e; ++i) {
+ Clobber = clang_Cursor_getGCCAssemblyClobber(cursor, i);
+ printf("Clobber #%d: %s\n", i, clang_getCString(Clobber));
+ clang_disposeString(Clobber);
+ }
+ printf("===ASM END===\n");
+ return CXChildVisit_Recurse;
+}
+
+/******************************************************************************/
/* Target information testing. */
/******************************************************************************/
@@ -5010,6 +5055,7 @@ static void print_usage(void) {
" c-index-test -test-annotate-tokens=<range> {<args>}*\n"
" c-index-test -test-inclusion-stack-source {<args>}*\n"
" c-index-test -test-inclusion-stack-tu <AST file>\n");
+ fprintf(stderr, " c-index-test -test-inline-assembly <AST file>\n");
fprintf(stderr,
" c-index-test -test-print-linkage-source {<args>}*\n"
" c-index-test -test-print-visibility {<args>}*\n"
@@ -5167,6 +5213,10 @@ int cindextest_main(int argc, const char **argv) {
else if (argc > 2 && strstr(argv[1], "-single-symbol-sgf-for=") == argv[1])
return perform_test_single_symbol_sgf(argv[1], argc - 2, argv + 2);
+ if (argc > 2 && strstr(argv[1], "-test-inline-assembly") == argv[1])
+ return perform_test_load_source(argc - 2, argv + 2, "all",
+ PrintGCCInlineAssembly, NULL);
+
print_usage();
return 1;
}