https://gcc.gnu.org/g:143396aebf749f8182c77a077cca3b216a7cbebc

commit r16-5199-g143396aebf749f8182c77a077cca3b216a7cbebc
Author: Antoni Boucher <[email protected]>
Date:   Wed Feb 12 17:32:41 2025 -0500

    libgccjit: Add the function attributes for setting the ABI
    
    gcc/jit/ChangeLog
    
            * jit-playback.cc: Support new function attributes.
            * jit-recording.cc: Support new function attributes.
            * libgccjit.h: Support new function attributes.
    
    gcc/testsuite/ChangeLog:
    
            * jit.dg/all-non-failing-tests.h: Mention new test.
            * jit.dg/test-abi.c: New test.

Diff:
---
 gcc/jit/jit-playback.cc                      | 32 +++++++++++++++++
 gcc/jit/jit-recording.cc                     | 16 +++++++++
 gcc/jit/libgccjit.h                          | 30 ++++++++++++++++
 gcc/testsuite/jit.dg/all-non-failing-tests.h |  3 ++
 gcc/testsuite/jit.dg/test-abi.c              | 51 ++++++++++++++++++++++++++++
 5 files changed, 132 insertions(+)

diff --git a/gcc/jit/jit-playback.cc b/gcc/jit/jit-playback.cc
index 00d5e7290ede..75b51e5c9ad8 100644
--- a/gcc/jit/jit-playback.cc
+++ b/gcc/jit/jit-playback.cc
@@ -580,6 +580,38 @@ const char* fn_attribute_to_string (gcc_jit_fn_attribute 
attr)
       return "weak";
     case GCC_JIT_FN_ATTRIBUTE_NONNULL:
       return "nonnull";
+    case GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL:
+      return "cmse_nonsecure_call";
+    case GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY:
+      return "cmse_nonsecure_entry";
+    case GCC_JIT_FN_ATTRIBUTE_ARM_PCS:
+      return "pcs";
+    case GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT:
+      return "interrupt";
+    case GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK:
+      return "noblock";
+    case GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL:
+      return "signal";
+    case GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL:
+      return "amdgpu_hsa_kernel";
+    case GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT:
+      return "interrupt";
+    case GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL:
+      return "kernel";
+    case GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT:
+      return "interrupt";
+    case GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL:
+      return "fastcall";
+    case GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT:
+      return "interrupt";
+    case GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI:
+      return "ms_abi";
+    case GCC_JIT_FN_ATTRIBUTE_X86_STDCALL:
+      return "stdcall";
+    case GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI:
+      return "sysv_abi";
+    case GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL:
+      return "thiscall";
     case GCC_JIT_FN_ATTRIBUTE_MAX:
       return NULL;
   }
diff --git a/gcc/jit/jit-recording.cc b/gcc/jit/jit-recording.cc
index 5c641f690d68..f5ea37d96e9b 100644
--- a/gcc/jit/jit-recording.cc
+++ b/gcc/jit/jit-recording.cc
@@ -4852,6 +4852,22 @@ static const char * const 
fn_attribute_reproducer_strings[] =
   "GCC_JIT_FN_ATTRIBUTE_CONST",
   "GCC_JIT_FN_ATTRIBUTE_WEAK",
   "GCC_JIT_FN_ATTRIBUTE_NONNULL",
+  "GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL",
+  "GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY",
+  "GCC_JIT_FN_ATTRIBUTE_ARM_PCS",
+  "GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT",
+  "GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK",
+  "GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL",
+  "GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL",
+  "GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT",
+  "GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL",
+  "GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT",
+  "GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL",
+  "GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT",
+  "GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI",
+  "GCC_JIT_FN_ATTRIBUTE_X86_STDCALL",
+  "GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI",
+  "GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL",
 };
 
 std::string
diff --git a/gcc/jit/libgccjit.h b/gcc/jit/libgccjit.h
index 1cc5e6a9946c..f9e18b6147e0 100644
--- a/gcc/jit/libgccjit.h
+++ b/gcc/jit/libgccjit.h
@@ -2139,6 +2139,36 @@ enum gcc_jit_fn_attribute
   GCC_JIT_FN_ATTRIBUTE_WEAK,
   GCC_JIT_FN_ATTRIBUTE_NONNULL,
 
