From 2d1f68e7965795dc66db83bc7840ba7a23eeb01b Mon Sep 17 00:00:00 2001 From: Gaius Mulley Date: Wed, 10 Jul 2024 15:52:37 +0100 Subject: [PATCH] PR modula2/115823 Wrong expansion of isnormal optab The bug fix changes gcc/m2/gm2-gcc/m2builtins.c:m2builtins_BuiltinExists to recognise both __builtin_ and functionname as a builtin. gcc/m2/ChangeLog: PR modula2/115823 * gm2-gcc/m2builtins.cc (struct builtin_macro_definition): New field builtinname. (builtin_function_match): New function. (builtin_macro_match): Ditto. (m2builtins_BuiltinExists): Use builtin_function_match and builtin_macro_match. (lookup_builtin_macro): Use builtin_macro_match. (lookup_builtin_function): Use builtin_function_match. (define_builtin): Assign builtinname field. gcc/testsuite/ChangeLog: PR modula2/115823 * gm2/builtins/run/pass/testalloa.mod: New test. Signed-off-by: Gaius Mulley --- gcc/m2/gm2-gcc/m2builtins.cc | 31 ++++++++++-- .../gm2/builtins/run/pass/testalloa.mod | 47 +++++++++++++++++++ 2 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gm2/builtins/run/pass/testalloa.mod diff --git a/gcc/m2/gm2-gcc/m2builtins.cc b/gcc/m2/gm2-gcc/m2builtins.cc index 31c344c4a59..e3e55a69991 100644 --- a/gcc/m2/gm2-gcc/m2builtins.cc +++ b/gcc/m2/gm2-gcc/m2builtins.cc @@ -396,6 +396,7 @@ struct builtin_type_info struct GTY(()) builtin_macro_definition { const char *name; + const char *builtinname; tree function_node; tree return_node; }; @@ -911,6 +912,26 @@ target_support_exists (struct builtin_function_entry *fe) } } +/* Return true if name matches the builtin name. */ + +static +bool builtin_function_match (struct builtin_function_entry *fe, + const char *name) +{ + return (strcmp (name, fe->name) == 0) + || (strcmp (name, fe->library_name) == 0); +} + +/* Return true if name matches the builtin macro name. */ + +static +bool builtin_macro_match (builtin_macro_definition bmd, + const char *name) +{ + return (strcmp (bmd.name, name) == 0) + || (strcmp (bmd.builtinname, name) == 0); +} + /* BuiltinExists - returns TRUE if the builtin function, name, exists for this target architecture. */ @@ -921,12 +942,11 @@ m2builtins_BuiltinExists (char *name) struct builtin_function_entry *fe; for (fe = &list_of_builtins[0]; fe->name != NULL; fe++) - if (strcmp (name, fe->name) == 0) + if (builtin_function_match (fe, name)) return true; - // return target_support_exists (fe); int length = vec_safe_length (builtin_macros); for (int idx = 0; idx < length; idx++) - if (strcmp ((*builtin_macros)[idx].name, name) == 0) + if (builtin_macro_match ((*builtin_macros)[idx], name)) return true; return false; } @@ -939,7 +959,7 @@ lookup_builtin_macro (location_t location, char *name) { int length = vec_safe_length (builtin_macros); for (int idx = 0; idx < length; idx++) - if (strcmp ((*builtin_macros)[idx].name, name) == 0) + if (builtin_macro_match ((*builtin_macros)[idx], name)) { tree functype = TREE_TYPE ((*builtin_macros)[idx].function_node); tree funcptr = build1 (ADDR_EXPR, build_pointer_type (functype), @@ -965,7 +985,7 @@ lookup_builtin_function (location_t location, char *name) struct builtin_function_entry *fe; for (fe = &list_of_builtins[0]; fe->name != NULL; fe++) - if ((strcmp (name, fe->name) == 0) && target_support_exists (fe)) + if (builtin_function_match (fe, name) && target_support_exists (fe)) { tree functype = TREE_TYPE (fe->function_node); tree funcptr = build1 (ADDR_EXPR, build_pointer_type (functype), @@ -1422,6 +1442,7 @@ define_builtin (enum built_in_function val, const char *name, tree prototype, set_call_expr_flags (decl, flags); set_builtin_decl (val, decl, true); bmd.name = name; + bmd.builtinname = libname; bmd.function_node = decl; bmd.return_node = TREE_TYPE (prototype); vec_safe_push (builtin_macros, bmd); diff --git a/gcc/testsuite/gm2/builtins/run/pass/testalloa.mod b/gcc/testsuite/gm2/builtins/run/pass/testalloa.mod new file mode 100644 index 00000000000..9d88dbae304 --- /dev/null +++ b/gcc/testsuite/gm2/builtins/run/pass/testalloa.mod @@ -0,0 +1,47 @@ +MODULE testalloa ; + +FROM libc IMPORT printf, exit ; +FROM Builtins IMPORT alloca ; +FROM SYSTEM IMPORT ADR, ADDRESS ; + + +(* + assert - +*) + +PROCEDURE assert (value: BOOLEAN; message: ARRAY OF CHAR) ; +BEGIN + IF NOT value + THEN + printf ("test failed: %s\n", ADR (message)) ; + code := 1 + END +END assert ; + + +(* + test - +*) + +PROCEDURE test ; +VAR + ptr: ADDRESS ; +BEGIN + ptr := alloca (10) ; + assert (ptr # NIL, "alloca (10) # NIL") +END test ; + + +VAR + code: INTEGER ; +BEGIN + code := 0 ; + test ; + IF code = 0 + THEN + printf ("all tests pass\n") + ELSE + printf ("some tests failed\n") + END ; + exit (code) +END testalloa.