Signed-off-by: Jose E. Marchesi <[email protected]>
gcc/ChangeLog
* algol68/a68-low-builtins.cc: New file.
---
gcc/algol68/a68-low-builtins.cc | 533 ++++++++++++++++++++++++++++++++
1 file changed, 533 insertions(+)
create mode 100644 gcc/algol68/a68-low-builtins.cc
diff --git a/gcc/algol68/a68-low-builtins.cc b/gcc/algol68/a68-low-builtins.cc
new file mode 100644
index 00000000000..eabf7b34835
--- /dev/null
+++ b/gcc/algol68/a68-low-builtins.cc
@@ -0,0 +1,533 @@
+/* GCC built-ins support for Algol 68.
+ Copyright (C) 2025 Jose E. Marchesi.
+
+ Written by Jose E. Marchesi.
+
+ GCC is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
+ License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#include "config.h"
+#include "system.h"
+#include "coretypes.h"
+
+#include "tree.h"
+#include "fold-const.h"
+#include "langhooks.h"
+#include "tm.h"
+#include "function.h"
+#include "cgraph.h"
+#include "toplev.h"
+#include "varasm.h"
+#include "predict.h"
+#include "stor-layout.h"
+#include "tree-iterator.h"
+#include "stringpool.h"
+#include "print-tree.h"
+#include "gimplify.h"
+#include "dumpfile.h"
+#include "convert.h"
+
+#include "a68.h"
+
+/* Define a built-in function. */
+
+static void
+local_define_builtin (const char *name, tree type, enum built_in_function code,
+ const char *library_name, int ecf_flags)
+{
+ tree decl;
+
+ decl = add_builtin_function (name, type, code, BUILT_IN_NORMAL,
+ library_name, NULL_TREE);
+ set_call_expr_flags (decl, ecf_flags);
+ set_builtin_decl (code, decl, true);
+}
+
+/* Install the GCC built-ins so the front-end can use them. */
+
+void
+a68_install_builtins (void)
+{
+ if (!builtin_decl_explicit_p (BUILT_IN_IROUNDF))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_iroundf", ftype, BUILT_IN_IROUNDF,
+ "iroundf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LROUNDF))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lroundf", ftype, BUILT_IN_LROUNDF,
+ "lroundf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLROUNDF))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llroundf", ftype, BUILT_IN_LLROUNDF,
+ "llroundf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_IROUND))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_iround", ftype, BUILT_IN_IROUND,
+ "iround", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LROUND))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lround", ftype, BUILT_IN_LROUND,
+ "lround", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLROUND))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llround", ftype, BUILT_IN_LLROUND,
+ "llround", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_IROUNDL))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_iroundl", ftype, BUILT_IN_IROUNDL,
+ "iroundl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LROUNDL))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lroundl", ftype, BUILT_IN_LROUNDL,
+ "lroundl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLROUNDL))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llroundl", ftype, BUILT_IN_LLROUNDL,
+ "llroundl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_IFLOORF))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_ifloorf", ftype, BUILT_IN_IFLOORF,
+ "ifloorf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LFLOORF))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lfloorf", ftype, BUILT_IN_LFLOORF,
+ "lfloorf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLFLOORF))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llfloorf", ftype, BUILT_IN_LLFLOORF,
+ "llfloorf", ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_IFLOOR))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_ifloor", ftype, BUILT_IN_IFLOOR,
+ "ifloor", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LFLOOR))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lfloor", ftype, BUILT_IN_LFLOOR,
+ "lfloor", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLFLOOR))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llfloor", ftype, BUILT_IN_LLFLOOR,
+ "llfloor", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_IFLOORL))
+ {
+ tree ftype = build_function_type_list (integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_ifloorl", ftype, BUILT_IN_IFLOORL,
+ "ifloorl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LFLOORL))
+ {
+ tree ftype = build_function_type_list (long_integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_lfloorl", ftype, BUILT_IN_LFLOORL,
+ "lfloorl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LLFLOORL))
+ {
+ tree ftype = build_function_type_list (long_long_integer_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_llfloorl", ftype, BUILT_IN_LLFLOORL,
+ "llfloorl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POWF))
+ {
+ tree ftype = build_function_type_list (float_type_node,
+ float_type_node, float_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_powf", ftype, BUILT_IN_POWF,
+ "powf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POWIF))
+ {
+ tree ftype = build_function_type_list (float_type_node,
+ float_type_node, integer_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_powif", ftype, BUILT_IN_POWIF,
+ "powif", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POW))
+ {
+ tree ftype = build_function_type_list (double_type_node,
+ double_type_node, double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_pow", ftype, BUILT_IN_POW,
+ "pow", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POWI))
+ {
+ tree ftype = build_function_type_list (double_type_node,
+ double_type_node,
integer_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_powi", ftype, BUILT_IN_POWI,
+ "powi", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POWL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_powl", ftype, BUILT_IN_POWL,
+ "powl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_POWIL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
integer_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_powil", ftype, BUILT_IN_POWIL,
+ "powil", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_CALLOC))
+ {
+ tree ftype = build_function_type_list (ptr_type_node,
+ size_type_node, size_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_calloc", ftype, BUILT_IN_CALLOC,
+ "calloc", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_MEMCPY))
+ {
+ tree ftype = build_function_type_list (ptr_type_node,
+ ptr_type_node,
const_ptr_type_node, size_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_memcpy", ftype, BUILT_IN_MEMSET,
+ "memcpy", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_MEMSET))
+ {
+ tree ftype = build_function_type_list (ptr_type_node,
+ ptr_type_node, integer_type_node,
size_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_memset", ftype, BUILT_IN_MEMSET,
+ "memset", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SQRTF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_sqrtf", ftype, BUILT_IN_SQRTF,
+ "sqrtf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SQRT))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_sqrt", ftype, BUILT_IN_SQRT,
+ "sqrt", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SQRTL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_sqrtl", ftype, BUILT_IN_SQRTL,
+ "sqrtl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_TANF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_tanf", ftype, BUILT_IN_TANF,
+ "tanf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_TAN))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_tan", ftype, BUILT_IN_TAN,
+ "tan", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_TANL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_tanl", ftype, BUILT_IN_TANL,
+ "tanl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SINF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_sinf", ftype, BUILT_IN_SINF,
+ "sinf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SIN))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_sin", ftype, BUILT_IN_SIN,
+ "sin", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_SINL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_sinl", ftype, BUILT_IN_SINL,
+ "sinl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_COSF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_cosf", ftype, BUILT_IN_COSF,
+ "cosf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_COS))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_cos", ftype, BUILT_IN_COS,
+ "cos", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_COSL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_cosl", ftype, BUILT_IN_COSL,
+ "cosl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ACOSF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_acosf", ftype, BUILT_IN_ACOSF,
+ "acosf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ACOS))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_acos", ftype, BUILT_IN_ACOS,
+ "acos", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ACOSL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_acosl", ftype, BUILT_IN_ACOSL,
+ "acosl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ASINF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_asinf", ftype, BUILT_IN_ASINF,
+ "asinf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ASIN))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_asin", ftype, BUILT_IN_ASIN,
+ "asin", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ASINL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_asinl", ftype, BUILT_IN_ASINL,
+ "asinl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ATANF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_atanf", ftype, BUILT_IN_ATANF,
+ "atanf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ATAN))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_atan", ftype, BUILT_IN_ATAN,
+ "atan", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_ATANL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_atanl", ftype, BUILT_IN_ATANL,
+ "atanl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOGF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_logf", ftype, BUILT_IN_LOGF,
+ "logf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOG))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_log", ftype, BUILT_IN_LOG,
+ "log", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOGL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_logl", ftype, BUILT_IN_LOGL,
+ "logl", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOG10F))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_log10f", ftype, BUILT_IN_LOG10F,
+ "log10f", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOG10))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_log10", ftype, BUILT_IN_LOG10,
+ "log10", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_LOG10L))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_log10l", ftype, BUILT_IN_LOG10L,
+ "log10l", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_EXPF))
+ {
+ tree ftype = build_function_type_list (float_type_node, float_type_node,
NULL_TREE);
+ local_define_builtin ("__builtin_expf", ftype, BUILT_IN_EXPF,
+ "expf", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_EXP))
+ {
+ tree ftype = build_function_type_list (double_type_node,
double_type_node, NULL_TREE);
+ local_define_builtin ("__builtin_exp", ftype, BUILT_IN_EXP,
+ "exp", ECF_NOTHROW | ECF_LEAF);
+ }
+
+ if (!builtin_decl_explicit_p (BUILT_IN_EXPL))
+ {
+ tree ftype = build_function_type_list (long_double_type_node,
+ long_double_type_node,
+ NULL_TREE);
+ local_define_builtin ("__builtin_expl", ftype, BUILT_IN_EXPL,
+ "expl", ECF_NOTHROW | ECF_LEAF);
+ }
+}
--
2.30.2