+  // ARM attributes.
+  GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_CALL,
+  GCC_JIT_FN_ATTRIBUTE_ARM_CMSE_NONSECURE_ENTRY,
+  GCC_JIT_FN_ATTRIBUTE_ARM_PCS,
+
+  // AVR attributes.
+  GCC_JIT_FN_ATTRIBUTE_AVR_INTERRUPT,
+  GCC_JIT_FN_ATTRIBUTE_AVR_NOBLOCK,
+  GCC_JIT_FN_ATTRIBUTE_AVR_SIGNAL,
+
+  // AMD GCN attributes.
+  GCC_JIT_FN_ATTRIBUTE_GCN_AMDGPU_HSA_KERNEL,
+
+  // MSP430 attributes.
+  GCC_JIT_FN_ATTRIBUTE_MSP430_INTERRUPT,
+
+  // Nvidia PTX attributes.
+  GCC_JIT_FN_ATTRIBUTE_NVPTX_KERNEL,
+
+  // RISC-V attributes.
+  GCC_JIT_FN_ATTRIBUTE_RISCV_INTERRUPT,
+
+  // x86 attributes.
+  GCC_JIT_FN_ATTRIBUTE_X86_FAST_CALL,
+  GCC_JIT_FN_ATTRIBUTE_X86_INTERRUPT,
+  GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI,
+  GCC_JIT_FN_ATTRIBUTE_X86_STDCALL,
+  GCC_JIT_FN_ATTRIBUTE_X86_SYSV_ABI,
+  GCC_JIT_FN_ATTRIBUTE_X86_THIS_CALL,
+
   /* Maximum value of this enum, should always be last. */
   GCC_JIT_FN_ATTRIBUTE_MAX,
 };
diff --git a/gcc/testsuite/jit.dg/all-non-failing-tests.h 
b/gcc/testsuite/jit.dg/all-non-failing-tests.h
index fe9ad1da3f4d..aa9d34346527 100644
--- a/gcc/testsuite/jit.dg/all-non-failing-tests.h
+++ b/gcc/testsuite/jit.dg/all-non-failing-tests.h
@@ -8,6 +8,9 @@
    hooks provided by each test case.  */
 #define COMBINED_TEST
 
+/* test-abi.c: This can't be in the testcases array as it
+   is target-specific.  */
+
 /* test-accessing-bitfield.c */
 #define create_code create_code_accessing_bitfield
 #define verify_code verify_code_accessing_bitfield
diff --git a/gcc/testsuite/jit.dg/test-abi.c b/gcc/testsuite/jit.dg/test-abi.c
new file mode 100644
index 000000000000..479fe6923078
--- /dev/null
+++ b/gcc/testsuite/jit.dg/test-abi.c
@@ -0,0 +1,51 @@
+/* { dg-do compile { target x86_64-*-* } } */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "libgccjit.h"
+
+#define TEST_COMPILING_TO_FILE
+#define OUTPUT_KIND      GCC_JIT_OUTPUT_KIND_ASSEMBLER
+#define OUTPUT_FILENAME  "output-of-test-restrict.c.s"
+#include "harness.h"
+
+void
+create_code (gcc_jit_context *ctxt, void *user_data)
+{
+       /* Let's try to inject the equivalent of:
+__attribute__((__ms_abi__))
+int t(int x, int y) {
+  return x * y;
+}
+       */
+  gcc_jit_type *int_type =
+    gcc_jit_context_get_type (ctxt, GCC_JIT_TYPE_INT);
+
+  gcc_jit_param *x =
+    gcc_jit_context_new_param (ctxt, NULL, int_type, "x");
+  gcc_jit_param *y =
+    gcc_jit_context_new_param (ctxt, NULL, int_type, "y");
+  gcc_jit_param *params[2] = {x, y};
+
+  gcc_jit_function *func_t =
+    gcc_jit_context_new_function (ctxt, NULL,
+      GCC_JIT_FUNCTION_EXPORTED, int_type, "t",
+      2, params, 0);
+  gcc_jit_function_add_attribute (func_t,
+    GCC_JIT_FN_ATTRIBUTE_X86_MS_ABI);
+
+  gcc_jit_block *block = gcc_jit_function_new_block (func_t, NULL);
+
+  gcc_jit_rvalue *result =
+    gcc_jit_context_new_binary_op (
+      ctxt, NULL, GCC_JIT_BINARY_OP_MULT,
+      int_type,
+      gcc_jit_param_as_rvalue (x),
+      gcc_jit_param_as_rvalue (y));
+
+  gcc_jit_block_end_with_return (block, NULL, result);
+}
+
+/* { dg-final { jit-verify-output-file-was-created "" } } */
+/* { dg-final { jit-verify-assembler-output "movl\\s+%ecx, %eax" } } */

Reply via email to