From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1499) id 2F5753858422; Tue, 19 Sep 2023 18:24:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2F5753858422 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1695147863; bh=/kfFhSiVPSETg6PeqfJ58rwYuu92AGAv0EXXQowq+7A=; h=From:To:Subject:Date:From; b=s74+LL/7O1OxlFEYfj42AGWlOpGF7JwUE38DxwW++Ub/A14vq9g6FT/Huyd76yyTD vGrFxidvF4KrqvApHx6ldec+lUq31SIXvP1J5eeuVOilaVfZYfZTkhU6s95PzC2bqr tsh9wy2MZtjgaUOWX0t06kzPyJaCO0pjmNR34/Qo= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Gaius Mulley To: gcc-cvs@gcc.gnu.org Subject: [gcc r14-4149] PR 108143/modula2 LONGREAL and powerpc64le-linux X-Act-Checkin: gcc X-Git-Author: Gaius Mulley X-Git-Refname: refs/heads/master X-Git-Oldrev: eec7c373c2de6d5806537552de5f5b2bd064c43e X-Git-Newrev: 81d5ca0b9b8431f1bd7a5ec8a2c94f04bb0cf032 Message-Id: <20230919182423.2F5753858422@sourceware.org> Date: Tue, 19 Sep 2023 18:24:23 +0000 (GMT) List-Id: https://gcc.gnu.org/g:81d5ca0b9b8431f1bd7a5ec8a2c94f04bb0cf032 commit r14-4149-g81d5ca0b9b8431f1bd7a5ec8a2c94f04bb0cf032 Author: Gaius Mulley Date: Tue Sep 19 19:23:03 2023 +0100 PR 108143/modula2 LONGREAL and powerpc64le-linux This patch introduces a configure for LONGREAL as float128 when targetting or hosting cc1gm2 on ppc64le. It fixes calls to builtins and fixes the -fdebug-builtins option. gcc/ChangeLog: * doc/gm2.texi (fdebug-builtins): Correct description. gcc/m2/ChangeLog: * Make-lang.in (host_mc_longreal): Detect hosting on powerpc64le and if so use __float128 for longreal in mc. (MC_ARGS): Append host_mc_longreal. * config-make.in (TEST_TARGET_CPU_DEFAULT): New variable. (TEST_HOST_CPU_DEFAULT): New variable. * configure: Regenerate. * configure.ac (M2C_LONGREAL_FLOAT128): New define set if target is powerpc64le. (M2C_LONGREAL_PPC64LE): New define set if target is powerpc64le. * gm2-compiler/M2GCCDeclare.mod: Correct comment case. * gm2-compiler/M2GenGCC.mod (MaybeDebugBuiltinAlloca): Call SetLastFunction for the builtin function call. (MaybeDebugBuiltinMemcpy): Call SetLastFunction for the builtin function call. (MaybeDebugBuiltinMemset): New procedure function. (MakeCopyUse): Use GNU formatting. (UseBuiltin): Rewrite to check BuiltinExists. (CodeDirectCall): Rewrite to check BuiltinExists and call SetLastFunction. (CodeMakeAdr): Re-format. * gm2-compiler/M2Options.def (SetDebugBuiltins): New procedure. * gm2-compiler/M2Options.mod (SetUninitVariableChecking): Allow "cond" to switch UninitVariableConditionalChecking separately. (SetDebugBuiltins): New procedure. * gm2-compiler/M2Quads.def (BuildFunctionCall): Add parameter ConstExpr. * gm2-compiler/M2Quads.mod (BuildRealProcedureCall): Add parameter to BuildRealFuncProcCall. (BuildRealFuncProcCall): Add ConstExpr parameter. Pass ConstExpr to BuildFunctionCall. (BuildFunctionCall): Add parameter ConstExpr. Pass ConstExpr to BuildRealFunctionCall. (BuildConstFunctionCall): Add parameter ConstExpr. Pass ConstExpr to BuildFunctionCall. (BuildRealFunctionCall): Add parameter ConstExpr. Pass ConstExpr to BuildRealFuncProcCall. * gm2-compiler/P3Build.bnf (SetOrDesignatorOrFunction): Pass FALSE to BuildFunctionCall. (AssignmentOrProcedureCall): Pass FALSE to BuildFunctionCall. * gm2-compiler/SymbolTable.def (IsProcedureBuiltinAvailable): New procedure function. * gm2-compiler/SymbolTable.mod (CanUseBuiltin): New procedure function. (IsProcedureBuiltinAvailable): New procedure function. * gm2-gcc/m2builtins.cc (DEBUGGING): Undef. (bf_category): New enum type. (struct builtin_function_entry): New field function_avail. (m2builtins_BuiltInMemCopy): Rename from ... (m2builtins_BuiltinMemCopy): ... this. (DoBuiltinMemSet): New function. (m2builtins_BuiltinMemSet): New function. (do_target_support_exists): New function. (target_support_exists): New function. (m2builtins_BuiltinExists): Return true or false. (m2builtins_BuildBuiltinTree): Rename local variables. Replace long_double_type_node with GetM2LongRealType. (m2builtins_init): Use GetM2LongRealType rather than long_double_type_node. * gm2-gcc/m2builtins.def (BuiltInMemCopy): Rename to ... (BuiltinMemCopy): ... this. (BuiltinMemSet): New procedure function. * gm2-gcc/m2builtins.h (m2builtins_BuiltInMemCopy): Rename to ... (m2builtins_BuiltinMemCopy): ... this. (m2builtins_BuiltinMemSet): New procedure function. * gm2-gcc/m2configure.cc (m2configure_M2CLongRealFloat128): New procedure function. (m2configure_M2CLongRealIBM128): New procedure function. (m2configure_M2CLongRealLongDouble): New procedure function. (m2configure_M2CLongRealLongDoublePPC64LE): New procedure function. * gm2-gcc/m2configure.def (M2CLongRealFloat128): New procedure function. (M2CLongRealIBM128): New procedure function. (M2CLongRealLongDouble): New procedure function. (M2CLongRealLongDoublePPC64LE): New procedure function. * gm2-gcc/m2configure.h (m2configure_FullPathCPP): New procedure function. (m2configure_M2CLongRealFloat128): New procedure function. (m2configure_M2CLongRealIBM128): New procedure function. (m2configure_M2CLongRealLongDouble): New procedure function. (m2configure_M2CLongRealLongDoublePPC64LE): New procedure function. * gm2-gcc/m2convert.cc (m2convert_BuildConvert): Use convert_loc. * gm2-gcc/m2options.h (M2Options_SetDebugBuiltins): New function. * gm2-gcc/m2statement.cc (m2statement_BuildAssignmentTree): Set TREE_USED to true. (m2statement_BuildGoto):Set TREE_USED to true. (m2statement_BuildParam): Set TREE_USED to true. (m2statement_BuildBuiltinCallTree): New function. (m2statement_BuildFunctValue): Set TREE_USED to true. * gm2-gcc/m2statement.def (BuildBuiltinCallTree): New procedure function. * gm2-gcc/m2statement.h (m2statement_BuildBuiltinCallTree): New procedure function. * gm2-gcc/m2treelib.cc (m2treelib_DoCall0): Remove spacing. (m2treelib_DoCall1): Remove spacing. (m2treelib_DoCall2): Remove spacing. (m2treelib_DoCall3): Remove spacing. (add_stmt): Rename parameter. * gm2-gcc/m2type.cc (build_set_type): Remove spacing. (build_m2_specific_size_type): Remove spacing. (finish_build_pointer_type): Remove spacing. (m2type_BuildVariableArrayAndDeclare): Remove spacing. (build_m2_short_real_node): Remove spacing. (build_m2_real_node): Remove spacing. (build_m2_long_real_node): Use float128_type_node if M2CLongRealFloat128 is set. (build_m2_ztype_node): Remove spacing. (build_m2_long_int_node): Remove spacing. (build_m2_long_card_node): Remove spacing. (build_m2_short_int_node): Remove spacing. (build_m2_short_card_node): Remove spacing. (build_m2_iso_loc_node): Remove spacing. (m2type_SameRealType): New function. (m2type_InitBaseTypes): Create m2_c_type_node using m2_long_complex_type_node. (m2type_SetAlignment): Tidy up comment. * gm2-gcc/m2type.def (SameRealType): New procedure function. * gm2-gcc/m2type.h (m2type_SameRealType): New procedure function. * gm2-lang.cc (gm2_langhook_type_for_mode): Build long complex node from m2 language specific long double node. * gm2-libs-log/RealConversions.mod (IsNan): New procedure function. (doPowerOfTen): Re-implement. * gm2-libs/Builtins.mod: Add newline. * gm2-libs/DynamicStrings.def (ReplaceChar): New procedure function. * gm2-libs/DynamicStrings.mod (ReplaceChar): New procedure function. * gm2config.aci.in (M2C_LONGREAL_FLOAT128): New config value. (M2C_LONGREAL_PPC64LE): New config value. * gm2spec.cc (lang_specific_driver): New local variable need_default_mabi set to default value depending upon M2C_LONGREAL_PPC64LE and M2C_LONGREAL_FLOAT128. * lang.opt (Wcase-enum): Moved to correct section. * m2pp.cc (m2pp_real_type): New function. (m2pp_type): Call m2pp_real_type. (m2pp_print_mode): New function. (m2pp_simple_type): Call m2pp_simple_type. (m2pp_float): New function. (m2pp_expression): Call m2pp_float. * mc-boot/GDynamicStrings.cc: Rebuild. * mc-boot/GDynamicStrings.h: Rebuild. * mc-boot/GFIO.cc: Rebuild. * mc-boot/GFIO.h: Rebuild. * mc-boot/GIO.cc: Rebuild. * mc-boot/GRTint.cc: Rebuild. * mc-boot/Gdecl.cc: Rebuild. * mc-boot/GmcOptions.cc: Rebuild. * mc-boot/GmcOptions.h: Rebuild. * mc/decl.mod: Rebuild. * mc/mcOptions.def (getCRealType): New procedure function. (getCLongRealType): New procedure function. (getCShortRealType): New procedure function. * mc/mcOptions.mod (getCRealType): New procedure function. (getCLongRealType): New procedure function. (getCShortRealType): New procedure function. libgm2/ChangeLog: * Makefile.am (TARGET_LONGDOUBLE_ABI): New variable set to -mabi=ieeelongdouble if the target is powerpc64le. (AM_MAKEFLAGS): Append TARGET_LONGDOUBLE_ABI. * Makefile.in: Rebuild. * libm2cor/Makefile.am (AM_MAKEFLAGS): Add CFLAGS_LONGDOUBLE and TARGET_LONGDOUBLE_ABI. (libm2cor_la_CFLAGS): Add TARGET_LONGDOUBLE_ABI. (libm2cor_la_M2FLAGS): Add TARGET_LONGDOUBLE_ABI. * libm2cor/Makefile.in: Rebuild. * libm2iso/Makefile.am (AM_MAKEFLAGS): Add CFLAGS_LONGDOUBLE and TARGET_LONGDOUBLE_ABI. (libm2iso_la_CFLAGS): Add TARGET_LONGDOUBLE_ABI. (libm2iso_la_M2FLAGS): Add TARGET_LONGDOUBLE_ABI. * libm2iso/Makefile.in: Rebuild. * libm2log/Makefile.am (AM_MAKEFLAGS): Add CFLAGS_LONGDOUBLE and TARGET_LONGDOUBLE_ABI. (libm2log_la_CFLAGS): Add TARGET_LONGDOUBLE_ABI. (libm2log_la_M2FLAGS): Add TARGET_LONGDOUBLE_ABI. * libm2log/Makefile.in: Rebuild. * libm2min/Makefile.am (AM_MAKEFLAGS): Add CFLAGS_LONGDOUBLE and TARGET_LONGDOUBLE_ABI. (libm2min_la_CFLAGS): Add TARGET_LONGDOUBLE_ABI. (libm2min_la_M2FLAGS): Add TARGET_LONGDOUBLE_ABI. * libm2min/Makefile.in: Rebuild. * libm2pim/Makefile.am (AM_MAKEFLAGS): Add CFLAGS_LONGDOUBLE and TARGET_LONGDOUBLE_ABI. (libm2pim_la_CFLAGS): Add TARGET_LONGDOUBLE_ABI. (libm2pim_la_M2FLAGS): Add TARGET_LONGDOUBLE_ABI. * libm2pim/Makefile.in: Rebuild. gcc/testsuite/ChangeLog: * gm2/extensions/pass/libc.def: Add spacing. * gm2/pimlib/logitech/run/pass/realconv.mod: Add debugging print. * gm2/switches/uninit-variable-checking/cascade/fail/switches-uninit-variable-checking-cascade-fail.exp: Add -fdebug-builtins flag. * lib/gm2.exp (gm2_target_compile_default): Add -mabi=ieeelongdouble if the target is powerpc. (gm2_link_flags): Add -mabi=ieeelongdouble if the target is powerpc. * gm2/pim/intrinsic/run/pass/cstub.c: New test. * gm2/pim/intrinsic/run/pass/cstub.def: New test. * gm2/pim/intrinsic/run/pass/pim-intrinsic-run-pass.exp: New test. * gm2/pim/intrinsic/run/pass/test.mod: New test. * gm2/pim/run/pass/builtins.mod: New test. * gm2/pim/run/pass/convert1.mod: New test. * gm2/pim/run/pass/longint1.mod: New test. * gm2/pim/run/pass/longint2.mod: New test. * gm2/pim/run/pass/longint3.mod: New test. * gm2/pim/run/pass/longint4.mod: New test. * gm2/pim/run/pass/longint5.mod: New test. * gm2/pim/run/pass/longint6.mod: New test. * gm2/pim/run/pass/longint7.mod: New test. * gm2/pim/run/pass/longint8.mod: New test. Signed-off-by: Gaius Mulley Diff: --- gcc/doc/gm2.texi | 2 +- gcc/m2/Make-lang.in | 6 +- gcc/m2/config-make.in | 6 +- gcc/m2/configure | 19 + gcc/m2/configure.ac | 7 + gcc/m2/gm2-compiler/M2GCCDeclare.mod | 2 +- gcc/m2/gm2-compiler/M2GenGCC.mod | 280 ++++++++------ gcc/m2/gm2-compiler/M2Options.def | 10 +- gcc/m2/gm2-compiler/M2Options.mod | 25 +- gcc/m2/gm2-compiler/M2Quads.def | 2 +- gcc/m2/gm2-compiler/M2Quads.mod | 81 ++-- gcc/m2/gm2-compiler/P3Build.bnf | 4 +- gcc/m2/gm2-compiler/SymbolTable.def | 9 + gcc/m2/gm2-compiler/SymbolTable.mod | 27 +- gcc/m2/gm2-gcc/m2builtins.cc | 426 +++++++++++++-------- gcc/m2/gm2-gcc/m2builtins.def | 11 +- gcc/m2/gm2-gcc/m2builtins.h | 4 +- gcc/m2/gm2-gcc/m2configure.cc | 48 +++ gcc/m2/gm2-gcc/m2configure.def | 36 +- gcc/m2/gm2-gcc/m2configure.h | 15 +- gcc/m2/gm2-gcc/m2convert.cc | 2 +- gcc/m2/gm2-gcc/m2options.h | 1 + gcc/m2/gm2-gcc/m2statement.cc | 25 +- gcc/m2/gm2-gcc/m2statement.def | 7 + gcc/m2/gm2-gcc/m2statement.h | 2 + gcc/m2/gm2-gcc/m2treelib.cc | 10 +- gcc/m2/gm2-gcc/m2type.cc | 42 +- gcc/m2/gm2-gcc/m2type.def | 7 + gcc/m2/gm2-gcc/m2type.h | 2 + gcc/m2/gm2-lang.cc | 14 + gcc/m2/gm2-libs-log/RealConversions.mod | 48 ++- gcc/m2/gm2-libs/Builtins.mod | 1 + gcc/m2/gm2-libs/DynamicStrings.def | 10 +- gcc/m2/gm2-libs/DynamicStrings.mod | 25 ++ gcc/m2/gm2config.aci.in | 6 + gcc/m2/gm2spec.cc | 24 ++ gcc/m2/lang.opt | 24 +- gcc/m2/m2pp.cc | 64 +++- gcc/m2/mc-boot/GDynamicStrings.cc | 55 ++- gcc/m2/mc-boot/GDynamicStrings.h | 7 + gcc/m2/mc-boot/GFIO.cc | 44 +-- gcc/m2/mc-boot/GFIO.h | 4 +- gcc/m2/mc-boot/GIO.cc | 13 +- gcc/m2/mc-boot/GRTint.cc | 81 +++- gcc/m2/mc-boot/Gdecl.cc | 47 ++- gcc/m2/mc-boot/GmcOptions.cc | 155 ++++++++ gcc/m2/mc-boot/GmcOptions.h | 21 + gcc/m2/mc/decl.mod | 38 +- gcc/m2/mc/mcOptions.def | 24 ++ gcc/m2/mc/mcOptions.mod | 96 ++++- gcc/testsuite/gm2/extensions/pass/libc.def | 1 + gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.c | 24 ++ gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.def | 7 + .../intrinsic/run/pass/pim-intrinsic-run-pass.exp | 48 +++ gcc/testsuite/gm2/pim/intrinsic/run/pass/test.mod | 102 +++++ gcc/testsuite/gm2/pim/run/pass/builtins.mod | 79 ++++ gcc/testsuite/gm2/pim/run/pass/convert1.mod | 49 +++ gcc/testsuite/gm2/pim/run/pass/longint1.mod | 49 +++ gcc/testsuite/gm2/pim/run/pass/longint2.mod | 51 +++ gcc/testsuite/gm2/pim/run/pass/longint3.mod | 23 ++ gcc/testsuite/gm2/pim/run/pass/longint4.mod | 21 + gcc/testsuite/gm2/pim/run/pass/longint5.mod | 24 ++ gcc/testsuite/gm2/pim/run/pass/longint6.mod | 25 ++ gcc/testsuite/gm2/pim/run/pass/longint7.mod | 25 ++ gcc/testsuite/gm2/pim/run/pass/longint8.mod | 25 ++ .../gm2/pimlib/logitech/run/pass/realconv.mod | 1 + ...tches-uninit-variable-checking-cascade-fail.exp | 5 + gcc/testsuite/lib/gm2.exp | 7 + libgm2/Makefile.am | 4 + libgm2/Makefile.in | 3 + libgm2/libm2cor/Makefile.am | 17 +- libgm2/libm2cor/Makefile.in | 18 +- libgm2/libm2iso/Makefile.am | 20 +- libgm2/libm2iso/Makefile.in | 21 +- libgm2/libm2log/Makefile.am | 8 +- libgm2/libm2log/Makefile.in | 8 +- libgm2/libm2min/Makefile.am | 10 +- libgm2/libm2min/Makefile.in | 10 +- libgm2/libm2pim/Makefile.am | 16 +- libgm2/libm2pim/Makefile.in | 17 +- 80 files changed, 2126 insertions(+), 511 deletions(-) diff --git a/gcc/doc/gm2.texi b/gcc/doc/gm2.texi index bae822f2690..d7bb18a358a 100644 --- a/gcc/doc/gm2.texi +++ b/gcc/doc/gm2.texi @@ -392,7 +392,7 @@ implementation modules which are parsed will be prepossessed by @item -fdebug-builtins call a real function, rather than the builtin equivalent. This can be useful for debugging parameter values to a builtin function as -it allows users to single step code into a real function. +it allows users to single step code into an intrinsic function. @c fd @c Modula-2 diff --git a/gcc/m2/Make-lang.in b/gcc/m2/Make-lang.in index 7338bfe7710..a54151821ef 100644 --- a/gcc/m2/Make-lang.in +++ b/gcc/m2/Make-lang.in @@ -85,6 +85,9 @@ GM2_PROG_DEP=gm2$(exeext) xgcc$(exeext) cc1gm2$(exeext) include m2/config-make +# Determine if float128 should represent the Modula-2 type LONGREAL. +host_mc_longreal := $(if $(strip $(filter powerpc64le%,$(host))),--longreal=__float128) + LIBSTDCXX=../$(TARGET_SUBDIR)/libstdc++-v3/src/.libs/libstdc++.a PGE=m2/pge$(exeext) @@ -458,7 +461,8 @@ MC_ARGS= --olang=c++ \ -I$(srcdir)/m2/gm2-gcc \ --quiet \ $(MC_COPYRIGHT) \ - --gcc-config-system + --gcc-config-system \ + $(host_mc_longreal) MCDEPS=m2/boot-bin/mc$(exeext) diff --git a/gcc/m2/config-make.in b/gcc/m2/config-make.in index fb25ef44c33..5521d4f4698 100644 --- a/gcc/m2/config-make.in +++ b/gcc/m2/config-make.in @@ -3,4 +3,8 @@ TARGET_SUBDIR = @target_subdir@ # Python3 executable name if it exists PYTHON = @PYTHON@ # Does Python3 exist? (yes/no). -HAVE_PYTHON = @HAVE_PYTHON@ \ No newline at end of file +HAVE_PYTHON = @HAVE_PYTHON@ +# target cpu +TEST_TARGET_CPU_DEFAULT = @target@ +# host cpu +TEST_HOST_CPU_DEFAULT = @host@ \ No newline at end of file diff --git a/gcc/m2/configure b/gcc/m2/configure index de78fdd3724..f62f3d8729c 100755 --- a/gcc/m2/configure +++ b/gcc/m2/configure @@ -3645,6 +3645,25 @@ $as_echo "#define HAVE_OPENDIR 1" >>confdefs.h fi + +case $target in #( + powerpc64le*) : + +$as_echo "#define M2C_LONGREAL_FLOAT128 1" >>confdefs.h + ;; #( + *) : + ;; +esac + +case $target in #( + powerpc64le*) : + +$as_echo "#define M2C_LONGREAL_PPC64LE 1" >>confdefs.h + ;; #( + *) : + ;; +esac + ac_config_headers="$ac_config_headers gm2config.aci" cat >confcache <<\_ACEOF diff --git a/gcc/m2/configure.ac b/gcc/m2/configure.ac index 0a77caeaa17..82b764cadd9 100644 --- a/gcc/m2/configure.ac +++ b/gcc/m2/configure.ac @@ -29,5 +29,12 @@ AC_CHECK_FUNCS([stpcpy]) AC_CHECK_HEADERS(sys/types.h) AC_HEADER_DIRENT AC_CHECK_LIB([c],[opendir],[AC_DEFINE([HAVE_OPENDIR],[1],[found opendir])]) + +AS_CASE([$target],[powerpc64le*], + [AC_DEFINE([M2C_LONGREAL_FLOAT128],[1],[use __float128 for LONGREAL])]) + +AS_CASE([$target],[powerpc64le*], + [AC_DEFINE([M2C_LONGREAL_PPC64LE],[1],[target is ppc64le])]) + AC_CONFIG_HEADERS(gm2config.aci, [echo timestamp > stamp-h]) AC_OUTPUT diff --git a/gcc/m2/gm2-compiler/M2GCCDeclare.mod b/gcc/m2/gm2-compiler/M2GCCDeclare.mod index 3ce9cb22653..87ca0da1eaf 100644 --- a/gcc/m2/gm2-compiler/M2GCCDeclare.mod +++ b/gcc/m2/gm2-compiler/M2GCCDeclare.mod @@ -2458,7 +2458,7 @@ BEGIN p := NoOfParam(Sym) ; i := p ; WHILE i>0 DO - (* note we dont use GetNthParam as we want the parameter that is seen by + (* Note we dont use GetNthParam as we want the parameter that is seen by the procedure block remember that this is treated exactly the same as a variable, just its position on the activation record is special (ie a parameter). *) diff --git a/gcc/m2/gm2-compiler/M2GenGCC.mod b/gcc/m2/gm2-compiler/M2GenGCC.mod index bcef4e70c40..c023eda077b 100644 --- a/gcc/m2/gm2-compiler/M2GenGCC.mod +++ b/gcc/m2/gm2-compiler/M2GenGCC.mod @@ -52,7 +52,7 @@ FROM SymbolTable IMPORT PushSize, PopSize, PushValue, PopValue, IsExportQualified, IsExported, IsSubrange, IsPointer, - IsProcedureBuiltin, IsProcedureInline, + IsProcedureBuiltinAvailable, IsProcedureInline, IsParameter, IsParameterVar, IsValueSolved, IsSizeSolved, IsProcedureNested, IsInnerModule, IsArrayLarge, @@ -83,7 +83,7 @@ FROM SymbolTable IMPORT PushSize, PopSize, PushValue, PopValue, FROM M2Batch IMPORT MakeDefinitionSource ; FROM M2LexBuf IMPORT FindFileNameFromToken, TokenToLineNo, TokenToLocation, - MakeVirtualTok, UnknownTokenNo ; + MakeVirtualTok, UnknownTokenNo, BuiltinTokenNo ; FROM M2Code IMPORT CodeBlock ; FROM M2Debug IMPORT Assert ; @@ -158,7 +158,8 @@ FROM M2GCCDeclare IMPORT WalkAction, FROM M2Range IMPORT CodeRangeCheck, FoldRangeCheck, CodeErrorCheck, GetMinMax ; -FROM m2builtins IMPORT BuiltInMemCopy, BuiltInAlloca, +FROM m2builtins IMPORT BuiltInAlloca, + BuiltinMemSet, BuiltinMemCopy, GetBuiltinConst, GetBuiltinTypeInfo, BuiltinExists, BuildBuiltinTree ; @@ -228,6 +229,7 @@ FROM m2statement IMPORT BuildAsm, BuildProcedureCallTree, BuildParam, BuildFunct BuildReturnValueCode, SetLastFunction, BuildIncludeVarConst, BuildIncludeVarVar, BuildExcludeVarConst, BuildExcludeVarVar, + BuildBuiltinCallTree, GetParamTree, BuildCleanUp, BuildTryFinally, GetLastFunction, SetLastFunction, @@ -270,6 +272,7 @@ TYPE DoUnaryProcedure = PROCEDURE (CARDINAL) ; VAR + Memset, Memcpy : CARDINAL ; CurrentQuadToken : CARDINAL ; UnboundedLabelNo : CARDINAL ; LastLine : CARDINAL ;(* The Last Line number emitted with the *) @@ -444,6 +447,7 @@ VAR op1, op2, op3: CARDINAL ; location : location_t ; BEGIN + InitBuiltinSyms (BuiltinTokenNo) ; GetQuad(q, op, op1, op2, op3) ; IF op=StatementNoteOp THEN @@ -572,6 +576,7 @@ VAR op3pos : CARDINAL ; Changed: BOOLEAN ; BEGIN + InitBuiltinSyms (BuiltinTokenNo) ; Changed := FALSE ; REPEAT NoChange := TRUE ; @@ -1310,18 +1315,25 @@ END GetSizeOfHighFromUnbounded ; PROCEDURE MaybeDebugBuiltinAlloca (location: location_t; tok: CARDINAL; high: Tree) : Tree ; VAR - func: Tree ; + call, + memptr, + func : Tree ; BEGIN IF DebugBuiltins THEN - func := Mod2Gcc(FromModuleGetSym(tok, - MakeKey('alloca_trace'), - MakeDefinitionSource(tok, - MakeKey('Builtins')))) ; - RETURN( BuildCall2(location, func, GetPointerType(), BuiltInAlloca(location, high), high) ) + func := Mod2Gcc (FromModuleGetSym (tok, + MakeKey ('alloca_trace'), + MakeDefinitionSource (tok, + MakeKey ('Builtins')))) ; + call := BuiltInAlloca (location, high) ; + SetLastFunction (call) ; + memptr := BuildFunctValue (location, call) ; + call := BuildCall2 (location, func, GetPointerType(), memptr, high) ; ELSE - RETURN( BuiltInAlloca(location, high) ) - END + call := BuiltInAlloca (location, high) + END ; + SetLastFunction (call) ; + RETURN BuildFunctValue (location, call) END MaybeDebugBuiltinAlloca ; @@ -1331,21 +1343,43 @@ END MaybeDebugBuiltinAlloca ; PROCEDURE MaybeDebugBuiltinMemcpy (location: location_t; tok: CARDINAL; src, dest, nbytes: Tree) : Tree ; VAR + call, func: Tree ; BEGIN IF DebugBuiltins THEN - func := Mod2Gcc(FromModuleGetSym(tok, - MakeKey('memcpy'), - MakeDefinitionSource(tok, - MakeKey('Builtins')))) ; - RETURN( BuildCall3(location, func, GetPointerType(), src, dest, nbytes) ) + func := Mod2Gcc (Memcpy) ; + call := BuildCall3 (location, func, GetPointerType (), src, dest, nbytes) ; ELSE - RETURN( BuiltInMemCopy(location, src, dest, nbytes) ) - END + call := BuiltinMemCopy (location, src, dest, nbytes) + END ; + SetLastFunction (call) ; + RETURN BuildFunctValue (location, call) END MaybeDebugBuiltinMemcpy ; +(* + MaybeDebugBuiltinMemset - +*) + +PROCEDURE MaybeDebugBuiltinMemset (location: location_t; tok: CARDINAL; + ptr, bytevalue, nbytes: Tree) : Tree ; +VAR + call, + func: Tree ; +BEGIN + IF DebugBuiltins + THEN + func := Mod2Gcc (Memset) ; + call := BuildCall3 (location, func, GetPointerType (), ptr, bytevalue, nbytes) ; + ELSE + call := BuiltinMemSet (location, ptr, bytevalue, nbytes) + END ; + SetLastFunction (call) ; + RETURN BuildFunctValue (location, call) +END MaybeDebugBuiltinMemset ; + + (* MakeCopyUse - make a copy of the unbounded array and alter all references from the old unbounded array to the new unbounded array. @@ -1368,7 +1402,7 @@ VAR High, NewArray : Tree ; BEGIN - location := TokenToLocation(tokenno) ; + location := TokenToLocation (tokenno) ; UnboundedType := GetType (param) ; Assert (IsUnbounded (UnboundedType)) ; @@ -1397,20 +1431,20 @@ VAR sym, type: CARDINAL ; BEGIN - IF IsParameter(param) + IF IsParameter (param) THEN - type := GetType(param) ; - sym := GetLocalSym(proc, GetSymName(param)) ; - IF IsUnbounded(type) + type := GetType (param) ; + sym := GetLocalSym (proc, GetSymName (param)) ; + IF IsUnbounded (type) THEN - RETURN( GetAddressOfUnbounded(location, sym) ) + RETURN( GetAddressOfUnbounded (location, sym) ) ELSE - Assert(GetMode(sym)=LeftValue) ; - RETURN( Mod2Gcc(sym) ) + Assert (GetMode (sym) = LeftValue) ; + RETURN( Mod2Gcc (sym) ) END ELSE - Assert(IsVar(param)) ; - Assert(GetMode(param)=LeftValue) ; + Assert (IsVar (param)) ; + Assert (GetMode (param) = LeftValue) ; RETURN( Mod2Gcc(param) ) END END GetParamAddress ; @@ -1926,32 +1960,19 @@ BEGIN END CodeCall ; -(* - CanUseBuiltin - returns TRUE if the procedure, Sym, can be - inlined via a builtin function. -*) - -PROCEDURE CanUseBuiltin (Sym: CARDINAL) : BOOLEAN ; -BEGIN - RETURN( (NOT DebugBuiltins) AND - (BuiltinExists(KeyToCharStar(GetProcedureBuiltin(Sym))) OR - BuiltinExists(KeyToCharStar(GetSymName(Sym)))) ) -END CanUseBuiltin ; - - (* UseBuiltin - returns a Tree containing the builtin function and parameters. It should only be called if - CanUseBuiltin returns TRUE. + CanUseBuiltin or IsProcedureBuiltinAvailable returns TRUE. *) PROCEDURE UseBuiltin (tokenno: CARDINAL; Sym: CARDINAL) : Tree ; BEGIN IF BuiltinExists(KeyToCharStar(GetProcedureBuiltin(Sym))) THEN - RETURN( BuildBuiltinTree(TokenToLocation (tokenno), KeyToCharStar(GetProcedureBuiltin(Sym))) ) + RETURN( BuildBuiltinTree(TokenToLocation (tokenno), KeyToCharStar (GetProcedureBuiltin (Sym))) ) ELSE - RETURN( BuildBuiltinTree(TokenToLocation (tokenno), KeyToCharStar(GetSymName(Sym))) ) + RETURN( BuildBuiltinTree(TokenToLocation (tokenno), KeyToCharStar (GetSymName (Sym))) ) END END UseBuiltin ; @@ -1963,19 +1984,35 @@ END UseBuiltin ; PROCEDURE CodeDirectCall (tokenno: CARDINAL; procedure: CARDINAL) : Tree ; VAR location: location_t ; + call : Tree ; BEGIN - location := TokenToLocation(tokenno) ; - IF IsProcedureBuiltin(procedure) AND CanUseBuiltin(procedure) + location := TokenToLocation (tokenno) ; + IF IsProcedureBuiltinAvailable (procedure) THEN - RETURN UseBuiltin (tokenno, procedure) + call := UseBuiltin (tokenno, procedure) ; + IF call # NIL + THEN + call := BuildBuiltinCallTree (location, call) + END ELSE - IF GetType(procedure)=NulSym + call := NIL + END ; + IF call = NIL + THEN + IF GetType (procedure) = NulSym THEN - RETURN BuildProcedureCallTree(location, Mod2Gcc(procedure), NIL) + call := BuildProcedureCallTree (location, Mod2Gcc (procedure), NIL) ELSE - RETURN BuildProcedureCallTree(location, Mod2Gcc(procedure), Mod2Gcc(GetType(procedure))) + call := BuildProcedureCallTree (location, Mod2Gcc (procedure), Mod2Gcc (GetType (procedure))) END - END + END ; + IF GetType (procedure) = NulSym + THEN + SetLastFunction (NIL) + ELSE + SetLastFunction (call) + END ; + RETURN call END CodeDirectCall ; @@ -2208,43 +2245,43 @@ BEGIN location := TokenToLocation (CurrentQuadToken) ; n := q ; REPEAT - IF op1>0 + IF op1 > 0 THEN - DeclareConstant(CurrentQuadToken, op3) + DeclareConstant (CurrentQuadToken, op3) END ; - n := GetNextQuad(n) ; - GetQuad(n, op, r, op2, op3) - UNTIL op=FunctValueOp ; + n := GetNextQuad (n) ; + GetQuad (n, op, r, op2, op3) + UNTIL op = FunctValueOp ; n := q ; - GetQuad(n, op, op1, op2, op3) ; - res := Mod2Gcc(r) ; - max := GetSizeOfInBits(Mod2Gcc(Address)) ; - bits := GetIntegerZero(location) ; - val := GetPointerZero(location) ; + GetQuad (n, op, op1, op2, op3) ; + res := Mod2Gcc (r) ; + max := GetSizeOfInBits (Mod2Gcc(Address)) ; + bits := GetIntegerZero (location) ; + val := GetPointerZero (location) ; REPEAT - location := TokenToLocation(CurrentQuadToken) ; - IF (op=ParamOp) AND (op1>0) + location := TokenToLocation (CurrentQuadToken) ; + IF (op = ParamOp) AND (op1 > 0) THEN - IF GetType(op3)=NulSym + IF GetType (op3) = NulSym THEN - WriteFormat0('must supply typed constants to MAKEADR') + WriteFormat0 ('must supply typed constants to MAKEADR') ELSE - type := GetType(op3) ; - tmp := BuildConvert(location, GetPointerType(), Mod2Gcc(op3), FALSE) ; - IF CompareTrees(bits, GetIntegerZero(location))>0 + type := GetType (op3) ; + tmp := BuildConvert (location, GetPointerType (), Mod2Gcc (op3), FALSE) ; + IF CompareTrees (bits, GetIntegerZero (location)) > 0 THEN - tmp := BuildLSL(location, tmp, bits, FALSE) + tmp := BuildLSL (location, tmp, bits, FALSE) END ; - bits := BuildAdd(location, bits, GetSizeOfInBits(Mod2Gcc(type)), FALSE) ; - val := BuildLogicalOrAddress(location, val, tmp, FALSE) + bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ; + val := BuildLogicalOrAddress (location, val, tmp, FALSE) END END ; - SubQuad(n) ; - n := GetNextQuad(n) ; - GetQuad(n, op, op1, op2, op3) + SubQuad (n) ; + n := GetNextQuad (n) ; + GetQuad (n, op, op1, op2, op3) UNTIL op=FunctValueOp ; - IF CompareTrees(bits, max)>0 + IF CompareTrees(bits, max) > 0 THEN MetaErrorT0 (CurrentQuadToken, 'total number of bits specified as parameters to {%kMAKEADR} exceeds address width') @@ -2259,11 +2296,15 @@ END CodeMakeAdr ; inlines the SYSTEM function MAKEADR. *) -PROCEDURE CodeBuiltinFunction (q: CARDINAL; op1, op2, op3: CARDINAL) ; +PROCEDURE CodeBuiltinFunction (q: CARDINAL; nth, func, parameter: CARDINAL) ; BEGIN - IF (op1=0) AND (op3=MakeAdr) + IF nth = 0 THEN - CodeMakeAdr (q, op1, op2, op3) + InitBuiltinSyms (BuiltinTokenNo) ; + IF func = MakeAdr + THEN + CodeMakeAdr (q, nth, func, parameter) + END END END CodeBuiltinFunction ; @@ -2294,55 +2335,55 @@ BEGIN IF r>0 THEN TryDeclareConstant (tokenno, op3) ; - IF NOT GccKnowsAbout(op3) + IF NOT GccKnowsAbout (op3) THEN resolved := FALSE END END ; - n := GetNextQuad(n) ; - GetQuad(n, op, r, op2, op3) - UNTIL op=FunctValueOp ; + n := GetNextQuad (n) ; + GetQuad (n, op, r, op2, op3) + UNTIL op = FunctValueOp ; - IF resolved AND IsConst(r) + IF resolved AND IsConst (r) THEN n := q ; - GetQuad(n, op, op1, op2, op3) ; - max := GetSizeOfInBits(Mod2Gcc(Address)) ; - bits := GetIntegerZero(location) ; - val := GetPointerZero(location) ; + GetQuad (n, op, op1, op2, op3) ; + max := GetSizeOfInBits (Mod2Gcc(Address)) ; + bits := GetIntegerZero (location) ; + val := GetPointerZero (location) ; REPEAT - location := TokenToLocation(tokenno) ; - IF (op=ParamOp) AND (op1>0) + location := TokenToLocation (tokenno) ; + IF (op = ParamOp) AND (op1 > 0) THEN - IF GetType(op3)=NulSym + IF GetType (op3) = NulSym THEN MetaErrorT0 (tokenno, 'constants passed to {%kMAKEADR} must be typed') ELSE - type := GetType(op3) ; - tmp := BuildConvert(location, GetPointerType(), Mod2Gcc(op3), FALSE) ; - IF CompareTrees(bits, GetIntegerZero(location))>0 + type := GetType (op3) ; + tmp := BuildConvert (location, GetPointerType (), Mod2Gcc (op3), FALSE) ; + IF CompareTrees (bits, GetIntegerZero (location)) > 0 THEN - tmp := BuildLSL(location, tmp, bits, FALSE) + tmp := BuildLSL (location, tmp, bits, FALSE) END ; - bits := BuildAdd(location, bits, GetSizeOfInBits(Mod2Gcc(type)), FALSE) ; - val := BuildLogicalOrAddress(location, val, tmp, FALSE) + bits := BuildAdd (location, bits, GetSizeOfInBits (Mod2Gcc (type)), FALSE) ; + val := BuildLogicalOrAddress (location, val, tmp, FALSE) END END ; - SubQuad(n) ; - n := GetNextQuad(n) ; - GetQuad(n, op, op1, op2, op3) - UNTIL op=FunctValueOp ; - IF CompareTrees(bits, max)>0 + SubQuad (n) ; + n := GetNextQuad (n) ; + GetQuad (n, op, op1, op2, op3) + UNTIL op = FunctValueOp ; + IF CompareTrees (bits, max) > 0 THEN MetaErrorT0 (tokenno, 'total number of bits specified as parameters to {%kMAKEADR} exceeds address width') END ; - PutConst(r, Address) ; - AddModGcc(r, DeclareKnownConstant(location, Mod2Gcc(Address), val)) ; - p(r) ; + PutConst (r, Address) ; + AddModGcc (r, DeclareKnownConstant (location, Mod2Gcc (Address), val)) ; + p (r) ; NoChange := FALSE ; - SubQuad(n) + SubQuad (n) END END FoldMakeAdr ; @@ -2376,7 +2417,7 @@ VAR op1, op2, op3 : CARDINAL ; op : QuadOperator ; - val : Tree ; + val, call : Tree ; location : location_t ; BEGIN GetQuad (q, op, op1, op2, op3) ; @@ -2419,10 +2460,12 @@ BEGIN GetQuad(n, op, op1, op2, op3) UNTIL op=FunctValueOp ; - IF IsProcedureBuiltin(procedure) AND CanUseBuiltin(procedure) + IF IsProcedureBuiltinAvailable (procedure) THEN location := TokenToLocation(tokenno) ; - val := FoldAndStrip (UseBuiltin (tokenno, procedure)) ; + call := UseBuiltin (tokenno, procedure) ; + val := BuildFunctValue (location, call) ; + val := FoldAndStrip (val) ; PutConst(r, GetType(procedure)) ; AddModGcc(r, DeclareKnownConstant(location, Mod2Gcc(GetType(procedure)), val)) ; p(r) ; @@ -2450,7 +2493,7 @@ BEGIN IF op3=MakeAdr THEN FoldMakeAdr (tokenno, p, q, op1, op2, op3) - ELSIF IsProcedure (op3) AND IsProcedureBuiltin (op3) AND CanUseBuiltin (op3) + ELSIF IsProcedure (op3) AND IsProcedureBuiltinAvailable (op3) THEN FoldBuiltin (tokenno, p, q) END @@ -7262,7 +7305,26 @@ BEGIN END CodeXIndr ; +(* + InitBuiltinSyms - +*) + +PROCEDURE InitBuiltinSyms (tok: CARDINAL) ; +BEGIN + IF Memset = NulSym + THEN + Memset := FromModuleGetSym (tok, MakeKey ('memset'), MakeDefinitionSource (tok, MakeKey ('Builtins'))) + END ; + IF Memcpy = NulSym + THEN + Memcpy := FromModuleGetSym (tok, MakeKey ('memcpy'), MakeDefinitionSource (tok, MakeKey ('Builtins'))) + END ; +END InitBuiltinSyms ; + + BEGIN + Memset := NulSym ; + Memcpy := NulSym ; UnboundedLabelNo := 0 ; CurrentQuadToken := 0 ; ScopeStack := InitStackWord () diff --git a/gcc/m2/gm2-compiler/M2Options.def b/gcc/m2/gm2-compiler/M2Options.def index 6eefe7c771a..b70cd8f63ad 100644 --- a/gcc/m2/gm2-compiler/M2Options.def +++ b/gcc/m2/gm2-compiler/M2Options.def @@ -97,7 +97,8 @@ EXPORT QUALIFIED SetReturnCheck, SetNilCheck, SetCaseCheck, SetGenModuleList, GetGenModuleFilename, SharedFlag, SetB, GetB, SetMD, GetMD, SetMMD, GetMMD, SetObj, GetObj, GetMQ, SetMQ, SetM2Prefix, GetM2Prefix, - SetM2PathName, GetM2PathName, SetCaseEnumChecking ; + SetM2PathName, GetM2PathName, SetCaseEnumChecking, + SetDebugBuiltins ; VAR @@ -945,6 +946,13 @@ PROCEDURE SetUninitVariableChecking (value: BOOLEAN; arg: ADDRESS) : INTEGER ; PROCEDURE SetCaseEnumChecking (value: BOOLEAN) ; +(* + SetDebugBuiltins - sets the DebugBuiltins to value. +*) + +PROCEDURE SetDebugBuiltins (value: BOOLEAN) ; + + (* FinaliseOptions - once all options have been parsed we set any inferred values. diff --git a/gcc/m2/gm2-compiler/M2Options.mod b/gcc/m2/gm2-compiler/M2Options.mod index f265aa5da2b..1a64cf0d457 100644 --- a/gcc/m2/gm2-compiler/M2Options.mod +++ b/gcc/m2/gm2-compiler/M2Options.mod @@ -1367,7 +1367,11 @@ END SetShared ; (* - SetUninitVariableChecking - sets the UninitVariableChecking flag to value. + SetUninitVariableChecking - sets the UninitVariableChecking and + UninitVariableConditionalChecking flags to value + depending upon arg string. The arg string + can be: "all", "known,cond", "cond,known", "known" + or "cond". *) PROCEDURE SetUninitVariableChecking (value: BOOLEAN; arg: ADDRESS) : INTEGER ; @@ -1386,8 +1390,7 @@ BEGIN s := InitStringCharStar (arg) ; IF EqualArray (s, "all") OR EqualArray (s, "known,cond") OR - EqualArray (s, "cond,known") OR - EqualArray (s, "cond") + EqualArray (s, "cond,known") THEN UninitVariableChecking := value ; UninitVariableConditionalChecking := value ; @@ -1396,7 +1399,11 @@ BEGIN ELSIF EqualArray (s, "known") THEN UninitVariableChecking := value ; - UninitVariableConditionalChecking := NOT value ; + s := KillString (s) ; + RETURN 1 + ELSIF EqualArray (s, "cond") + THEN + UninitVariableConditionalChecking := value ; s := KillString (s) ; RETURN 1 ELSE @@ -1416,6 +1423,16 @@ BEGIN END SetCaseEnumChecking ; +(* + SetDebugBuiltins - sets the DebugBuiltins to value. +*) + +PROCEDURE SetDebugBuiltins (value: BOOLEAN) ; +BEGIN + DebugBuiltins := value +END SetDebugBuiltins ; + + BEGIN cflag := FALSE ; (* -c. *) RuntimeModuleOverride := InitString (DefaultRuntimeModuleOverride) ; diff --git a/gcc/m2/gm2-compiler/M2Quads.def b/gcc/m2/gm2-compiler/M2Quads.def index 743589f2a40..298482bf951 100644 --- a/gcc/m2/gm2-compiler/M2Quads.def +++ b/gcc/m2/gm2-compiler/M2Quads.def @@ -1644,7 +1644,7 @@ PROCEDURE CheckBuildFunction () : BOOLEAN ; *) -PROCEDURE BuildFunctionCall ; +PROCEDURE BuildFunctionCall (ConstExpr: BOOLEAN) ; (* diff --git a/gcc/m2/gm2-compiler/M2Quads.mod b/gcc/m2/gm2-compiler/M2Quads.mod index be837b328e5..0cea54040f0 100644 --- a/gcc/m2/gm2-compiler/M2Quads.mod +++ b/gcc/m2/gm2-compiler/M2Quads.mod @@ -117,6 +117,7 @@ FROM SymbolTable IMPORT ModeOfAddr, GetMode, PutMode, GetSymName, IsUnknown, PushSize, PushValue, PopValue, GetVariableAtAddress, IsVariableAtAddress, MakeError, UnknownReported, + IsProcedureBuiltinAvailable, IsError, IsInnerModule, IsImportStatement, IsImport, GetImportModule, GetImportDeclared, @@ -5147,9 +5148,9 @@ BEGIN END ; IF IsDefImp (GetScope (ProcSym)) AND IsDefinitionForC (GetScope (ProcSym)) THEN - BuildRealFuncProcCall (tokno, FALSE, TRUE) + BuildRealFuncProcCall (tokno, FALSE, TRUE, FALSE) ELSE - BuildRealFuncProcCall (tokno, FALSE, FALSE) + BuildRealFuncProcCall (tokno, FALSE, FALSE, FALSE) END END BuildRealProcedureCall ; @@ -5179,7 +5180,7 @@ END BuildRealProcedureCall ; |----------------| *) -PROCEDURE BuildRealFuncProcCall (tokno: CARDINAL; IsFunc, IsForC: BOOLEAN) ; +PROCEDURE BuildRealFuncProcCall (tokno: CARDINAL; IsFunc, IsForC, ConstExpr: BOOLEAN) ; VAR AllocateProc, DeallocateProc, @@ -5220,7 +5221,7 @@ BEGIN ParamConstant := FALSE ELSE Proc := ProcSym ; - ParamConstant := IsProcedureBuiltin (Proc) ; + ParamConstant := TRUE ; AllocateProc := GetSymName (Proc) = MakeKey('ALLOCATE') ; DeallocateProc := GetSymName (Proc) = MakeKey('DEALLOCATE') END ; @@ -5295,13 +5296,18 @@ BEGIN INC (pi) END ; GenQuadO (proctok, CallOp, NulSym, NulSym, ProcSym, TRUE) ; - PopN (NoOfParameters+1) ; (* Destroy arguments and procedure call *) + PopN (NoOfParameters+1) ; (* Destroy arguments and procedure call *) IF IsFunc THEN - (* ReturnVar - will have the type of the procedure *) + (* ReturnVar has the type of the procedure. *) resulttok := MakeVirtualTok (proctok, proctok, paramtok) ; - ReturnVar := MakeTemporary (resulttok, AreConstant(ParamConstant)) ; - PutVar (ReturnVar, GetSType(Proc)) ; + IF ConstExpr AND (NOT IsProcedureBuiltinAvailable (Proc)) + THEN + MetaError1('{%1d} {%1ad} cannot be used in a constant expression', Proc) ; + ParamConstant := FALSE + END ; + ReturnVar := MakeTemporary (resulttok, AreConstant (ParamConstant AND ConstExpr)) ; + PutVar (ReturnVar, GetSType (Proc)) ; GenQuadO (resulttok, FunctValueOp, ReturnVar, NulSym, Proc, TRUE) ; IF NOT ForcedFunc THEN @@ -6624,19 +6630,19 @@ BEGIN PushTFtok (TSize, Cardinal, tok) ; (* TSIZE(ParamType) *) PushTtok (ParamType, tok) ; PushT (1) ; (* 1 parameter for TSIZE() *) - BuildFunctionCall ; + BuildFunctionCall (FALSE) ; BuildBinaryOp ELSE (* SIZE(parameter) DIV TSIZE(ParamType) *) PushTFtok (TSize, Cardinal, tok) ; (* TSIZE(ArrayType) *) PushTtok (ArrayType, tok) ; PushT (1) ; (* 1 parameter for TSIZE() *) - BuildFunctionCall ; + BuildFunctionCall (TRUE) ; PushT (DivideTok) ; (* Divide by *) PushTFtok (TSize, Cardinal, tok) ; (* TSIZE(ParamType) *) PushTtok (ParamType, tok) ; PushT (1) ; (* 1 parameter for TSIZE() *) - BuildFunctionCall ; + BuildFunctionCall (TRUE) ; BuildBinaryOp END ; (* now convert from no of elements into HIGH by subtracting 1 *) @@ -6734,15 +6740,15 @@ BEGIN PushTFtok (Field, GetSType (Field), tok) ; PushT (1) ; BuildDesignatorRecord (tok) ; - PushTFtok (Adr, Address, tok) ; (* ADR(Sym) *) + PushTFtok (Adr, Address, tok) ; (* ADR (Sym). *) IF IsUnbounded (SymType) AND (dim = 0) THEN PushTFADtok (Sym, SymType, UnboundedSym, dim, tok) ELSE PushTFADtok (Sym, SymType, ArraySym, dim, tok) END ; - PushT (1) ; (* 1 parameter for ADR() *) - BuildFunctionCall ; + PushT (1) ; (* 1 parameter for ADR(). *) + BuildFunctionCall (FALSE) ; BuildAssignmentWithoutBounds (tok, FALSE, TRUE) ; AssignHighFields (tok, Sym, ArraySym, UnboundedSym, ParamType, dim) @@ -6957,7 +6963,7 @@ BEGIN (* x^ *) PushTtok (GetItemPointedTo (PtrSym), paramtok) ; PushT (1) ; (* One parameter *) - BuildFunctionCall ; + BuildFunctionCall (FALSE) ; PopT (SizeSym) ; PushTtok (ProcSym, combinedtok) ; (* ALLOCATE *) @@ -7046,7 +7052,7 @@ BEGIN (* x^ *) PushTtok (GetItemPointedTo(PtrSym), paramtok) ; PushT (1) ; (* One parameter *) - BuildFunctionCall ; + BuildFunctionCall (FALSE) ; PopT (SizeSym) ; PushTtok (ProcSym, combinedtok) ; (* DEALLOCATE *) @@ -7527,7 +7533,7 @@ END CheckBuildFunction ; |----------------| |------------| *) -PROCEDURE BuildFunctionCall ; +PROCEDURE BuildFunctionCall (ConstExpr: BOOLEAN) ; VAR paramtok, combinedtok, @@ -7540,14 +7546,15 @@ BEGIN ProcSym := OperandT (NoOfParam + 1) ; ProcSym := SkipConst (ProcSym) ; PushT (NoOfParam) ; - (* Compile time stack restored to entry state *) + (* Compile time stack restored to entry state. *) IF IsUnknown (ProcSym) THEN paramtok := OperandTtok (1) ; combinedtok := MakeVirtualTok (functok, functok, paramtok) ; MetaErrorT1 (functok, 'procedure function {%1Ea} is undefined', ProcSym) ; PopN (NoOfParam + 2) ; - PushT (MakeConstLit (combinedtok, MakeKey ('0'), NulSym)) (* fake return value to continue compiling *) + (* Fake return value to continue compiling. *) + PushT (MakeConstLit (combinedtok, MakeKey ('0'), NulSym)) ELSIF IsAModula2Type (ProcSym) THEN ManipulatePseudoCallParameters ; @@ -7558,7 +7565,7 @@ BEGIN ManipulatePseudoCallParameters ; BuildPseudoFunctionCall ELSE - BuildRealFunctionCall (functok) + BuildRealFunctionCall (functok, ConstExpr) END END BuildFunctionCall ; @@ -7607,7 +7614,7 @@ BEGIN IF CompilerDebugging THEN printf2 ('procsym = %d token = %d\n', ProcSym, functok) ; - (* ErrorStringAt (InitString ('constant function'), functok) *) + (* ErrorStringAt (InitString ('constant function'), functok). *) END ; PushT (NoOfParam) ; IF (ProcSym # Convert) AND @@ -7615,29 +7622,27 @@ BEGIN IsPseudoSystemFunctionConstExpression (ProcSym) OR (IsProcedure (ProcSym) AND IsProcedureBuiltin (ProcSym))) THEN - BuildFunctionCall + BuildFunctionCall (TRUE) ELSE IF IsAModula2Type (ProcSym) THEN - (* type conversion *) + (* Type conversion. *) IF NoOfParam = 1 THEN ConstExpression := OperandT (NoOfParam + 1) ; paramtok := OperandTtok (NoOfParam + 1) ; PopN (NoOfParam + 2) ; - (* - Build macro: CONVERT( ProcSym, ConstExpression ) - *) + (* Build macro: CONVERT( ProcSym, ConstExpression ). *) PushTFtok (Convert, NulSym, functok) ; PushTtok (ProcSym, functok) ; PushTtok (ConstExpression, paramtok) ; - PushT (2) ; (* Two parameters *) + PushT (2) ; (* Two parameters. *) BuildConvertFunction ELSE MetaErrorT0 (functok, '{%E}a constant type conversion can only have one argument') END ELSE - (* error issue message and fake return stack *) + (* Error issue message and fake return stack. *) IF Iso THEN MetaErrorT0 (functok, 'the only functions permissible in a constant expression are: {%kCAP}, {%kCHR}, {%kCMPLX}, {%kFLOAT}, {%kHIGH}, {%kIM}, {%kLENGTH}, {%kMAX}, {%kMIN}, {%kODD}, {%kORD}, {%kRE}, {%kSIZE}, {%kTSIZE}, {%kTRUNC}, {%kVAL} and gcc builtins') @@ -7652,7 +7657,7 @@ BEGIN combinedtok := functok END ; PopN (NoOfParam+2) ; - PushT (MakeConstLit (combinedtok, MakeKey('0'), NulSym)) (* fake return value to continue compiling *) + PushT (MakeConstLit (combinedtok, MakeKey('0'), NulSym)) (* Fake return value to continue compiling. *) END END END BuildConstFunctionCall ; @@ -7725,8 +7730,8 @@ BEGIN MarkAsRead (r) ; resulttok := MakeVirtualTok (proctok, proctok, exptok) ; ReturnVar := MakeTemporary (resulttok, RightValue) ; - PutVar (ReturnVar, ProcSym) ; (* Set ReturnVar's TYPE *) - PopN (1) ; (* pop procedure. *) + PutVar (ReturnVar, ProcSym) ; (* Set ReturnVar's TYPE. *) + PopN (1) ; (* Pop procedure. *) IF IsConst (exp) OR IsVar (exp) THEN GenQuad (CoerceOp, ReturnVar, ProcSym, exp) @@ -7768,7 +7773,7 @@ END BuildTypeCoercion ; |----------------| |------------| *) -PROCEDURE BuildRealFunctionCall (tokno: CARDINAL) ; +PROCEDURE BuildRealFunctionCall (tokno: CARDINAL; ConstExpr: BOOLEAN) ; VAR NoOfParam, ProcSym : CARDINAL ; @@ -7779,14 +7784,14 @@ BEGIN ProcSym := SkipConst (ProcSym) ; IF IsVar(ProcSym) THEN - (* Procedure Variable ? *) - ProcSym := SkipType(OperandF(NoOfParam+2)) + (* Procedure Variable therefore get its type to see if it is a FOR "C" call. *) + ProcSym := SkipType (OperandF (NoOfParam+2)) END ; - IF IsDefImp (GetScope (ProcSym)) AND IsDefinitionForC (GetScope(ProcSym)) + IF IsDefImp (GetScope (ProcSym)) AND IsDefinitionForC (GetScope (ProcSym)) THEN - BuildRealFuncProcCall (tokno, TRUE, TRUE) + BuildRealFuncProcCall (tokno, TRUE, TRUE, ConstExpr) ELSE - BuildRealFuncProcCall (tokno, TRUE, FALSE) + BuildRealFuncProcCall (tokno, TRUE, FALSE, ConstExpr) END END BuildRealFunctionCall ; @@ -8428,7 +8433,7 @@ BEGIN PushTtok (ProcSym, functok) ; PushTFtok (Param, Type, paramtok) ; PushT (NoOfParam) ; - BuildRealFunctionCall (functok) + BuildRealFunctionCall (functok, FALSE) END ELSE PopT (NoOfParam) ; diff --git a/gcc/m2/gm2-compiler/P3Build.bnf b/gcc/m2/gm2-compiler/P3Build.bnf index 15c31fb854a..7cd7ec0adbd 100644 --- a/gcc/m2/gm2-compiler/P3Build.bnf +++ b/gcc/m2/gm2-compiler/P3Build.bnf @@ -1111,7 +1111,7 @@ SetOrDesignatorOrFunction := Qualident THEN BuildConstFunctionCall ELSE - BuildFunctionCall + BuildFunctionCall (FALSE) END % ] ] | @@ -1158,7 +1158,7 @@ AssignmentOrProcedureCall := % VAR ( ActualParameters | % BuildNulParam (* in epsilon *) % ) % IF isFunc THEN - BuildFunctionCall ; + BuildFunctionCall (FALSE) ; BuildAssignment (tokno) ELSE BuildProcedureCall (tokno - 1) diff --git a/gcc/m2/gm2-compiler/SymbolTable.def b/gcc/m2/gm2-compiler/SymbolTable.def index e7356da42a7..2068aa221ca 100644 --- a/gcc/m2/gm2-compiler/SymbolTable.def +++ b/gcc/m2/gm2-compiler/SymbolTable.def @@ -266,6 +266,7 @@ EXPORT QUALIFIED NulSym, IsDefLink, IsModLink, IsModuleBuiltin, + IsProcedureBuiltinAvailable, ForeachProcedureDo, ProcedureParametersDefined, @@ -3667,4 +3668,12 @@ PROCEDURE GetParameterHeapVar (ParSym: CARDINAL) : CARDINAL ; PROCEDURE PutProcedureParameterHeapVars (sym: CARDINAL) ; +(* + IsProcedureBuiltinAvailable - return TRUE if procedure is available as a builtin + for the target architecture. +*) + +PROCEDURE IsProcedureBuiltinAvailable (procedure: CARDINAL) : BOOLEAN ; + + END SymbolTable. diff --git a/gcc/m2/gm2-compiler/SymbolTable.mod b/gcc/m2/gm2-compiler/SymbolTable.mod index 86f896e4d8c..dc41c125525 100644 --- a/gcc/m2/gm2-compiler/SymbolTable.mod +++ b/gcc/m2/gm2-compiler/SymbolTable.mod @@ -32,7 +32,7 @@ FROM Indexing IMPORT InitIndex, InBounds, LowIndice, HighIndice, PutIndice, GetI FROM Sets IMPORT Set, InitSet, IncludeElementIntoSet, IsElementInSet ; FROM m2linemap IMPORT location_t ; -FROM M2Options IMPORT Pedantic, ExtendedOpaque, DebugFunctionLineNumbers, ScaffoldDynamic ; +FROM M2Options IMPORT Pedantic, ExtendedOpaque, DebugFunctionLineNumbers, ScaffoldDynamic, DebugBuiltins ; FROM M2LexBuf IMPORT UnknownTokenNo, TokenToLineNo, FindFileNameFromToken, TokenToLocation ; @@ -80,6 +80,7 @@ FROM m2decl IMPORT ConstantStringExceedsZType ; FROM m2tree IMPORT Tree ; FROM m2linemap IMPORT BuiltinsLocation ; FROM StrLib IMPORT StrEqual ; +FROM m2builtins IMPORT BuiltinExists ; FROM M2Comp IMPORT CompilingDefinitionModule, CompilingImplementationModule ; @@ -5787,6 +5788,30 @@ BEGIN END IsProcedureBuiltin ; +(* + CanUseBuiltin - returns TRUE if the procedure, Sym, can be + inlined via a builtin function. +*) + +PROCEDURE CanUseBuiltin (Sym: CARDINAL) : BOOLEAN ; +BEGIN + RETURN( (NOT DebugBuiltins) AND + (BuiltinExists (KeyToCharStar (GetProcedureBuiltin (Sym))) OR + BuiltinExists (KeyToCharStar (GetSymName (Sym)))) ) +END CanUseBuiltin ; + + +(* + IsProcedureBuiltinAvailable - return TRUE if procedure is available as a builtin + for the target architecture. +*) + +PROCEDURE IsProcedureBuiltinAvailable (procedure: CARDINAL) : BOOLEAN ; +BEGIN + RETURN IsProcedureBuiltin (procedure) AND CanUseBuiltin (procedure) +END IsProcedureBuiltinAvailable ; + + (* PutProcedureInline - determines that procedure, Sym, has been requested to be inlined. *) diff --git a/gcc/m2/gm2-gcc/m2builtins.cc b/gcc/m2/gm2-gcc/m2builtins.cc index 3d13e2018d7..8774ee7f32c 100644 --- a/gcc/m2/gm2-gcc/m2builtins.cc +++ b/gcc/m2/gm2-gcc/m2builtins.cc @@ -29,6 +29,9 @@ along with GNU Modula-2; see the file COPYING3. If not see #include "m2tree.h" #include "m2treelib.h" #include "m2type.h" +#include "m2configure.h" + +#undef DEBUGGING #define GM2 #define GM2_BUG_REPORT \ @@ -107,6 +110,19 @@ typedef enum { BT_FN_DOUBLE_DOUBLE_DOUBLE, } builtin_prototype; +typedef enum +{ + bf_true, + bf_false, + bf_extension_lib, + bf_default_lib, + bf_gcc, + bf_c99, + bf_c99_c90res, + bf_extension_lib_floatn, + bf_c99_compl, +} bf_category; + struct builtin_function_entry { const char *name; @@ -116,6 +132,7 @@ struct builtin_function_entry const char *library_name; tree function_node; tree return_node; + bf_category function_avail; }; /* Entries are added by examining gcc/builtins.def and copying those @@ -123,255 +140,248 @@ struct builtin_function_entry static struct builtin_function_entry list_of_builtins[] = { { "__builtin_alloca", BT_FN_PTR_SIZE, BUILT_IN_ALLOCA, BUILT_IN_NORMAL, - "alloca", NULL, NULL }, + "alloca", NULL, NULL, bf_extension_lib }, { "__builtin_memcpy", BT_FN_TRAD_PTR_PTR_CONST_PTR_SIZE, BUILT_IN_MEMCPY, - BUILT_IN_NORMAL, "memcpy", NULL, NULL }, - + BUILT_IN_NORMAL, "memcpy", NULL, NULL, bf_default_lib }, { "__builtin_isfinite", BT_FN_INT_DOUBLE, BUILT_IN_ISFINITE, BUILT_IN_NORMAL, - "isfinite", NULL, NULL }, - + "isfinite", NULL, NULL, bf_gcc }, { "__builtin_sinf", BT_FN_FLOAT_FLOAT, BUILT_IN_SINF, BUILT_IN_NORMAL, - "sinf", NULL, NULL }, + "sinf", NULL, NULL, bf_c99_c90res }, { "__builtin_sin", BT_FN_DOUBLE_DOUBLE, BUILT_IN_SIN, BUILT_IN_NORMAL, "sin", - NULL, NULL }, + NULL, NULL, bf_c99_c90res }, { "__builtin_sinl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_SINL, - BUILT_IN_NORMAL, "sinl", NULL, NULL }, + BUILT_IN_NORMAL, "sinl", NULL, NULL, bf_c99_c90res }, { "__builtin_cosf", BT_FN_FLOAT_FLOAT, BUILT_IN_SINF, BUILT_IN_NORMAL, - "cosf", NULL, NULL }, + "cosf", NULL, NULL, bf_c99_c90res }, { "__builtin_cos", BT_FN_DOUBLE_DOUBLE, BUILT_IN_COS, BUILT_IN_NORMAL, "cos", - NULL, NULL }, + NULL, NULL, bf_c99_c90res }, { "__builtin_cosl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_COSL, - BUILT_IN_NORMAL, "cosl", NULL, NULL }, + BUILT_IN_NORMAL, "cosl", NULL, NULL, bf_c99_c90res }, { "__builtin_sqrtf", BT_FN_FLOAT_FLOAT, BUILT_IN_SQRTF, BUILT_IN_NORMAL, - "sqrtf", NULL, NULL }, + "sqrtf", NULL, NULL, bf_c99_c90res }, { "__builtin_sqrt", BT_FN_DOUBLE_DOUBLE, BUILT_IN_SQRT, BUILT_IN_NORMAL, - "sqrt", NULL, NULL }, + "sqrt", NULL, NULL, bf_default_lib }, { "__builtin_sqrtl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_SQRTL, - BUILT_IN_NORMAL, "sqrtl", NULL, NULL }, + BUILT_IN_NORMAL, "sqrtl", NULL, NULL, bf_c99_c90res }, { "__builtin_fabsf", BT_FN_FLOAT_FLOAT, BUILT_IN_FABSF, BUILT_IN_NORMAL, - "fabsf", NULL, NULL }, + "fabsf", NULL, NULL, bf_c99_c90res }, { "__builtin_fabs", BT_FN_DOUBLE_DOUBLE, BUILT_IN_FABS, BUILT_IN_NORMAL, - "fabs", NULL, NULL }, + "fabs", NULL, NULL, bf_default_lib }, { "__builtin_fabsl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_FABSL, - BUILT_IN_NORMAL, "fabsl", NULL, NULL }, + BUILT_IN_NORMAL, "fabsl", NULL, NULL, bf_c99_c90res }, { "__builtin_logf", BT_FN_FLOAT_FLOAT, BUILT_IN_LOGF, BUILT_IN_NORMAL, - "logf", NULL, NULL }, + "logf", NULL, NULL, bf_c99_c90res }, { "__builtin_log", BT_FN_DOUBLE_DOUBLE, BUILT_IN_LOG, BUILT_IN_NORMAL, "log", - NULL, NULL }, + NULL, NULL, bf_extension_lib_floatn }, { "__builtin_logl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_LOGL, - BUILT_IN_NORMAL, "logl", NULL, NULL }, + BUILT_IN_NORMAL, "logl", NULL, NULL, bf_c99_c90res }, { "__builtin_expf", BT_FN_FLOAT_FLOAT, BUILT_IN_EXPF, BUILT_IN_NORMAL, - "expf", NULL, NULL }, + "expf", NULL, NULL, bf_c99_c90res }, { "__builtin_exp", BT_FN_DOUBLE_DOUBLE, BUILT_IN_EXP, BUILT_IN_NORMAL, "exp", - NULL, NULL }, + NULL, NULL, bf_extension_lib_floatn }, { "__builtin_expl", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_EXPL, - BUILT_IN_NORMAL, "expl", NULL, NULL }, + BUILT_IN_NORMAL, "expl", NULL, NULL, bf_c99_c90res }, { "__builtin_log10f", BT_FN_FLOAT_FLOAT, BUILT_IN_LOG10F, BUILT_IN_NORMAL, - "log10f", NULL, NULL }, + "log10f", NULL, NULL, bf_c99_c90res }, { "__builtin_log10", BT_FN_DOUBLE_DOUBLE, BUILT_IN_LOG10, BUILT_IN_NORMAL, - "log10", NULL, NULL }, + "log10", NULL, NULL, bf_default_lib }, { "__builtin_log10l", BT_FN_LONG_DOUBLE_LONG_DOUBLE, BUILT_IN_LOG10L, - BUILT_IN_NORMAL, "log10l", NULL, NULL }, + BUILT_IN_NORMAL, "log10l", NULL, NULL, bf_c99_c90res }, { "__builtin_ilogbf", BT_FN_INT_FLOAT, BUILT_IN_ILOGBF, BUILT_IN_NORMAL, - "ilogbf", NULL, NULL }, + "ilogbf", NULL, NULL, bf_c99 }, { "__builtin_ilogb", BT_FN_INT_DOUBLE, BUILT_IN_ILOGB, BUILT_IN_NORMAL, - "ilogb", NULL, NULL }, + "ilogb", NULL, NULL, bf_c99 }, { "__builtin_ilogbl", BT_FN_INT_LONG_DOUBLE, BUILT_IN_ILOGBL, - BUILT_IN_NORMAL, "ilogbl", NULL, NULL }, + BUILT_IN_NORMAL, "ilogbl", NULL, NULL, bf_c99 }, { "__builtin_atan2f", BT_FN_FLOAT_FLOAT_FLOAT, BUILT_IN_ATAN2F, - BUILT_IN_NORMAL, "atan2f", NULL, NULL }, + BUILT_IN_NORMAL, "atan2f", NULL, NULL, bf_c99_c90res }, { "__builtin_atan2", BT_FN_DOUBLE_DOUBLE_DOUBLE, BUILT_IN_ATAN2, - BUILT_IN_NORMAL, "atan2", NULL, NULL }, + BUILT_IN_NORMAL, "atan2", NULL, NULL, bf_default_lib }, { "__builtin_atan2l", BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLE, - BUILT_IN_ATAN2L, BUILT_IN_NORMAL, "atan2l", NULL, NULL }, + BUILT_IN_ATAN2L, BUILT_IN_NORMAL, "atan2l", NULL, NULL, bf_c99_c90res }, { "__builtin_signbit", BT_FN_INT_DOUBLE, BUILT_IN_SIGNBIT, BUILT_IN_NORMAL, - "signbit", NULL, NULL }, + "signbit", NULL, NULL, bf_extension_lib }, { "__builtin_signbitf", BT_FN_INT_FLOAT, BUILT_IN_SIGNBITF, BUILT_IN_NORMAL, - "signbitf", NULL, NULL }, + "signbitf", NULL, NULL, bf_extension_lib }, { "__builtin_signbitl", BT_FN_INT_LONG_DOUBLE, BUILT_IN_SIGNBITL, - BUILT_IN_NORMAL, "signbitl", NULL, NULL }, + BUILT_IN_NORMAL, "signbitl", NULL, NULL, bf_extension_lib }, { "__builtin_modf", BT_FN_DOUBLE_DOUBLE_DOUBLEPTR, BUILT_IN_MODF, - BUILT_IN_NORMAL, "modf", NULL, NULL }, + BUILT_IN_NORMAL, "modf", NULL, NULL, bf_default_lib }, { "__builtin_modff", BT_FN_FLOAT_FLOAT_FLOATPTR, BUILT_IN_MODFF, - BUILT_IN_NORMAL, "modff", NULL, NULL }, + BUILT_IN_NORMAL, "modff", NULL, NULL, bf_c99_c90res }, { "__builtin_modfl", BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLEPTR, - BUILT_IN_MODFL, BUILT_IN_NORMAL, "modfl", NULL, NULL }, + BUILT_IN_MODFL, BUILT_IN_NORMAL, "modfl", NULL, NULL, bf_c99_c90res }, { "__builtin_nextafter", BT_FN_DOUBLE_DOUBLE_DOUBLE, BUILT_IN_NEXTAFTER, - BUILT_IN_NORMAL, "nextafter", NULL, NULL }, + BUILT_IN_NORMAL, "nextafter", NULL, NULL, bf_c99 }, { "__builtin_nextafterf", BT_FN_FLOAT_FLOAT_FLOAT, BUILT_IN_NEXTAFTERF, - BUILT_IN_NORMAL, "nextafterf", NULL, NULL }, + BUILT_IN_NORMAL, "nextafterf", NULL, NULL, bf_c99 }, { "__builtin_nextafterl", BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLE, - BUILT_IN_NEXTAFTERL, BUILT_IN_NORMAL, "nextafterl", NULL, NULL }, + BUILT_IN_NEXTAFTERL, BUILT_IN_NORMAL, "nextafterl", NULL, NULL, bf_c99 }, { "__builtin_nexttoward", BT_FN_DOUBLE_DOUBLE_LONG_DOUBLE, - BUILT_IN_NEXTTOWARD, BUILT_IN_NORMAL, "nexttoward", NULL, NULL }, + BUILT_IN_NEXTTOWARD, BUILT_IN_NORMAL, "nexttoward", NULL, NULL, bf_c99 }, { "__builtin_nexttowardf", BT_FN_FLOAT_FLOAT_LONG_DOUBLE, - BUILT_IN_NEXTTOWARDF, BUILT_IN_NORMAL, "nexttowardf", NULL, NULL }, + BUILT_IN_NEXTTOWARDF, BUILT_IN_NORMAL, "nexttowardf", NULL, NULL, bf_c99 }, { "__builtin_nexttowardl", BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLE, - BUILT_IN_NEXTTOWARDL, BUILT_IN_NORMAL, "nexttowardl", NULL, NULL }, + BUILT_IN_NEXTTOWARDL, BUILT_IN_NORMAL, "nexttowardl", NULL, NULL, bf_c99 }, { "__builtin_scalbln", BT_FN_DOUBLE_DOUBLE_LONG, BUILT_IN_SCALBLN, - BUILT_IN_NORMAL, "scalbln", NULL, NULL }, + BUILT_IN_NORMAL, "scalbln", NULL, NULL, bf_extension_lib }, { "__builtin_scalblnf", BT_FN_FLOAT_FLOAT_LONG, BUILT_IN_SCALBLNF, - BUILT_IN_NORMAL, "scalblnf", NULL, NULL }, + BUILT_IN_NORMAL, "scalblnf", NULL, NULL, bf_extension_lib }, { "__builtin_scalblnl", BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG, - BUILT_IN_SCALBLNL, BUILT_IN_NORMAL, "scalblnl", NULL, NULL }, + BUILT_IN_SCALBLNL, BUILT_IN_NORMAL, "scalblnl", NULL, NULL, bf_extension_lib }, { "__builtin_scalbn", BT_FN_DOUBLE_DOUBLE_INT, BUILT_IN_SCALBN, - BUILT_IN_NORMAL, "scalbln", NULL, NULL }, + BUILT_IN_NORMAL, "scalbln", NULL, NULL, bf_extension_lib }, { "__builtin_scalbnf", BT_FN_FLOAT_FLOAT_INT, BUILT_IN_SCALBNF, - BUILT_IN_NORMAL, "scalblnf", NULL, NULL }, + BUILT_IN_NORMAL, "scalblnf", NULL, NULL, bf_extension_lib }, { "__builtin_scalbnl", BT_FN_LONG_DOUBLE_LONG_DOUBLE_INT, BUILT_IN_SCALBNL, - BUILT_IN_NORMAL, "scalblnl", NULL, NULL }, + BUILT_IN_NORMAL, "scalblnl", NULL, NULL, bf_extension_lib }, /* Complex intrinsic functions. */ { "__builtin_cabs", BT_FN_DOUBLE_DCOMPLEX, BUILT_IN_CABS, BUILT_IN_NORMAL, - "cabs", NULL, NULL }, + "cabs", NULL, NULL, bf_c99_compl }, { "__builtin_cabsf", BT_FN_FLOAT_FCOMPLEX, BUILT_IN_CABSF, BUILT_IN_NORMAL, - "cabsf", NULL, NULL }, + "cabsf", NULL, NULL, bf_c99_compl }, { "__builtin_cabsl", BT_FN_LONG_DOUBLE_LDCOMPLEX, BUILT_IN_CABSL, - BUILT_IN_NORMAL, "cabsl", NULL, NULL }, + BUILT_IN_NORMAL, "cabsl", NULL, NULL, bf_c99_compl }, { "__builtin_carg", BT_FN_DOUBLE_DCOMPLEX, BUILT_IN_CABS, BUILT_IN_NORMAL, - "carg", NULL, NULL }, + "carg", NULL, NULL, bf_c99_compl }, { "__builtin_cargf", BT_FN_FLOAT_FCOMPLEX, BUILT_IN_CABSF, BUILT_IN_NORMAL, - "cargf", NULL, NULL }, + "cargf", NULL, NULL, bf_c99_compl }, { "__builtin_cargl", BT_FN_LONG_DOUBLE_LDCOMPLEX, BUILT_IN_CABSL, - BUILT_IN_NORMAL, "cargl", NULL, NULL }, + BUILT_IN_NORMAL, "cargl", NULL, NULL, bf_c99_compl }, { "__builtin_conj", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CONJ, BUILT_IN_NORMAL, - "carg", NULL, NULL }, + "carg", NULL, NULL, bf_c99_compl }, { "__builtin_conjf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CONJF, - BUILT_IN_NORMAL, "conjf", NULL, NULL }, + BUILT_IN_NORMAL, "conjf", NULL, NULL, bf_c99_compl }, { "__builtin_conjl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CONJL, - BUILT_IN_NORMAL, "conjl", NULL, NULL }, + BUILT_IN_NORMAL, "conjl", NULL, NULL, bf_c99_compl }, { "__builtin_cpow", BT_FN_DCOMPLEX_DOUBLE_DCOMPLEX, BUILT_IN_CPOW, - BUILT_IN_NORMAL, "cpow", NULL, NULL }, + BUILT_IN_NORMAL, "cpow", NULL, NULL, bf_c99_compl }, { "__builtin_cpowf", BT_FN_FCOMPLEX_FLOAT_FCOMPLEX, BUILT_IN_CPOWF, - BUILT_IN_NORMAL, "cpowf", NULL, NULL }, + BUILT_IN_NORMAL, "cpowf", NULL, NULL, bf_c99_compl }, { "__builtin_cpowl", BT_FN_LDCOMPLEX_LONG_DOUBLE_LDCOMPLEX, BUILT_IN_CPOWL, - BUILT_IN_NORMAL, "cpowl", NULL, NULL }, + BUILT_IN_NORMAL, "cpowl", NULL, NULL, bf_c99_compl }, { "__builtin_csqrt", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CSQRT, - BUILT_IN_NORMAL, "csqrt", NULL, NULL }, + BUILT_IN_NORMAL, "csqrt", NULL, NULL, bf_c99_compl }, { "__builtin_csqrtf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CSQRTF, - BUILT_IN_NORMAL, "csqrtf", NULL, NULL }, + BUILT_IN_NORMAL, "csqrtf", NULL, NULL, bf_c99_compl }, { "__builtin_csqrtl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CSQRTL, - BUILT_IN_NORMAL, "csqrtl", NULL, NULL }, + BUILT_IN_NORMAL, "csqrtl", NULL, NULL, bf_c99_compl }, { "__builtin_cexp", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CEXP, BUILT_IN_NORMAL, - "cexp", NULL, NULL }, + "cexp", NULL, NULL, bf_c99_compl }, { "__builtin_cexpf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CEXPF, - BUILT_IN_NORMAL, "cexpf", NULL, NULL }, + BUILT_IN_NORMAL, "cexpf", NULL, NULL, bf_c99_compl }, { "__builtin_cexpl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CEXPL, - BUILT_IN_NORMAL, "cexpl", NULL, NULL }, + BUILT_IN_NORMAL, "cexpl", NULL, NULL, bf_c99_compl }, - { "__builtin_cln", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CLOG, BUILT_IN_NORMAL, - "cln", NULL, NULL }, - { "__builtin_clnf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CLOGF, BUILT_IN_NORMAL, - "clnf", NULL, NULL }, - { "__builtin_clnl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CLOGL, - BUILT_IN_NORMAL, "clnl", NULL, NULL }, + { "__builtin_clog", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CLOG, BUILT_IN_NORMAL, + "clog", NULL, NULL, bf_c99_compl }, + { "__builtin_clogf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CLOGF, BUILT_IN_NORMAL, + "clogf", NULL, NULL, bf_c99_compl }, + { "__builtin_clogl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CLOGL, + BUILT_IN_NORMAL, "clogl", NULL, NULL, bf_c99_compl }, { "__builtin_csin", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CSIN, BUILT_IN_NORMAL, - "csin", NULL, NULL }, + "csin", NULL, NULL, bf_c99_compl }, { "__builtin_csinf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CSINF, - BUILT_IN_NORMAL, "csinf", NULL, NULL }, + BUILT_IN_NORMAL, "csinf", NULL, NULL, bf_c99_compl }, { "__builtin_csinl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CSINL, - BUILT_IN_NORMAL, "csinl", NULL, NULL }, + BUILT_IN_NORMAL, "csinl", NULL, NULL, bf_c99_compl }, { "__builtin_ccos", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CCOS, BUILT_IN_NORMAL, - "ccos", NULL, NULL }, + "ccos", NULL, NULL, bf_c99_compl }, { "__builtin_ccosf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CCOSF, - BUILT_IN_NORMAL, "ccosf", NULL, NULL }, + BUILT_IN_NORMAL, "ccosf", NULL, NULL, bf_c99_compl }, { "__builtin_ccosl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CCOSL, - BUILT_IN_NORMAL, "ccosl", NULL, NULL }, + BUILT_IN_NORMAL, "ccosl", NULL, NULL, bf_c99_compl }, { "__builtin_ctan", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CTAN, BUILT_IN_NORMAL, - "ctan", NULL, NULL }, + "ctan", NULL, NULL, bf_c99_compl }, { "__builtin_ctanf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CTANF, - BUILT_IN_NORMAL, "ctanf", NULL, NULL }, + BUILT_IN_NORMAL, "ctanf", NULL, NULL, bf_c99_compl }, { "__builtin_ctanl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CTANL, - BUILT_IN_NORMAL, "ctanl", NULL, NULL }, + BUILT_IN_NORMAL, "ctanl", NULL, NULL, bf_c99_compl }, { "__builtin_casin", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CASIN, - BUILT_IN_NORMAL, "casin", NULL, NULL }, + BUILT_IN_NORMAL, "casin", NULL, NULL, bf_c99_compl }, { "__builtin_casinf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CASINF, - BUILT_IN_NORMAL, "casinf", NULL, NULL }, + BUILT_IN_NORMAL, "casinf", NULL, NULL, bf_c99_compl }, { "__builtin_casinl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CASINL, - BUILT_IN_NORMAL, "casinl", NULL, NULL }, + BUILT_IN_NORMAL, "casinl", NULL, NULL, bf_c99_compl }, { "__builtin_cacos", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CACOS, - BUILT_IN_NORMAL, "cacos", NULL, NULL }, + BUILT_IN_NORMAL, "cacos", NULL, NULL, bf_c99_compl }, { "__builtin_cacosf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CACOSF, - BUILT_IN_NORMAL, "cacosf", NULL, NULL }, + BUILT_IN_NORMAL, "cacosf", NULL, NULL, bf_c99_compl }, { "__builtin_cacosl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CACOSL, - BUILT_IN_NORMAL, "cacosl", NULL, NULL }, + BUILT_IN_NORMAL, "cacosl", NULL, NULL, bf_c99_compl }, { "__builtin_catan", BT_FN_DCOMPLEX_DCOMPLEX, BUILT_IN_CATAN, - BUILT_IN_NORMAL, "catan", NULL, NULL }, + BUILT_IN_NORMAL, "catan", NULL, NULL, bf_c99_compl }, { "__builtin_catanf", BT_FN_FCOMPLEX_FCOMPLEX, BUILT_IN_CATANF, - BUILT_IN_NORMAL, "catanf", NULL, NULL }, + BUILT_IN_NORMAL, "catanf", NULL, NULL, bf_c99_compl }, { "__builtin_catanl", BT_FN_LDCOMPLEX_LDCOMPLEX, BUILT_IN_CATANL, - BUILT_IN_NORMAL, "catanl", NULL, NULL }, + BUILT_IN_NORMAL, "catanl", NULL, NULL, bf_c99_compl }, { "__builtin_huge_val", BT_FN_DOUBLE, BUILT_IN_HUGE_VAL, BUILT_IN_NORMAL, - "huge_val", NULL, NULL }, + "huge_val", NULL, NULL, bf_gcc }, { "__builtin_huge_valf", BT_FN_FLOAT, BUILT_IN_HUGE_VALF, BUILT_IN_NORMAL, - "huge_valf", NULL, NULL }, + "huge_valf", NULL, NULL, bf_gcc }, { "__builtin_huge_vall", BT_FN_LONG_DOUBLE, BUILT_IN_HUGE_VALL, - BUILT_IN_NORMAL, "huge_vall", NULL, NULL }, + BUILT_IN_NORMAL, "huge_vall", NULL, NULL, bf_gcc }, { "__builtin_index", BT_FN_STRING_CONST_STRING_INT, BUILT_IN_INDEX, - BUILT_IN_NORMAL, "index", NULL, NULL }, + BUILT_IN_NORMAL, "index", NULL, NULL, bf_extension_lib }, { "__builtin_rindex", BT_FN_STRING_CONST_STRING_INT, BUILT_IN_RINDEX, - BUILT_IN_NORMAL, "rindex", NULL, NULL }, + BUILT_IN_NORMAL, "rindex", NULL, NULL, bf_extension_lib }, { "__builtin_memcmp", BT_FN_INT_CONST_PTR_CONST_PTR_SIZE, BUILT_IN_MEMCMP, - BUILT_IN_NORMAL, "memcmp", NULL, NULL }, + BUILT_IN_NORMAL, "memcmp", NULL, NULL, bf_default_lib }, { "__builtin_memmove", BT_FN_TRAD_PTR_PTR_CONST_PTR_SIZE, BUILT_IN_MEMMOVE, - BUILT_IN_NORMAL, "memmove", NULL, NULL }, + BUILT_IN_NORMAL, "memmove", NULL, NULL, bf_default_lib }, { "__builtin_memset", BT_FN_TRAD_PTR_PTR_INT_SIZE, BUILT_IN_MEMSET, - BUILT_IN_NORMAL, "memset", NULL, NULL }, + BUILT_IN_NORMAL, "memset", NULL, NULL, bf_default_lib }, { "__builtin_strcat", BT_FN_STRING_STRING_CONST_STRING, BUILT_IN_STRCAT, - BUILT_IN_NORMAL, "strcat", NULL, NULL }, + BUILT_IN_NORMAL, "strcat", NULL, NULL, bf_default_lib }, { "__builtin_strncat", BT_FN_STRING_STRING_CONST_STRING_SIZE, - BUILT_IN_STRNCAT, BUILT_IN_NORMAL, "strncat", NULL, NULL }, + BUILT_IN_STRNCAT, BUILT_IN_NORMAL, "strncat", NULL, NULL, bf_default_lib }, { "__builtin_strcpy", BT_FN_STRING_STRING_CONST_STRING, BUILT_IN_STRCPY, - BUILT_IN_NORMAL, "strcpy", NULL, NULL }, + BUILT_IN_NORMAL, "strcpy", NULL, NULL, bf_default_lib }, { "__builtin_strncpy", BT_FN_STRING_STRING_CONST_STRING_SIZE, - BUILT_IN_STRNCPY, BUILT_IN_NORMAL, "strncpy", NULL, NULL }, + BUILT_IN_STRNCPY, BUILT_IN_NORMAL, "strncpy", NULL, NULL, bf_default_lib }, { "__builtin_strcmp", BT_FN_INT_CONST_STRING_CONST_STRING, BUILT_IN_STRCMP, - BUILT_IN_NORMAL, "strcmp", NULL, NULL }, + BUILT_IN_NORMAL, "strcmp", NULL, NULL, bf_default_lib }, { "__builtin_strncmp", BT_FN_INT_CONST_STRING_CONST_STRING_SIZE, - BUILT_IN_STRNCMP, BUILT_IN_NORMAL, "strncmp", NULL, NULL }, + BUILT_IN_STRNCMP, BUILT_IN_NORMAL, "strncmp", NULL, NULL, bf_default_lib }, { "__builtin_strlen", BT_FN_INT_CONST_STRING, BUILT_IN_STRLEN, - BUILT_IN_NORMAL, "strlen", NULL, NULL }, + BUILT_IN_NORMAL, "strlen", NULL, NULL, bf_default_lib }, { "__builtin_strstr", BT_FN_STRING_CONST_STRING_CONST_STRING, - BUILT_IN_STRSTR, BUILT_IN_NORMAL, "strstr", NULL, NULL }, + BUILT_IN_STRSTR, BUILT_IN_NORMAL, "strstr", NULL, NULL, bf_default_lib }, { "__builtin_strpbrk", BT_FN_STRING_CONST_STRING_CONST_STRING, - BUILT_IN_STRPBRK, BUILT_IN_NORMAL, "strpbrk", NULL, NULL }, + BUILT_IN_STRPBRK, BUILT_IN_NORMAL, "strpbrk", NULL, NULL, bf_default_lib }, { "__builtin_strspn", BT_FN_SIZE_CONST_STRING_CONST_STRING, BUILT_IN_STRSPN, - BUILT_IN_NORMAL, "strspn", NULL, NULL }, + BUILT_IN_NORMAL, "strspn", NULL, NULL, bf_default_lib }, { "__builtin_strcspn", BT_FN_SIZE_CONST_STRING_CONST_STRING, - BUILT_IN_STRCSPN, BUILT_IN_NORMAL, "strcspn", NULL, NULL }, + BUILT_IN_STRCSPN, BUILT_IN_NORMAL, "strcspn", NULL, NULL, bf_default_lib }, { "__builtin_strchr", BT_FN_STRING_CONST_STRING_INT, BUILT_IN_STRCHR, - BUILT_IN_NORMAL, "strchr", NULL, NULL }, + BUILT_IN_NORMAL, "strchr", NULL, NULL, bf_default_lib }, { "__builtin_strrchr", BT_FN_STRING_CONST_STRING_INT, BUILT_IN_STRCHR, - BUILT_IN_NORMAL, "strrchr", NULL, NULL }, - //{ "__builtin_constant_p", BT_FN_INT_VAR, BUILT_IN_CONSTANT_P, - //BUILT_IN_NORMAL, "constant_p", NULL, NULL}, + BUILT_IN_NORMAL, "strrchr", NULL, NULL, bf_default_lib }, { "__builtin_frame_address", BT_FN_PTR_UNSIGNED, BUILT_IN_FRAME_ADDRESS, - BUILT_IN_NORMAL, "frame_address", NULL, NULL }, + BUILT_IN_NORMAL, "frame_address", NULL, NULL, bf_gcc }, { "__builtin_return_address", BT_FN_PTR_UNSIGNED, BUILT_IN_RETURN_ADDRESS, - BUILT_IN_NORMAL, "return_address", NULL, NULL }, - //{ "__builtin_aggregate_incoming_address", BT_FN_PTR_VAR, - //BUILT_IN_AGGREGATE_INCOMING_ADDRESS, BUILT_IN_NORMAL, - //"aggregate_incoming_address", NULL, NULL}, + BUILT_IN_NORMAL, "return_address", NULL, NULL, bf_gcc }, { "__builtin_longjmp", BT_FN_VOID_PTR_INT, BUILT_IN_LONGJMP, BUILT_IN_NORMAL, - "longjmp", NULL, NULL }, + "longjmp", NULL, NULL, bf_gcc }, { "__builtin_setjmp", BT_FN_INT_PTR, BUILT_IN_SETJMP, BUILT_IN_NORMAL, - "setjmp", NULL, NULL }, - { NULL, BT_FN_NONE, 0, NOT_BUILT_IN, "", NULL, NULL } + "setjmp", NULL, NULL, bf_gcc }, + { NULL, BT_FN_NONE, 0, NOT_BUILT_IN, "", NULL, NULL, bf_false} }; struct builtin_type_info @@ -396,6 +406,7 @@ static GTY (()) tree double_ftype_double; static GTY (()) tree ldouble_ftype_ldouble; static GTY (()) tree gm2_alloca_node; static GTY (()) tree gm2_memcpy_node; +static GTY (()) tree gm2_memset_node; static GTY (()) tree gm2_isfinite_node; static GTY (()) tree gm2_huge_valf_node; static GTY (()) tree gm2_huge_val_node; @@ -771,15 +782,36 @@ donModes (location_t location ATTRIBUTE_UNUSED, tree type ATTRIBUTE_UNUSED) return m2decl_BuildIntegerConstant (1); } -/* BuiltInMemCopy - copy n bytes of memory efficiently from address +/* BuiltinMemCopy - copy n bytes of memory efficiently from address src to dest. */ tree -m2builtins_BuiltInMemCopy (location_t location, tree dest, tree src, tree n) +m2builtins_BuiltinMemCopy (location_t location, tree dest, tree src, tree n) { return DoBuiltinMemCopy (location, dest, src, n); } + +static tree +DoBuiltinMemSet (location_t location, tree ptr, tree bytevalue, tree nbytes) +{ + tree functype = TREE_TYPE (gm2_memset_node); + tree funcptr + = build1 (ADDR_EXPR, build_pointer_type (functype), gm2_memset_node); + tree call + = m2treelib_DoCall3 (location, ptr_type_node, funcptr, ptr, bytevalue, nbytes); + return call; +} + +/* BuiltinMemSet set copy n bytes of memory efficiently from address + src to dest. */ + +tree +m2builtins_BuiltinMemSet (location_t location, tree ptr, tree bytevalue, tree nbytes) +{ + return DoBuiltinMemSet (location, ptr, bytevalue, nbytes); +} + /* BuiltInAlloca - given an expression, n, allocate, n, bytes on the stack for the life of the current function. */ @@ -798,6 +830,65 @@ m2builtins_BuiltInIsfinite (location_t location, tree expression) return DoBuiltinIsfinite (location, expression); } + +/* do_target_support_exists returns true if the builting function + is supported by the target. */ + +static +bool +do_target_support_exists (struct builtin_function_entry *fe) +{ + tree type = TREE_TYPE (fe->function_node); + + switch (fe->function_avail) + { + case bf_true: + return true; + case bf_false: + return false; + case bf_extension_lib: + return true; + case bf_default_lib: + return true; + case bf_gcc: + return true; + case bf_c99: + return targetm.libc_has_function (function_c99_misc, type); + case bf_c99_c90res: + return targetm.libc_has_function (function_c99_misc, type); + case bf_extension_lib_floatn: + return true; + default: + gcc_unreachable (); + } + return false; +} + + +static +bool +target_support_exists (struct builtin_function_entry *fe) +{ +#if defined(DEBUGGING) + printf ("target_support_exists (%s): ", fe->library_name); +#endif + if (do_target_support_exists (fe)) + { +#if defined(DEBUGGING) + printf ("yes\n"); +#endif + return true; + } + else + { +#if defined(DEBUGGING) + printf ("no\n"); +#endif + return false; + } +} + + /* BuiltinExists - returns TRUE if the builtin function, name, exists for this target architecture. */ @@ -808,11 +899,13 @@ m2builtins_BuiltinExists (char *name) for (fe = &list_of_builtins[0]; fe->name != NULL; fe++) if (strcmp (name, fe->name) == 0) - return TRUE; + return true; + // return target_support_exists (fe); - return FALSE; + return false; } + /* BuildBuiltinTree - returns a Tree containing the builtin function, name. */ @@ -820,23 +913,23 @@ tree m2builtins_BuildBuiltinTree (location_t location, char *name) { struct builtin_function_entry *fe; - tree t; + tree call; m2statement_SetLastFunction (NULL_TREE); + for (fe = &list_of_builtins[0]; fe->name != NULL; fe++) - if (strcmp (name, fe->name) == 0) + if ((strcmp (name, fe->name) == 0) && target_support_exists (fe)) { tree functype = TREE_TYPE (fe->function_node); tree funcptr = build1 (ADDR_EXPR, build_pointer_type (functype), fe->function_node); - - m2statement_SetLastFunction (m2treelib_DoCall ( - location, fe->return_node, funcptr, m2statement_GetParamList ())); + call = m2treelib_DoCall ( + location, fe->return_node, funcptr, m2statement_GetParamList ()); + m2statement_SetLastFunction (call); m2statement_SetParamList (NULL_TREE); - t = m2statement_GetLastFunction (); if (fe->return_node == void_type_node) m2statement_SetLastFunction (NULL_TREE); - return t; + return call; } m2statement_SetParamList (NULL_TREE); @@ -938,7 +1031,7 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE: ftype = ldouble_ftype_void; - fe->return_node = long_double_type_node; + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FLOAT_FLOAT: ftype = float_ftype_float; @@ -950,7 +1043,7 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE_LONG_DOUBLE: ftype = ldouble_ftype_ldouble; - fe->return_node = long_double_type_node; + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_STRING_CONST_STRING_INT: ftype = build_function_type ( @@ -1032,7 +1125,7 @@ create_function_prototype (location_t location, case BT_FN_INT_LONG_DOUBLE: ftype = build_function_type ( integer_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink)); + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink)); fe->return_node = integer_type_node; break; case BT_FN_FLOAT_FCOMPLEX: @@ -1049,9 +1142,9 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE_LDCOMPLEX: ftype = build_function_type ( - long_double_type_node, - tree_cons (NULL_TREE, complex_long_double_type_node, endlink)); - fe->return_node = long_double_type_node; + m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongComplexType (), endlink)); + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FCOMPLEX_FCOMPLEX: ftype = build_function_type ( @@ -1067,9 +1160,9 @@ create_function_prototype (location_t location, break; case BT_FN_LDCOMPLEX_LDCOMPLEX: ftype = build_function_type ( - complex_long_double_type_node, - tree_cons (NULL_TREE, complex_long_double_type_node, endlink)); - fe->return_node = complex_long_double_type_node; + m2type_GetM2LongComplexType (), + tree_cons (NULL_TREE, m2type_GetM2LongComplexType (), endlink)); + fe->return_node = m2type_GetM2LongComplexType (); break; case BT_FN_DCOMPLEX_DOUBLE_DCOMPLEX: ftype = build_function_type ( @@ -1087,10 +1180,10 @@ create_function_prototype (location_t location, break; case BT_FN_LDCOMPLEX_LONG_DOUBLE_LDCOMPLEX: ftype = build_function_type ( - complex_long_double_type_node, - tree_cons (NULL_TREE, complex_long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink))); - fe->return_node = complex_long_double_type_node; + m2type_GetM2LongComplexType (), + tree_cons (NULL_TREE, m2type_GetM2LongComplexType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink))); + fe->return_node = m2type_GetM2LongComplexType (); break; case BT_FN_FLOAT_FLOAT_FLOATPTR: ftype = build_function_type ( @@ -1108,32 +1201,32 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLEPTR: ftype = build_function_type ( - long_double_type_node, + m2type_GetM2LongRealType (), tree_cons ( - NULL_TREE, long_double_type_node, + NULL_TREE, m2type_GetM2LongRealType (), tree_cons (NULL_TREE, long_doubleptr_type_node, endlink))); - fe->return_node = long_double_type_node; + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FLOAT_FLOAT_LONG_DOUBLE: ftype = build_function_type ( float_type_node, tree_cons (NULL_TREE, float_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink))); + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink))); fe->return_node = float_type_node; break; case BT_FN_DOUBLE_DOUBLE_LONG_DOUBLE: ftype = build_function_type ( double_type_node, tree_cons (NULL_TREE, double_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink))); + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink))); fe->return_node = double_type_node; break; case BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG_DOUBLE: ftype = build_function_type ( - long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink))); - fe->return_node = long_double_type_node; + m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink))); + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FLOAT_FLOAT_LONG: ftype = build_function_type ( @@ -1151,10 +1244,10 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE_LONG_DOUBLE_LONG: ftype = build_function_type ( - long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, + m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), tree_cons (NULL_TREE, long_integer_type_node, endlink))); - fe->return_node = long_double_type_node; + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FLOAT_FLOAT_INT: ftype = build_function_type ( @@ -1172,10 +1265,10 @@ create_function_prototype (location_t location, break; case BT_FN_LONG_DOUBLE_LONG_DOUBLE_INT: ftype = build_function_type ( - long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, + m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), tree_cons (NULL_TREE, integer_type_node, endlink))); - fe->return_node = long_double_type_node; + fe->return_node = m2type_GetM2LongRealType (); break; case BT_FN_FLOAT_FLOAT_FLOAT: ftype = build_function_type ( @@ -1264,9 +1357,9 @@ m2builtins_init (location_t location) float_ftype_void = build_function_type (float_type_node, math_endlink); double_ftype_void = build_function_type (double_type_node, math_endlink); ldouble_ftype_void - = build_function_type (long_double_type_node, math_endlink); + = build_function_type (m2type_GetM2LongRealType (), math_endlink); - long_doubleptr_type_node = build_pointer_type (long_double_type_node); + long_doubleptr_type_node = build_pointer_type (m2type_GetM2LongRealType ()); doubleptr_type_node = build_pointer_type (double_type_node); floatptr_type_node = build_pointer_type (float_type_node); @@ -1277,8 +1370,8 @@ m2builtins_init (location_t location) double_type_node, tree_cons (NULL_TREE, double_type_node, math_endlink)); ldouble_ftype_ldouble = build_function_type ( - long_double_type_node, - tree_cons (NULL_TREE, long_double_type_node, endlink)); + m2type_GetM2LongRealType (), + tree_cons (NULL_TREE, m2type_GetM2LongRealType (), endlink)); builtin_ftype_int_var = build_function_type ( integer_type_node, tree_cons (NULL_TREE, double_type_node, endlink)); @@ -1306,6 +1399,7 @@ m2builtins_init (location_t location) gm2_alloca_node = find_builtin_tree ("__builtin_alloca"); gm2_memcpy_node = find_builtin_tree ("__builtin_memcpy"); + gm2_memset_node = find_builtin_tree ("__builtin_memset"); gm2_huge_valf_node = find_builtin_tree ("__builtin_huge_valf"); gm2_huge_val_node = find_builtin_tree ("__builtin_huge_val"); gm2_huge_vall_node = find_builtin_tree ("__builtin_huge_vall"); diff --git a/gcc/m2/gm2-gcc/m2builtins.def b/gcc/m2/gm2-gcc/m2builtins.def index bce853639c4..c6eefcd7602 100644 --- a/gcc/m2/gm2-gcc/m2builtins.def +++ b/gcc/m2/gm2-gcc/m2builtins.def @@ -28,7 +28,7 @@ FROM m2linemap IMPORT location_t ; EXPORT QUALIFIED GetBuiltinConst, GetBuiltinConstType, GetBuiltinTypeInfoType, GetBuiltinTypeInfo, BuiltinExists, BuildBuiltinTree, - BuiltInMemCopy, BuiltInAlloca, + BuiltinMemCopy, BuiltinMemSet, BuiltInAlloca, BuiltInIsfinite ; @@ -98,7 +98,14 @@ PROCEDURE BuildBuiltinTree (location: location_t; name: ADDRESS) : Tree ; BuiltinMemCopy and BuiltinAlloca - are called by M2GenGCC to implement open arrays. *) -PROCEDURE BuiltInMemCopy (location: location_t; dest, src, n: Tree) : Tree ; +PROCEDURE BuiltinMemCopy (location: location_t; dest, src, n: Tree) : Tree ; + + +(* + BuiltinMemSet is called by M2GenGCC to implement the set type. +*) + +PROCEDURE BuiltinMemSet (location: location_t; dest, bytevalue, nbytes: Tree) : Tree ; (* diff --git a/gcc/m2/gm2-gcc/m2builtins.h b/gcc/m2/gm2-gcc/m2builtins.h index 487a41af3a2..8e2b60b9792 100644 --- a/gcc/m2/gm2-gcc/m2builtins.h +++ b/gcc/m2/gm2-gcc/m2builtins.h @@ -43,8 +43,10 @@ EXTERN unsigned int m2builtins_GetBuiltinConstType (char *name); EXTERN unsigned int m2builtins_GetBuiltinTypeInfoType (const char *ident); EXTERN tree m2builtins_GetBuiltinTypeInfo (location_t location, tree type, const char *ident); -EXTERN tree m2builtins_BuiltInMemCopy (location_t location, tree dest, +EXTERN tree m2builtins_BuiltinMemCopy (location_t location, tree dest, tree src, tree n); +EXTERN tree m2builtins_BuiltinMemSet (location_t location, tree dest, + tree bytevalue, tree nbytes); EXTERN tree m2builtins_BuiltInAlloca (location_t location, tree n); EXTERN tree m2builtins_BuiltInIsfinite (location_t location, tree e); EXTERN bool m2builtins_BuiltinExists (char *name); diff --git a/gcc/m2/gm2-gcc/m2configure.cc b/gcc/m2/gm2-gcc/m2configure.cc index 1c69103091b..46a57ddc5bf 100644 --- a/gcc/m2/gm2-gcc/m2configure.cc +++ b/gcc/m2/gm2-gcc/m2configure.cc @@ -99,3 +99,51 @@ m2configure_FullPathCPP (void) } return NULL; } + +/* Return true if M2C_LONGREAL_FLOAT128 is defined. */ + +bool +m2configure_M2CLongRealFloat128 (void) +{ +#if defined(M2C_LONGREAL_FLOAT128) + return true; +#else + return false; +#endif +} + +/* Return true if M2C_LONGREAL_IBM128 is defined. */ + +bool +m2configure_M2CLongRealIBM128 (void) +{ +#if defined(M2C_LONGREAL_IBM128) + return true; +#else + return false; +#endif +} + +/* Return true if M2C_LONGREAL_LONGDOUBLE is defined. */ + +bool +m2configure_M2CLongRealLongDouble (void) +{ +#if defined(M2C_LONGREAL_LONGDOUBLE) + return true; +#else + return false; +#endif +} + +/* Return true if the target is ppc64le. */ + +bool +m2configure_M2CLongRealLongDoublePPC64LE (void) +{ +#if defined(M2C_LONGREAL_PPC64LE) + return true; +#else + return false; +#endif +} diff --git a/gcc/m2/gm2-gcc/m2configure.def b/gcc/m2/gm2-gcc/m2configure.def index 7fe9ba69c58..9fc08769e62 100644 --- a/gcc/m2/gm2-gcc/m2configure.def +++ b/gcc/m2/gm2-gcc/m2configure.def @@ -22,7 +22,6 @@ along with GNU Modula-2; see the file COPYING3. If not see DEFINITION MODULE FOR "C" m2configure ; FROM SYSTEM IMPORT ADDRESS ; -EXPORT QUALIFIED UseUnderscoreForC, FullPathCPP ; CONST @@ -41,4 +40,39 @@ CONST PROCEDURE FullPathCPP () : ADDRESS ; +(* + M2CLongRealFloat128 - return true if M2C_LONGREAL_FLOAT128 + is defined. + Only one of M2CLongRealFloat128, + M2CLongRealIBM128, + M2CLongRealLongDouble will be set true. +*) + +PROCEDURE M2CLongRealFloat128 () : BOOLEAN ; + + +(* + M2CLongRealIBM128 - return true if M2C_LONGREAL_IBM128 + is defined. +*) + +PROCEDURE M2CLongRealIBM128 () : BOOLEAN ; + + +(* + M2CLongRealLongDouble - return true if M2C_LONGREAL_LONGDOUBLE + is defined. This is true if the LONGREAL + maps onto the default gcc long double type. +*) + +PROCEDURE M2CLongRealLongDouble () : BOOLEAN ; + + +(* + M2CLongRealLongDoublePPC64LE - return true if the target is ppc64le. +*) + +PROCEDURE M2CLongRealLongDoublePPC64LE () : BOOLEAN ; + + END m2configure. diff --git a/gcc/m2/gm2-gcc/m2configure.h b/gcc/m2/gm2-gcc/m2configure.h index 9e1a0405bb4..f98c71d7e71 100644 --- a/gcc/m2/gm2-gcc/m2configure.h +++ b/gcc/m2/gm2-gcc/m2configure.h @@ -38,7 +38,20 @@ along with GNU Modula-2; see the file COPYING3. If not see #include "input.h" -EXTERN char *m2configure_FullPathCPP (void); +EXTERN char * +m2configure_FullPathCPP (void); + +EXTERN bool +m2configure_M2CLongRealFloat128 (void); + +EXTERN bool +m2configure_M2CLongRealIBM128 (void); + +EXTERN bool +m2configure_M2CLongRealLongDouble (void); + +EXTERN bool +m2configure_M2CLongRealLongDoublePPC64LE (void); #undef EXTERN #endif /* m2configure_h. */ diff --git a/gcc/m2/gm2-gcc/m2convert.cc b/gcc/m2/gm2-gcc/m2convert.cc index 5d35bcee239..7d9c722c2ab 100644 --- a/gcc/m2/gm2-gcc/m2convert.cc +++ b/gcc/m2/gm2-gcc/m2convert.cc @@ -478,7 +478,7 @@ m2convert_BuildConvert (location_t location, tree type, tree value, if (checkOverflow) return convert_and_check (location, type, value); else - return convert (type, value); + return convert_loc (location, type, value); } /* const_to_ISO_type - perform VAL (iso_type, expr). */ diff --git a/gcc/m2/gm2-gcc/m2options.h b/gcc/m2/gm2-gcc/m2options.h index 8bd820fcc78..2ed2c9adf2c 100644 --- a/gcc/m2/gm2-gcc/m2options.h +++ b/gcc/m2/gm2-gcc/m2options.h @@ -138,6 +138,7 @@ EXTERN void M2Options_SetM2PathName (const char *arg); EXTERN char *M2Options_GetM2PathName (void); EXTERN int M2Options_SetUninitVariableChecking (bool value, const char *arg); EXTERN void M2Options_SetCaseEnumChecking (bool value); +EXTERN void M2Options_SetDebugBuiltins (bool value); #undef EXTERN #endif /* m2options_h. */ diff --git a/gcc/m2/gm2-gcc/m2statement.cc b/gcc/m2/gm2-gcc/m2statement.cc index fa799c849f9..ffbe3645456 100644 --- a/gcc/m2/gm2-gcc/m2statement.cc +++ b/gcc/m2/gm2-gcc/m2statement.cc @@ -174,7 +174,9 @@ m2statement_BuildAssignmentTree (location_t location, tree des, tree expr) m2convert_BuildConvert (location, TREE_TYPE (des), expr, false)); } - TREE_SIDE_EFFECTS (result) = 1; + TREE_SIDE_EFFECTS (result) = true; + TREE_USED (des) = true; + TREE_USED (expr) = true; add_stmt (location, result); return des; } @@ -195,7 +197,7 @@ m2statement_BuildGoto (location_t location, char *name) tree label = m2block_getLabel (location, name); m2assert_AssertLocation (location); - TREE_USED (label) = 1; + TREE_USED (label) = true; add_stmt (location, build1 (GOTO_EXPR, void_type_node, label)); } @@ -218,6 +220,7 @@ m2statement_BuildParam (location_t location, tree param) { m2assert_AssertLocation (location); + TREE_USED (param) = true; if (TREE_CODE (param) == FUNCTION_DECL) param = m2expr_BuildAddr (location, param, false); @@ -349,6 +352,20 @@ m2statement_BuildIndirectProcedureCallTree (location_t location, } } + +/* BuildBuiltinCallTree calls the builtin procedure. */ + +tree +m2statement_BuildBuiltinCallTree (location_t location, tree func) +{ + TREE_USED (func) = true; + TREE_SIDE_EFFECTS (func) = true; + param_list + = NULL_TREE; /* Ready for the next time we call a procedure. */ + return func; +} + + /* BuildFunctValue - generates code for value := last_function(foobar); */ @@ -361,12 +378,14 @@ m2statement_BuildFunctValue (location_t location, tree value) m2assert_AssertLocation (location); ASSERT_CONDITION ( last_function - != NULL_TREE); /* No value available, possible used before. */ + != NULL_TREE); /* No value available, possible used before. */ TREE_SIDE_EFFECTS (assign) = true; TREE_USED (assign) = true; + TREE_USED (value) = true; last_function = NULL_TREE; return assign; + // return m2statement_BuildAssignmentTree (location, value, assign); } /* BuildCall2 - builds a tree representing: function (arg1, arg2). */ diff --git a/gcc/m2/gm2-gcc/m2statement.def b/gcc/m2/gm2-gcc/m2statement.def index 6c3a0ec5477..4ad77ecdcef 100644 --- a/gcc/m2/gm2-gcc/m2statement.def +++ b/gcc/m2/gm2-gcc/m2statement.def @@ -309,4 +309,11 @@ PROCEDURE SetBeginLocation (location: location_t) ; PROCEDURE SetEndLocation (location: location_t) ; +(* + BuildBuiltinCallTree - calls the builtin procedure. +*) + +PROCEDURE BuildBuiltinCallTree (location: location_t; func: Tree) : Tree ; + + END m2statement. diff --git a/gcc/m2/gm2-gcc/m2statement.h b/gcc/m2/gm2-gcc/m2statement.h index 1ca70f8fc3a..b0531edace0 100644 --- a/gcc/m2/gm2-gcc/m2statement.h +++ b/gcc/m2/gm2-gcc/m2statement.h @@ -103,6 +103,8 @@ EXTERN tree m2statement_GetCurrentFunction (void); EXTERN void m2statement_SetBeginLocation (location_t location); EXTERN void m2statement_SetEndLocation (location_t location); EXTERN tree m2statement_GetParamTree (tree call, unsigned int i); +EXTERN tree m2statement_BuildBuiltinCallTree (location_t location, tree func); + EXTERN tree m2statement_BuildTryFinally (location_t location, tree call, tree cleanups); EXTERN tree m2statement_BuildCleanUp (tree param); diff --git a/gcc/m2/gm2-gcc/m2treelib.cc b/gcc/m2/gm2-gcc/m2treelib.cc index 6694af66d8b..168f9f43a97 100644 --- a/gcc/m2/gm2-gcc/m2treelib.cc +++ b/gcc/m2/gm2-gcc/m2treelib.cc @@ -188,7 +188,6 @@ m2treelib_DoCall0 (location_t location, tree rettype, tree funcptr) tree *argarray = XALLOCAVEC (tree, 1); argarray[0] = NULL_TREE; - return build_call_array_loc (location, rettype, funcptr, 0, argarray); } @@ -200,7 +199,6 @@ m2treelib_DoCall1 (location_t location, tree rettype, tree funcptr, tree arg0) tree *argarray = XALLOCAVEC (tree, 1); argarray[0] = arg0; - return build_call_array_loc (location, rettype, funcptr, 1, argarray); } @@ -214,7 +212,6 @@ m2treelib_DoCall2 (location_t location, tree rettype, tree funcptr, tree arg0, argarray[0] = arg0; argarray[1] = arg1; - return build_call_array_loc (location, rettype, funcptr, 2, argarray); } @@ -229,7 +226,6 @@ m2treelib_DoCall3 (location_t location, tree rettype, tree funcptr, tree arg0, argarray[0] = arg0; argarray[1] = arg1; argarray[2] = arg2; - return build_call_array_loc (location, rettype, funcptr, 3, argarray); } @@ -377,12 +373,12 @@ m2treelib_get_set_address_if_var (location_t location, tree op, bool is_lvalue, return m2treelib_get_set_address (location, op, is_lvalue); } -/* add_stmt - t is a statement. Add it to the statement-tree. */ +/* add_stmt add stmt to the statement-tree. */ tree -add_stmt (location_t location, tree t) +add_stmt (location_t location, tree stmt) { - return m2block_add_stmt (location, t); + return m2block_add_stmt (location, stmt); } /* taken from gcc/c-semantics.cc. */ diff --git a/gcc/m2/gm2-gcc/m2type.cc b/gcc/m2/gm2-gcc/m2type.cc index eeee3557c62..86edde50b72 100644 --- a/gcc/m2/gm2-gcc/m2type.cc +++ b/gcc/m2/gm2-gcc/m2type.cc @@ -37,6 +37,7 @@ along with GNU Modula-2; see the file COPYING3. If not see #include "m2treelib.h" #include "m2type.h" #include "m2options.h" +#include "m2configure.h" #define USE_BOOLEAN static int broken_set_debugging_info = true; @@ -935,7 +936,6 @@ build_set_type (tree domain, tree range_type, int allow_void, int ispacked) TREE_TYPE (type) = range_type; TYPE_DOMAIN (type) = domain; TYPE_PACKED (type) = ispacked; - return type; } @@ -1104,7 +1104,6 @@ build_m2_specific_size_type (location_t location, enum tree_code base, TYPE_UNSIGNED (c) = true; } } - return c; } @@ -1153,7 +1152,6 @@ finish_build_pointer_type (tree t, tree to_type, enum machine_mode mode, /* Lay out the type. */ /* layout_type (t); */ layout_type (t); - return t; } @@ -1344,7 +1342,6 @@ m2type_BuildVariableArrayAndDeclare (location_t location, tree elementtype, gm2_finish_decl (location, indextype); gm2_finish_decl (location, arraytype); add_stmt (location, build_stmt (location, DECL_EXPR, decl)); - return decl; } @@ -1443,7 +1440,6 @@ build_m2_short_real_node (void) c = make_node (REAL_TYPE); TYPE_PRECISION (c) = FLOAT_TYPE_SIZE; layout_type (c); - return c; } @@ -1457,7 +1453,6 @@ build_m2_real_node (void) c = make_node (REAL_TYPE); TYPE_PRECISION (c) = DOUBLE_TYPE_SIZE; layout_type (c); - return c; } @@ -1468,10 +1463,17 @@ build_m2_long_real_node (void) /* Define `LONGREAL'. */ - c = make_node (REAL_TYPE); - TYPE_PRECISION (c) = LONG_DOUBLE_TYPE_SIZE; - layout_type (c); + if (m2configure_M2CLongRealFloat128 ()) + c = float128_type_node; + else if (m2configure_M2CLongRealIBM128 ()) + { + c = make_node (REAL_TYPE); + TYPE_PRECISION (c) = LONG_DOUBLE_TYPE_SIZE; + } + else + c = long_double_type_node; + layout_type (c); return c; } @@ -1487,7 +1489,6 @@ build_m2_ztype_node (void) else ztype_node = gm2_type_for_size (64, 0); layout_type (ztype_node); - return ztype_node; } @@ -1500,7 +1501,6 @@ build_m2_long_int_node (void) c = make_signed_type (LONG_LONG_TYPE_SIZE); layout_type (c); - return c; } @@ -1513,7 +1513,6 @@ build_m2_long_card_node (void) c = make_unsigned_type (LONG_LONG_TYPE_SIZE); layout_type (c); - return c; } @@ -1526,7 +1525,6 @@ build_m2_short_int_node (void) c = make_signed_type (SHORT_TYPE_SIZE); layout_type (c); - return c; } @@ -1539,7 +1537,6 @@ build_m2_short_card_node (void) c = make_unsigned_type (SHORT_TYPE_SIZE); layout_type (c); - return c; } @@ -1556,7 +1553,6 @@ build_m2_iso_loc_node (void) fixup_unsigned_type (c); TYPE_UNSIGNED (c) = 1; - return c; } @@ -1754,6 +1750,16 @@ build_m2_boolean (location_t location) TYPE_NAME (boolean_type_node) = typedecl; } + +/* Return true if real types a and b are the same. */ + +bool +m2type_SameRealType (tree a, tree b) +{ + return ((a == b) + || (TYPE_PRECISION (a) == TYPE_PRECISION (b))); +} + /* InitBaseTypes create the Modula-2 base types. */ void @@ -1797,7 +1803,7 @@ m2type_InitBaseTypes (location_t location) m2_complex_type_node = build_m2_complex_type_node (); m2_long_complex_type_node = build_m2_long_complex_type_node (); m2_short_complex_type_node = build_m2_short_complex_type_node (); - m2_c_type_node = build_m2_long_complex_type_node (); + m2_c_type_node = m2_long_complex_type_node; m2_complex32_type_node = build_m2_complex32_type_node (); m2_complex64_type_node = build_m2_complex64_type_node (); m2_complex96_type_node = build_m2_complex96_type_node (); @@ -2575,7 +2581,8 @@ gm2_start_struct (location_t location, enum tree_code code, char *name) else id = get_identifier (name); - TYPE_PACKED (s) = false; /* This maybe set true later if necessary. */ + /* This maybe set true later if necessary. */ + TYPE_PACKED (s) = false; m2block_pushDecl (build_decl (location, TYPE_DECL, id, s)); return s; @@ -2814,7 +2821,6 @@ m2type_SetAlignment (tree node, tree align) error ("requested alignment is too large"); else if (is_type) { - /* If we have a TYPE_DECL, then copy the type, so that we don't accidentally modify a builtin type. See pushdecl. */ if (decl && TREE_TYPE (decl) != error_mark_node diff --git a/gcc/m2/gm2-gcc/m2type.def b/gcc/m2/gm2-gcc/m2type.def index 152810499e8..257e7e11a53 100644 --- a/gcc/m2/gm2-gcc/m2type.def +++ b/gcc/m2/gm2-gcc/m2type.def @@ -983,4 +983,11 @@ PROCEDURE BuildStartArrayType (index_type: Tree; elt_type: Tree; type: INTEGER) PROCEDURE IsAddress (type: Tree) : BOOLEAN ; +(* + SameRealType - return true if real types a and b are the same. +*) + +PROCEDURE SameRealType (a, b: Tree) : BOOLEAN ; + + END m2type. diff --git a/gcc/m2/gm2-gcc/m2type.h b/gcc/m2/gm2-gcc/m2type.h index 71861162e05..949e104993b 100644 --- a/gcc/m2/gm2-gcc/m2type.h +++ b/gcc/m2/gm2-gcc/m2type.h @@ -219,6 +219,8 @@ EXTERN tree m2type_BuildProcTypeParameterDeclaration (location_t location, bool isreference); EXTERN int m2type_IsAddress (tree type); EXTERN tree m2type_GetCardinalAddressType (void); +EXTERN bool m2type_SameRealType (tree a, tree b); + #undef EXTERN #endif /* m2type_h */ diff --git a/gcc/m2/gm2-lang.cc b/gcc/m2/gm2-lang.cc index 2b702cd6daa..45b5fe2fd45 100644 --- a/gcc/m2/gm2-lang.cc +++ b/gcc/m2/gm2-lang.cc @@ -427,6 +427,9 @@ gm2_langhook_handle_option ( case OPT_fd: M2Options_SetCompilerDebugging (value); return 1; + case OPT_fdebug_builtins: + M2Options_SetDebugBuiltins (value); + return 1; case OPT_fdebug_trace_quad: M2Options_SetDebugTraceQuad (value); return 1; @@ -809,14 +812,25 @@ gm2_langhook_type_for_mode (machine_mode mode, int unsignedp) if (mode == TYPE_MODE (long_double_type_node)) return long_double_type_node; + if ((float128_type_node != NULL) && (mode == TYPE_MODE (float128_type_node))) + return float128_type_node; + if (COMPLEX_MODE_P (mode)) { + machine_mode inner_mode; + tree inner_type; + if (mode == TYPE_MODE (complex_float_type_node)) return complex_float_type_node; if (mode == TYPE_MODE (complex_double_type_node)) return complex_double_type_node; if (mode == TYPE_MODE (complex_long_double_type_node)) return complex_long_double_type_node; + + inner_mode = GET_MODE_INNER (mode); + inner_type = gm2_langhook_type_for_mode (inner_mode, unsignedp); + if (inner_type != NULL_TREE) + return build_complex_type (inner_type); } #if HOST_BITS_PER_WIDE_INT >= 64 diff --git a/gcc/m2/gm2-libs-log/RealConversions.mod b/gcc/m2/gm2-libs-log/RealConversions.mod index 189096ae96b..02e0f9241d5 100644 --- a/gcc/m2/gm2-libs-log/RealConversions.mod +++ b/gcc/m2/gm2-libs-log/RealConversions.mod @@ -57,12 +57,29 @@ VAR #define Slice(X,Y,Z) SliceDB(X, Y, Z, __FILE__, __LINE__) *) + (* - logl10 - + IsNan - return TRUE if x is a nan (which never are equal to themselves). +*) + +PROCEDURE IsNan (x: LONGREAL) : BOOLEAN ; +BEGIN + RETURN x # x +END IsNan ; + + +(* + logl10 - this is a local implementation of log10l, currently the ppe64le + builtin log10l is broken. *) PROCEDURE logl10 (r: LONGREAL) : LONGREAL ; BEGIN + IF Debugging + THEN + printf ("logl10 (%lf) = %lf, logl/logl(10.0) = %lf\n", + r, log10l (r), logl(r)/logl(10.0)) + END ; RETURN logl(r)/logl(10.0) END logl10 ; @@ -138,18 +155,9 @@ BEGIN END ; IF c>=1.0 THEN - RETURN( VAL(INTEGER, log10l(c)) ) + RETURN VAL (INTEGER, log10l (c)) ELSE - i := 0 ; - LOOP - d := c*powl(10.0, VAL(LONGREAL, i)) ; - IF d>=1.0 - THEN - RETURN( -i ) - ELSE - INC(i) - END - END + RETURN VAL (INTEGER, log10l (c)) -1 END END END doPowerOfTen ; @@ -245,7 +253,7 @@ BEGIN ELSE ... END - *) + *) l := VAL(LONGREAL, r) ; LongRealToString(l, digits, width, str, ok) END RealToString ; @@ -397,14 +405,12 @@ VAR s : String ; powerOfTen: INTEGER ; BEGIN - (* --fixme-- *) - (* IF IsNan(r) - THEN - ok := FALSE ; - MakeNanString(str, width) ; - RETURN - END - *) + IF IsNan (r) + THEN + ok := FALSE ; + MakeNanString (str, width) ; + RETURN + END ; powerOfTen := doPowerOfTen(r) ; IF (powerOfTen=MAX(INTEGER)) OR (powerOfTen=MIN(INTEGER)) THEN diff --git a/gcc/m2/gm2-libs/Builtins.mod b/gcc/m2/gm2-libs/Builtins.mod index 70c1f8a3e1f..707f0e366ac 100644 --- a/gcc/m2/gm2-libs/Builtins.mod +++ b/gcc/m2/gm2-libs/Builtins.mod @@ -28,6 +28,7 @@ IMPLEMENTATION MODULE Builtins ; IMPORT cbuiltin, wrapc ; + PROCEDURE __ATTRIBUTE__ __BUILTIN__ ((__builtin_alloca)) alloca (i: CARDINAL) : ADDRESS ; BEGIN (* This routine will never be called as it allocates memory on diff --git a/gcc/m2/gm2-libs/DynamicStrings.def b/gcc/m2/gm2-libs/DynamicStrings.def index 90930a9f282..785c3274450 100644 --- a/gcc/m2/gm2-libs/DynamicStrings.def +++ b/gcc/m2/gm2-libs/DynamicStrings.def @@ -32,7 +32,7 @@ EXPORT QUALIFIED String, InitStringChar, Index, RIndex, Mark, Length, ConCat, ConCatChar, Assign, Dup, Add, Equal, EqualCharStar, EqualArray, ToUpper, ToLower, - CopyOut, Mult, Slice, + CopyOut, Mult, Slice, ReplaceChar, RemoveWhitePrefix, RemoveWhitePostfix, RemoveComment, char, string, InitStringDB, InitStringCharStarDB, InitStringCharDB, @@ -122,6 +122,14 @@ PROCEDURE ConCatChar (a: String; ch: CHAR) : String ; PROCEDURE Assign (a, b: String) : String ; +(* + ReplaceChar - returns string s after it has changed all + occurances of from to to. +*) + +PROCEDURE ReplaceChar (s: String; from, to: CHAR) : String ; + + (* Dup - duplicate a String, s, returning the copy of s. *) diff --git a/gcc/m2/gm2-libs/DynamicStrings.mod b/gcc/m2/gm2-libs/DynamicStrings.mod index 2c93130382c..b90bc3ff6f2 100644 --- a/gcc/m2/gm2-libs/DynamicStrings.mod +++ b/gcc/m2/gm2-libs/DynamicStrings.mod @@ -1134,6 +1134,31 @@ BEGIN END ConCatChar ; +(* + ReplaceChar - returns string s after it has changed all occurances of from to to. +*) + +PROCEDURE ReplaceChar (s: String; from, to: CHAR) : String ; +VAR + t: String ; + i: CARDINAL ; +BEGIN + t := s ; + WHILE t # NIL DO + i := 0 ; + WHILE i < t^.contents.len DO + IF t^.contents.buf[i] = from + THEN + t^.contents.buf[i] := to + END ; + INC (i) + END ; + t := t^.contents.next + END ; + RETURN s +END ReplaceChar ; + + (* Assign - assigns the contents of, b, into, a. String, a, is returned. diff --git a/gcc/m2/gm2config.aci.in b/gcc/m2/gm2config.aci.in index cb9f5054f44..5228ef09a7d 100644 --- a/gcc/m2/gm2config.aci.in +++ b/gcc/m2/gm2config.aci.in @@ -48,6 +48,12 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* use __float128 for LONGREAL */ +#undef M2C_LONGREAL_FLOAT128 + +/* target is ppc64le */ +#undef M2C_LONGREAL_PPC64LE + /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT diff --git a/gcc/m2/gm2spec.cc b/gcc/m2/gm2spec.cc index 75a6ed36c82..0da9a5722f0 100644 --- a/gcc/m2/gm2spec.cc +++ b/gcc/m2/gm2spec.cc @@ -475,6 +475,15 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, /* True if we should set up include paths and library paths. */ bool allow_libraries = true; +#ifdef M2C_LONGREAL_PPC64LE + /* Should we add -mabi=ieeelongdouble by default? */ +#ifdef M2C_LONGREAL_FLOAT128 + bool need_default_mabi = true; +#else + bool need_default_mabi = false; +#endif +#endif + #if defined(DEBUG_ARG) printf ("argc = %d\n", argc); fprintf (stderr, "Incoming:"); @@ -580,6 +589,16 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, args[i] |= SKIPOPT; /* We will add the option if it is needed. */ push_back_Ipath (decoded_options[i].arg); break; +#if defined(OPT_mabi_ibmlongdouble) + case OPT_mabi_ibmlongdouble: + need_default_mabi = false; /* User has specified a -mabi. */ + break; +#endif +#if defined(OPT_mabi_ieeelongdouble) + case OPT_mabi_ieeelongdouble: + need_default_mabi = true; /* User has specified a -mabi. */ + break; +#endif case OPT_nostdlib: case OPT_nostdlib__: case OPT_nodefaultlibs: @@ -849,6 +868,11 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, if (need_plugin) append_option (OPT_fplugin_, "m2rte", 1); +#ifdef M2C_LONGREAL_PPC64LE + if (need_default_mabi) + append_option (OPT_mabi_ieeelongdouble, NULL, 1); +#endif + if (linking) { if (allow_libraries) diff --git a/gcc/m2/lang.opt b/gcc/m2/lang.opt index f906d4e8b80..24f3c6594b9 100644 --- a/gcc/m2/lang.opt +++ b/gcc/m2/lang.opt @@ -30,6 +30,10 @@ Language Modula-2 +Wcase-enum +Modula-2 +turns on case statement label compile time checking when using an expression of an enum type. + Wpedantic-param-names Modula-2 compiler checks to force definition module procedure parameter names with their implementation module counterpart @@ -46,6 +50,14 @@ Wstyle Modula-2 extra compile time semantic checking, typically tries to catch poor programming style +Wuninit-variable-checking +Modula-2 +turns on compile time analysis in the first basic block of a procedure detecting access to uninitialized data. + +Wuninit-variable-checking= +Modula-2 Joined +turns on compile time analysis to detect access to uninitialized variables, the checking can be specified by: known,cond,all. + fauto-init Modula-2 automatically initializes all pointers to NIL @@ -277,10 +289,6 @@ Wall Modula-2 ; Documented in c.opt -Wcase-enum -Modula-2 -turns on case statement label compile time checking when using an expression of an enum type. - Wpedantic Modula-2 ; Documented in common.opt @@ -297,14 +305,6 @@ Wunused-parameter Modula-2 ; Documented in c.opt -Wuninit-variable-checking -Modula-2 -turns on compile time analysis in the first basic block of a procedure detecting access to uninitialized data. - -Wuninit-variable-checking= -Modula-2 Joined -turns on compile time analysis to detect access to uninitialized variables, the checking can be specified by: known,cond,all. - B Modula-2 ; Documented in c.opt diff --git a/gcc/m2/m2pp.cc b/gcc/m2/m2pp.cc index d502c9323c4..56779510c26 100644 --- a/gcc/m2/m2pp.cc +++ b/gcc/m2/m2pp.cc @@ -1308,6 +1308,33 @@ m2pp_complex (pretty *s, tree t ATTRIBUTE_UNUSED) } #endif +void +m2pp_real_type (pretty *s, tree t) +{ + if (t == m2type_GetRealType ()) + m2pp_print (s, "C double"); + else if (t == m2type_GetShortRealType ()) + m2pp_print (s, "C float"); + else if (t == m2type_GetLongRealType ()) + m2pp_print (s, "C long double"); + else if (t == m2type_GetM2RealType ()) + m2pp_print (s, "REAL"); + else if (t == m2type_GetM2ShortRealType ()) + m2pp_print (s, "SHORTREAL"); + else if (t == m2type_GetM2LongRealType ()) + m2pp_print (s, "LONGREAL"); + else if (t == m2type_GetM2Real128 ()) + m2pp_print (s, "REAL128"); + else if (t == m2type_GetM2Real64 ()) + m2pp_print (s, "REAL64"); + else if (t == m2type_GetM2Real32 ()) + m2pp_print (s, "REAL32"); + else if (t == m2type_GetM2RType ()) + m2pp_print (s, "R Type"); + else + m2pp_print (s, "unknown REAL"); +} + /* m2pp_type prints a full type. */ void @@ -1326,7 +1353,7 @@ m2pp_type (pretty *s, tree t) m2pp_integer (s, t); break; case REAL_TYPE: - m2pp_print (s, "REAL"); + m2pp_real_type (s, t); break; case ENUMERAL_TYPE: m2pp_enum (s, t); @@ -1593,6 +1620,22 @@ m2pp_union_type (pretty *s, tree t) pop (); } +/* m2pp_print_mode. */ + +static void +m2pp_print_mode (pretty *s, tree t) +{ + int mode = SCALAR_FLOAT_TYPE_MODE (t); + char buf[100]; + + snprintf (buf, sizeof (buf), "%d", mode); + m2pp_print (s, "<*"); + m2pp_needspace (s); + m2pp_print (s, buf); + m2pp_needspace (s); + m2pp_print (s, "*>"); +} + /* m2pp_simple_type. */ static void @@ -1611,7 +1654,8 @@ m2pp_simple_type (pretty *s, tree t) m2pp_integer (s, t); break; case REAL_TYPE: - m2pp_print (s, "REAL"); + m2pp_real_type (s, t); + m2pp_print_mode (s, t); break; case BOOLEAN_TYPE: m2pp_print (s, "BOOLEAN"); @@ -1642,6 +1686,19 @@ m2pp_simple_type (pretty *s, tree t) } } +/* m2pp_float issue a VAL (type, expr) expression. */ + +static void +m2pp_float (pretty *s, tree t) +{ + m2pp_needspace (s); + m2pp_print (s, "VAL ("); + m2pp_simple_type (s, TREE_TYPE (t)); + m2pp_print (s, ", "); + m2pp_expression (s, TREE_OPERAND (t, 0)); + m2pp_print (s, ")"); +} + /* m2pp_expression display an expression. */ static void @@ -1669,6 +1726,9 @@ m2pp_expression (pretty *s, tree t) case GT_EXPR: m2pp_relop (s, t, ">"); break; + case FLOAT_EXPR: + m2pp_float (s, t); + break; default: m2pp_simple_expression (s, t); } diff --git a/gcc/m2/mc-boot/GDynamicStrings.cc b/gcc/m2/mc-boot/GDynamicStrings.cc index 0076047b3d1..a79583c0160 100644 --- a/gcc/m2/mc-boot/GDynamicStrings.cc +++ b/gcc/m2/mc-boot/GDynamicStrings.cc @@ -187,6 +187,12 @@ extern "C" DynamicStrings_String DynamicStrings_ConCatChar (DynamicStrings_Strin extern "C" DynamicStrings_String DynamicStrings_Assign (DynamicStrings_String a, DynamicStrings_String b); +/* + ReplaceChar - returns string s after it has changed all occurances of from to to. +*/ + +extern "C" DynamicStrings_String DynamicStrings_ReplaceChar (DynamicStrings_String s, char from, char to); + /* Dup - duplicate a String, s, returning the copy of s. */ @@ -1815,6 +1821,35 @@ extern "C" DynamicStrings_String DynamicStrings_Assign (DynamicStrings_String a, } +/* + ReplaceChar - returns string s after it has changed all occurances of from to to. +*/ + +extern "C" DynamicStrings_String DynamicStrings_ReplaceChar (DynamicStrings_String s, char from, char to) +{ + DynamicStrings_String t; + unsigned int i; + + t = s; + while (t != NULL) + { + i = 0; + while (i < t->contents.len) + { + if (t->contents.buf.array[i] == from) + { + t->contents.buf.array[i] = to; + } + i += 1; + } + t = t->contents.next; + } + return s; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + /* Dup - duplicate a String, s, returning the copy of s. */ @@ -1828,7 +1863,7 @@ extern "C" DynamicStrings_String DynamicStrings_Dup (DynamicStrings_String s) s = DynamicStrings_Assign (DynamicStrings_InitString ((const char *) "", 0), s); if (TraceOn) { - s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1173, (const char *) "Dup", 3); + s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1198, (const char *) "Dup", 3); } return s; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -1850,7 +1885,7 @@ extern "C" DynamicStrings_String DynamicStrings_Add (DynamicStrings_String a, Dy a = DynamicStrings_ConCat (DynamicStrings_ConCat (DynamicStrings_InitString ((const char *) "", 0), a), b); if (TraceOn) { - a = AssignDebug (a, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1193, (const char *) "Add", 3); + a = AssignDebug (a, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1218, (const char *) "Add", 3); } return a; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -1915,7 +1950,7 @@ extern "C" bool DynamicStrings_EqualCharStar (DynamicStrings_String s, void * a) t = DynamicStrings_InitStringCharStar (a); if (TraceOn) { - t = AssignDebug (t, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1250, (const char *) "EqualCharStar", 13); + t = AssignDebug (t, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1275, (const char *) "EqualCharStar", 13); } t = AddToGarbage (t, s); if (DynamicStrings_Equal (t, s)) @@ -1953,7 +1988,7 @@ extern "C" bool DynamicStrings_EqualArray (DynamicStrings_String s, const char * t = DynamicStrings_InitString ((const char *) a, _a_high); if (TraceOn) { - t = AssignDebug (t, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1280, (const char *) "EqualArray", 10); + t = AssignDebug (t, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1305, (const char *) "EqualArray", 10); } t = AddToGarbage (t, s); if (DynamicStrings_Equal (t, s)) @@ -1991,7 +2026,7 @@ extern "C" DynamicStrings_String DynamicStrings_Mult (DynamicStrings_String s, u } if (TraceOn) { - s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1312, (const char *) "Mult", 4); + s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1337, (const char *) "Mult", 4); } return s; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -2070,7 +2105,7 @@ extern "C" DynamicStrings_String DynamicStrings_Slice (DynamicStrings_String s, AddDebugInfo (t->contents.next); if (TraceOn) { - t->contents.next = AssignDebug (t->contents.next, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1380, (const char *) "Slice", 5); + t->contents.next = AssignDebug (t->contents.next, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1405, (const char *) "Slice", 5); } } t = t->contents.next; @@ -2088,7 +2123,7 @@ extern "C" DynamicStrings_String DynamicStrings_Slice (DynamicStrings_String s, } if (TraceOn) { - d = AssignDebug (d, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1397, (const char *) "Slice", 5); + d = AssignDebug (d, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1422, (const char *) "Slice", 5); } return d; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -2216,7 +2251,7 @@ extern "C" DynamicStrings_String DynamicStrings_RemoveComment (DynamicStrings_St } if (TraceOn) { - s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1509, (const char *) "RemoveComment", 13); + s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1534, (const char *) "RemoveComment", 13); } return s; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -2241,7 +2276,7 @@ extern "C" DynamicStrings_String DynamicStrings_RemoveWhitePrefix (DynamicString s = DynamicStrings_Slice (s, (int ) (i), 0); if (TraceOn) { - s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1621, (const char *) "RemoveWhitePrefix", 17); + s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1646, (const char *) "RemoveWhitePrefix", 17); } return s; /* static analysis guarentees a RETURN statement will be used before here. */ @@ -2266,7 +2301,7 @@ extern "C" DynamicStrings_String DynamicStrings_RemoveWhitePostfix (DynamicStrin s = DynamicStrings_Slice (s, 0, i+1); if (TraceOn) { - s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1643, (const char *) "RemoveWhitePostfix", 18); + s = AssignDebug (s, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/DynamicStrings.mod", 55, 1668, (const char *) "RemoveWhitePostfix", 18); } return s; /* static analysis guarentees a RETURN statement will be used before here. */ diff --git a/gcc/m2/mc-boot/GDynamicStrings.h b/gcc/m2/mc-boot/GDynamicStrings.h index d20d618ec9f..c3fb7ff961d 100644 --- a/gcc/m2/mc-boot/GDynamicStrings.h +++ b/gcc/m2/mc-boot/GDynamicStrings.h @@ -124,6 +124,13 @@ EXTERN DynamicStrings_String DynamicStrings_ConCatChar (DynamicStrings_String a, EXTERN DynamicStrings_String DynamicStrings_Assign (DynamicStrings_String a, DynamicStrings_String b); +/* + ReplaceChar - returns string s after it has changed all + occurances of from to to. +*/ + +EXTERN DynamicStrings_String DynamicStrings_ReplaceChar (DynamicStrings_String s, char from, char to); + /* Dup - duplicate a String, s, returning the copy of s. */ diff --git a/gcc/m2/mc-boot/GFIO.cc b/gcc/m2/mc-boot/GFIO.cc index a3f53626f26..683a11fc6fd 100644 --- a/gcc/m2/mc-boot/GFIO.cc +++ b/gcc/m2/mc-boot/GFIO.cc @@ -195,7 +195,7 @@ extern "C" void FIO_FlushBuffer (FIO_File f); extern "C" unsigned int FIO_ReadNBytes (FIO_File f, unsigned int nBytes, void * dest); /* - ReadAny - reads HIGH(a) bytes into, a. All input + ReadAny - reads HIGH (a) + 1 bytes into, a. All input is fully buffered, unlike ReadNBytes and thus is more suited to small reads. */ @@ -213,7 +213,7 @@ extern "C" void FIO_ReadAny (FIO_File f, unsigned char *a, unsigned int _a_high) extern "C" unsigned int FIO_WriteNBytes (FIO_File f, unsigned int nBytes, void * src); /* - WriteAny - writes HIGH(a) bytes onto, file, f. All output + WriteAny - writes HIGH (a) + 1 bytes onto, file, f. All output is fully buffered, unlike WriteNBytes and thus is more suited to small writes. */ @@ -410,7 +410,7 @@ static int ReadFromBuffer (FIO_File f, void * a, unsigned int nBytes); Useful when performing small reads. */ -static int BufferedRead (FIO_File f, unsigned int nBytes, void * a); +static int BufferedRead (FIO_File f, unsigned int nBytes, void * dest); /* HandleEscape - translates @@ -473,7 +473,7 @@ static void SetEndOfLine (FIO_File f, char ch); Useful when performing small writes. */ -static int BufferedWrite (FIO_File f, unsigned int nBytes, void * a); +static int BufferedWrite (FIO_File f, unsigned int nBytes, void * src); /* PreInitialize - preinitialize the file descriptor. @@ -809,11 +809,11 @@ static int ReadFromBuffer (FIO_File f, void * a, unsigned int nBytes) Useful when performing small reads. */ -static int BufferedRead (FIO_File f, unsigned int nBytes, void * a) +static int BufferedRead (FIO_File f, unsigned int nBytes, void * dest) { typedef unsigned char *BufferedRead__T3; - void * t; + void * src; int total; int n; BufferedRead__T3 p; @@ -835,7 +835,7 @@ static int BufferedRead (FIO_File f, unsigned int nBytes, void * a) if (nBytes == 1) { /* too expensive to call memcpy for 1 character */ - p = static_cast (a); + p = static_cast (dest); (*p) = static_cast ((*fd->buffer->contents).array[fd->buffer->position]); fd->buffer->left -= 1; /* remove consumed byte */ fd->buffer->position += 1; /* move onwards n byte */ @@ -845,13 +845,13 @@ static int BufferedRead (FIO_File f, unsigned int nBytes, void * a) else { n = Min (fd->buffer->left, nBytes); - t = fd->buffer->address; - t = reinterpret_cast (reinterpret_cast (t)+fd->buffer->position); - p = static_cast (libc_memcpy (a, t, static_cast (n))); + src = fd->buffer->address; + src = reinterpret_cast (reinterpret_cast (src)+fd->buffer->position); + p = static_cast (libc_memcpy (dest, src, static_cast (n))); fd->buffer->left -= n; /* remove consumed bytes */ fd->buffer->position += n; /* move onwards n bytes */ /* move onwards ready for direct reads */ - a = reinterpret_cast (reinterpret_cast (a)+n); + dest = reinterpret_cast (reinterpret_cast (dest)+n); nBytes -= n; /* reduce the amount for future direct */ /* read */ total += n; @@ -1236,11 +1236,11 @@ static void SetEndOfLine (FIO_File f, char ch) Useful when performing small writes. */ -static int BufferedWrite (FIO_File f, unsigned int nBytes, void * a) +static int BufferedWrite (FIO_File f, unsigned int nBytes, void * src) { typedef unsigned char *BufferedWrite__T5; - void * t; + void * dest; int total; int n; BufferedWrite__T5 p; @@ -1262,7 +1262,7 @@ static int BufferedWrite (FIO_File f, unsigned int nBytes, void * a) if (nBytes == 1) { /* too expensive to call memcpy for 1 character */ - p = static_cast (a); + p = static_cast (src); (*fd->buffer->contents).array[fd->buffer->position] = static_cast ((*p)); fd->buffer->left -= 1; /* reduce space */ fd->buffer->position += 1; /* move onwards n byte */ @@ -1272,13 +1272,13 @@ static int BufferedWrite (FIO_File f, unsigned int nBytes, void * a) else { n = Min (fd->buffer->left, nBytes); - t = fd->buffer->address; - t = reinterpret_cast (reinterpret_cast (t)+fd->buffer->position); - p = static_cast (libc_memcpy (a, t, static_cast ((unsigned int ) (n)))); + dest = fd->buffer->address; + dest = reinterpret_cast (reinterpret_cast (dest)+fd->buffer->position); + p = static_cast (libc_memcpy (dest, src, static_cast ((unsigned int ) (n)))); fd->buffer->left -= n; /* remove consumed bytes */ fd->buffer->position += n; /* move onwards n bytes */ /* move ready for further writes */ - a = reinterpret_cast (reinterpret_cast (a)+n); + src = reinterpret_cast (reinterpret_cast (src)+n); nBytes -= n; /* reduce the amount for future writes */ total += n; /* reduce the amount for future writes */ } @@ -1686,7 +1686,7 @@ extern "C" unsigned int FIO_ReadNBytes (FIO_File f, unsigned int nBytes, void * /* - ReadAny - reads HIGH(a) bytes into, a. All input + ReadAny - reads HIGH (a) + 1 bytes into, a. All input is fully buffered, unlike ReadNBytes and thus is more suited to small reads. */ @@ -1694,7 +1694,7 @@ extern "C" unsigned int FIO_ReadNBytes (FIO_File f, unsigned int nBytes, void * extern "C" void FIO_ReadAny (FIO_File f, unsigned char *a, unsigned int _a_high) { CheckAccess (f, FIO_openedforread, false); - if ((BufferedRead (f, _a_high, a)) == ((int ) (_a_high))) + if ((BufferedRead (f, _a_high+1, a)) == ((int ) (_a_high+1))) { SetEndOfLine (f, static_cast (a[_a_high])); } @@ -1745,7 +1745,7 @@ extern "C" unsigned int FIO_WriteNBytes (FIO_File f, unsigned int nBytes, void * /* - WriteAny - writes HIGH(a) bytes onto, file, f. All output + WriteAny - writes HIGH (a) + 1 bytes onto, file, f. All output is fully buffered, unlike WriteNBytes and thus is more suited to small writes. */ @@ -1753,7 +1753,7 @@ extern "C" unsigned int FIO_WriteNBytes (FIO_File f, unsigned int nBytes, void * extern "C" void FIO_WriteAny (FIO_File f, unsigned char *a, unsigned int _a_high) { CheckAccess (f, FIO_openedforwrite, true); - if ((BufferedWrite (f, _a_high, a)) == ((int ) (_a_high))) + if ((BufferedWrite (f, _a_high+1, a)) == ((int ) (_a_high+1))) {} /* empty. */ } diff --git a/gcc/m2/mc-boot/GFIO.h b/gcc/m2/mc-boot/GFIO.h index a4a9e40c05b..04dd84411f7 100644 --- a/gcc/m2/mc-boot/GFIO.h +++ b/gcc/m2/mc-boot/GFIO.h @@ -135,7 +135,7 @@ EXTERN void FIO_FlushBuffer (FIO_File f); EXTERN unsigned int FIO_ReadNBytes (FIO_File f, unsigned int nBytes, void * dest); /* - ReadAny - reads HIGH(a) bytes into, a. All input + ReadAny - reads HIGH (a) + 1 bytes into, a. All input is fully buffered, unlike ReadNBytes and thus is more suited to small reads. */ @@ -153,7 +153,7 @@ EXTERN void FIO_ReadAny (FIO_File f, unsigned char *a, unsigned int _a_high); EXTERN unsigned int FIO_WriteNBytes (FIO_File f, unsigned int nBytes, void * src); /* - WriteAny - writes HIGH(a) bytes onto, file, f. All output + WriteAny - writes HIGH (a) + 1 bytes onto, file, f. All output is fully buffered, unlike WriteNBytes and thus is more suited to small writes. */ diff --git a/gcc/m2/mc-boot/GIO.cc b/gcc/m2/mc-boot/GIO.cc index feaf27d1674..e1c55de8b6e 100644 --- a/gcc/m2/mc-boot/GIO.cc +++ b/gcc/m2/mc-boot/GIO.cc @@ -286,12 +286,13 @@ static void dononraw (termios_TERMIOS term) static void Init (void) { - fdState.array[0].IsEof = false; - fdState.array[0].IsRaw = false; - fdState.array[1].IsEof = false; - fdState.array[1].IsRaw = false; - fdState.array[2].IsEof = false; - fdState.array[2].IsRaw = false; + unsigned int fdi; + + for (fdi=0; fdi<=MaxDefaultFd; fdi++) + { + fdState.array[fdi].IsEof = false; + fdState.array[fdi].IsRaw = false; + } } diff --git a/gcc/m2/mc-boot/GRTint.cc b/gcc/m2/mc-boot/GRTint.cc index e8f4bc46a6c..d67ae946516 100644 --- a/gcc/m2/mc-boot/GRTint.cc +++ b/gcc/m2/mc-boot/GRTint.cc @@ -352,6 +352,10 @@ static RTint_Vector FindPendingVector (unsigned int vec) static void AddFd (Selective_SetOfFd *set, int *max, int fd) { + if (fd < 0) + { + return ; + } (*max) = Max (fd, (*max)); if ((*set) == NULL) { @@ -928,6 +932,7 @@ extern "C" void RTint_Listen (bool untilInterrupt, RTint_DispatchVector call, un { bool found; int result; + Selective_Timeval zero; Selective_Timeval after; Selective_Timeval b4; Selective_Timeval timeval; @@ -995,13 +1000,13 @@ extern "C" void RTint_Listen (bool untilInterrupt, RTint_DispatchVector call, un { Selective_SetTime (timeval, 0, 0); } - if (((untilInterrupt && (inSet == NULL)) && (outSet == NULL)) && ! found) + if ((untilInterrupt && (((inSet == NULL) && (outSet == NULL)) || (maxFd == -1))) && ! found) { - M2RTS_Halt ((const char *) "deadlock found, no more processes to run and no interrupts active", 65, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/RTint.mod", 46, (const char *) "Listen", 6, 728); + M2RTS_Halt ((const char *) "deadlock found, no more processes to run and no interrupts active", 65, (const char *) "../../gcc-read-write/gcc/m2/gm2-libs/RTint.mod", 46, (const char *) "Listen", 6, 733); } /* printf('} ') ; */ - if (((! found && (maxFd == -1)) && (inSet == NULL)) && (outSet == NULL)) + if (! found && (maxFd == -1)) { /* no file descriptors to be selected upon. */ timeval = Selective_KillTime (timeval); @@ -1012,6 +1017,7 @@ extern "C" void RTint_Listen (bool untilInterrupt, RTint_DispatchVector call, un { Selective_GetTime (timeval, &sec, µ); Assertion_Assert (micro < Microseconds); + zero = Selective_InitTime (0, 0); b4 = Selective_InitTime (0, 0); after = Selective_InitTime (0, 0); result = Selective_GetTimeOfDay (b4); @@ -1028,28 +1034,65 @@ extern "C" void RTint_Listen (bool untilInterrupt, RTint_DispatchVector call, un { libc_printf ((const char *) "select (.., .., .., %u.%06u)\\n", 30, sec, micro); } - result = RTco_select (maxFd+1, inSet, outSet, NULL, timeval); + if (maxFd < 0) + { + result = RTco_select (0, NULL, NULL, NULL, timeval); + } + else + { + result = RTco_select (maxFd+1, inSet, outSet, NULL, timeval); + } if (result == -1) { - libc_perror ((const char *) "select", 6); - result = RTco_select (maxFd+1, inSet, outSet, NULL, NULL); - if (result == -1) + if (Debugging) { - libc_perror ((const char *) "select timeout argument is faulty", 33); + libc_perror ((const char *) "select failed : ", 16); } - result = RTco_select (maxFd+1, inSet, NULL, NULL, timeval); - if (result == -1) + result = RTco_select (maxFd+1, inSet, outSet, NULL, zero); + if (result != -1) { - libc_perror ((const char *) "select output fd argument is faulty", 35); - } - result = RTco_select (maxFd+1, NULL, outSet, NULL, timeval); - if (result == -1) - { - libc_perror ((const char *) "select input fd argument is faulty", 34); + Selective_GetTime (timeval, &sec, µ); + if (Debugging) + { + libc_printf ((const char *) "(nfds : %d timeval: %u.%06u) : \\n", 33, maxFd, sec, micro); + } + libc_perror ((const char *) "select timeout argument was faulty : ", 37); } else { - libc_perror ((const char *) "select maxFD+1 argument is faulty", 33); + result = RTco_select (maxFd+1, inSet, NULL, NULL, timeval); + if (result != -1) + { + libc_perror ((const char *) "select output fd argument was faulty : ", 39); + } + else + { + result = RTco_select (maxFd+1, NULL, outSet, NULL, timeval); + if (result != -1) + { + libc_perror ((const char *) "select input fd argument was faulty : ", 38); + } + else + { + if (maxFd == -1) + { + /* avoid dangling else. */ + result = RTco_select (0, NULL, NULL, NULL, timeval); + if (result == -1) + { + if (Debugging) + { + libc_perror ((const char *) "select does not accept nfds == 0 ", 33); + } + result = 0; + } + } + else + { + libc_perror ((const char *) "select maxFD+1 argument was faulty : ", 37); + } + } + } } } } while (! (result != -1)); @@ -1060,6 +1103,10 @@ extern "C" void RTint_Listen (bool untilInterrupt, RTint_DispatchVector call, un { timeval = Selective_KillTime (timeval); } + if (zero != NULL) + { + zero = Selective_KillTime (zero); + } if (after != NULL) { after = Selective_KillTime (after); diff --git a/gcc/m2/mc-boot/Gdecl.cc b/gcc/m2/mc-boot/Gdecl.cc index 72acd827876..793d91ee20b 100644 --- a/gcc/m2/mc-boot/Gdecl.cc +++ b/gcc/m2/mc-boot/Gdecl.cc @@ -2516,6 +2516,12 @@ extern "C" DynamicStrings_String DynamicStrings_ConCatChar (DynamicStrings_Strin extern "C" DynamicStrings_String DynamicStrings_Assign (DynamicStrings_String a, DynamicStrings_String b); +/* + ReplaceChar - returns string s after it has changed all occurances of from to to. +*/ + +extern "C" DynamicStrings_String DynamicStrings_ReplaceChar (DynamicStrings_String s, char from, char to); + /* Dup - duplicate a String, s, returning the copy of s. */ @@ -2750,6 +2756,9 @@ extern "C" void mcOptions_writeGPLheader (FIO_File f); extern "C" void mcOptions_setSuppressNoReturn (bool value); extern "C" bool mcOptions_getSuppressNoReturn (void); extern "C" bool mcOptions_useBool (void); +extern "C" DynamicStrings_String mcOptions_getCRealType (void); +extern "C" DynamicStrings_String mcOptions_getCLongRealType (void); +extern "C" DynamicStrings_String mcOptions_getCShortRealType (void); extern "C" DynamicStrings_String FormatStrings_Sprintf0 (DynamicStrings_String fmt); extern "C" DynamicStrings_String FormatStrings_Sprintf1 (DynamicStrings_String fmt, const unsigned char *w_, unsigned int _w_high); extern "C" DynamicStrings_String FormatStrings_Sprintf2 (DynamicStrings_String fmt, const unsigned char *w1_, unsigned int _w1_high, const unsigned char *w2_, unsigned int _w2_high); @@ -5345,6 +5354,12 @@ static void doSizeC (mcPretty_pretty p, decl_node n); static void doConvertC (mcPretty_pretty p, decl_node n, const char *conversion_, unsigned int _conversion_high); +/* + doConvertSC - +*/ + +static void doConvertSC (mcPretty_pretty p, decl_node n, DynamicStrings_String conversion); + /* getFuncFromExpr - */ @@ -10544,19 +10559,19 @@ static void doExprC (mcPretty_pretty p, decl_node n) break; case decl_float: - doConvertC (p, n, (const char *) "(double)", 8); + doConvertSC (p, n, mcOptions_getCRealType ()); break; case decl_trunc: - doConvertC (p, n, (const char *) "(int)", 5); + doConvertC (p, n, (const char *) "int", 3); break; case decl_ord: - doConvertC (p, n, (const char *) "(unsigned int)", 14); + doConvertC (p, n, (const char *) "unsigned int", 12); break; case decl_chr: - doConvertC (p, n, (const char *) "(char)", 6); + doConvertC (p, n, (const char *) "char", 4); break; case decl_cap: @@ -12615,15 +12630,15 @@ static void doBaseC (mcPretty_pretty p, decl_node n) break; case decl_real: - outText (p, (const char *) "double", 6); + outTextS (p, mcOptions_getCRealType ()); break; case decl_longreal: - outText (p, (const char *) "long double", 11); + outTextS (p, mcOptions_getCLongRealType ()); break; case decl_shortreal: - outText (p, (const char *) "float", 5); + outTextS (p, mcOptions_getCShortRealType ()); break; case decl_bitset: @@ -16311,15 +16326,29 @@ static void doSizeC (mcPretty_pretty p, decl_node n) static void doConvertC (mcPretty_pretty p, decl_node n, const char *conversion_, unsigned int _conversion_high) { + DynamicStrings_String s; char conversion[_conversion_high+1]; /* make a local copy of each unbounded array. */ memcpy (conversion, conversion_, _conversion_high+1); + s = DynamicStrings_InitString ((const char *) conversion, _conversion_high); + doConvertSC (p, n, s); + s = DynamicStrings_KillString (s); +} + + +/* + doConvertSC - +*/ + +static void doConvertSC (mcPretty_pretty p, decl_node n, DynamicStrings_String conversion) +{ mcDebug_assert (isUnary (n)); mcPretty_setNeedSpace (p); - outText (p, (const char *) "(", 1); - outText (p, (const char *) conversion, _conversion_high); + outText (p, (const char *) "((", 2); + outTextS (p, conversion); + outText (p, (const char *) ")", 1); mcPretty_setNeedSpace (p); outText (p, (const char *) "(", 1); doExprC (p, n->unaryF.arg); diff --git a/gcc/m2/mc-boot/GmcOptions.cc b/gcc/m2/mc-boot/GmcOptions.cc index 9b2dc424692..23d2a39ccda 100644 --- a/gcc/m2/mc-boot/GmcOptions.cc +++ b/gcc/m2/mc-boot/GmcOptions.cc @@ -72,6 +72,9 @@ static bool extendedOpaque; static bool internalDebugging; static bool verbose; static bool quiet; +static DynamicStrings_String CReal; +static DynamicStrings_String CLongReal; +static DynamicStrings_String CShortReal; static DynamicStrings_String projectContents; static DynamicStrings_String summaryContents; static DynamicStrings_String contributedContents; @@ -191,6 +194,27 @@ extern "C" bool mcOptions_getSuppressNoReturn (void); extern "C" bool mcOptions_useBool (void); +/* + getCRealType - returns the string representing the REAL type + used by C. By default this is "double". +*/ + +extern "C" DynamicStrings_String mcOptions_getCRealType (void); + +/* + getCLongRealType - returns the string representing the REAL type + used by C. By default this is "long double". +*/ + +extern "C" DynamicStrings_String mcOptions_getCLongRealType (void); + +/* + getCShortRealType - returns the string representing the REAL type + used by C. By default this is "float". +*/ + +extern "C" DynamicStrings_String mcOptions_getCShortRealType (void); + /* getYear - return the year. */ @@ -299,6 +323,34 @@ static void setHPrefix (DynamicStrings_String s); static void setIgnoreFQ (bool value); +/* + toCType - returns a new string which has all occurences of '-' + replaced by ' '. +*/ + +static DynamicStrings_String toCType (DynamicStrings_String namedType); + +/* + setCReal - assigns CReal to namedType after it has been transformed by + toCType. +*/ + +static void setCReal (DynamicStrings_String namedType); + +/* + setCShortReal - assigns CShortReal to namedType after it has been + transformed by toCType. +*/ + +static void setCShortReal (DynamicStrings_String namedType); + +/* + setCLongReal - assigns CLongReal to namedType after it has been + transformed by toCType. +*/ + +static void setCLongReal (DynamicStrings_String namedType); + /* optionIs - returns TRUE if the first len (right) characters match left. @@ -674,6 +726,52 @@ static void setIgnoreFQ (bool value) } +/* + toCType - returns a new string which has all occurences of '-' + replaced by ' '. +*/ + +static DynamicStrings_String toCType (DynamicStrings_String namedType) +{ + return DynamicStrings_ReplaceChar (DynamicStrings_Dup (namedType), '-', ' '); + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + setCReal - assigns CReal to namedType after it has been transformed by + toCType. +*/ + +static void setCReal (DynamicStrings_String namedType) +{ + CReal = toCType (namedType); +} + + +/* + setCShortReal - assigns CShortReal to namedType after it has been + transformed by toCType. +*/ + +static void setCShortReal (DynamicStrings_String namedType) +{ + CShortReal = toCType (namedType); +} + + +/* + setCLongReal - assigns CLongReal to namedType after it has been + transformed by toCType. +*/ + +static void setCLongReal (DynamicStrings_String namedType) +{ + CLongReal = toCType (namedType); +} + + /* optionIs - returns TRUE if the first len (right) characters match left. @@ -851,6 +949,21 @@ static void handleOption (DynamicStrings_String arg) /* avoid dangling else. */ suppressNoReturn = true; } + else if (optionIs ((const char *) "--real=", 7, arg)) + { + /* avoid dangling else. */ + setCReal (DynamicStrings_Slice (arg, 7, 0)); + } + else if (optionIs ((const char *) "--longreal=", 11, arg)) + { + /* avoid dangling else. */ + setCLongReal (DynamicStrings_Slice (arg, 11, 0)); + } + else if (optionIs ((const char *) "--shortreal=", 12, arg)) + { + /* avoid dangling else. */ + setCShortReal (DynamicStrings_Slice (arg, 12, 0)); + } } @@ -1106,6 +1219,45 @@ extern "C" bool mcOptions_useBool (void) __builtin_unreachable (); } + +/* + getCRealType - returns the string representing the REAL type + used by C. By default this is "double". +*/ + +extern "C" DynamicStrings_String mcOptions_getCRealType (void) +{ + return CReal; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + getCLongRealType - returns the string representing the REAL type + used by C. By default this is "long double". +*/ + +extern "C" DynamicStrings_String mcOptions_getCLongRealType (void) +{ + return CLongReal; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + + +/* + getCShortRealType - returns the string representing the REAL type + used by C. By default this is "float". +*/ + +extern "C" DynamicStrings_String mcOptions_getCShortRealType (void) +{ + return CShortReal; + /* static analysis guarentees a RETURN statement will be used before here. */ + __builtin_unreachable (); +} + extern "C" void _M2_mcOptions_init (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) { langC = true; @@ -1136,6 +1288,9 @@ extern "C" void _M2_mcOptions_init (__attribute__((unused)) int argc,__attribute summaryContents = DynamicStrings_InitString ((const char *) "", 0); contributedContents = DynamicStrings_InitString ((const char *) "", 0); projectContents = DynamicStrings_InitString ((const char *) "GNU Modula-2", 12); + CReal = DynamicStrings_InitString ((const char *) "double", 6); + CLongReal = DynamicStrings_InitString ((const char *) "long double", 11); + CShortReal = DynamicStrings_InitString ((const char *) "float", 5); } extern "C" void _M2_mcOptions_fini (__attribute__((unused)) int argc,__attribute__((unused)) char *argv[],__attribute__((unused)) char *envp[]) diff --git a/gcc/m2/mc-boot/GmcOptions.h b/gcc/m2/mc-boot/GmcOptions.h index ba2285799a1..077c5882795 100644 --- a/gcc/m2/mc-boot/GmcOptions.h +++ b/gcc/m2/mc-boot/GmcOptions.h @@ -151,6 +151,27 @@ EXTERN bool mcOptions_getSuppressNoReturn (void); */ EXTERN bool mcOptions_useBool (void); + +/* + getCRealType - returns the string representing the REAL type + used by C. By default this is "double". +*/ + +EXTERN DynamicStrings_String mcOptions_getCRealType (void); + +/* + getCLongRealType - returns the string representing the REAL type + used by C. By default this is "long double". +*/ + +EXTERN DynamicStrings_String mcOptions_getCLongRealType (void); + +/* + getCShortRealType - returns the string representing the REAL type + used by C. By default this is "float". +*/ + +EXTERN DynamicStrings_String mcOptions_getCShortRealType (void); # ifdef __cplusplus } # endif diff --git a/gcc/m2/mc/decl.mod b/gcc/m2/mc/decl.mod index 856c7170547..54a692150a2 100644 --- a/gcc/m2/mc/decl.mod +++ b/gcc/m2/mc/decl.mod @@ -34,7 +34,8 @@ FROM StringConvert IMPORT CardinalToString, ostoc ; FROM mcOptions IMPORT getOutputFile, getDebugTopological, getHPrefix, getIgnoreFQ, getExtendedOpaque, writeGPLheader, getGccConfigSystem, getScaffoldDynamic, getScaffoldMain, getSuppressNoReturn, - useBool ; + useBool, getCRealType, getCShortRealType, + getCLongRealType ; FROM FormatStrings IMPORT Sprintf0, Sprintf1, Sprintf2, Sprintf3 ; FROM libc IMPORT printf, memset ; @@ -6355,10 +6356,10 @@ BEGIN adr : doAdrC (p, n) | size, tsize : doSizeC (p, n) | - float : doConvertC (p, n, "(double)") | - trunc : doConvertC (p, n, "(int)") | - ord : doConvertC (p, n, "(unsigned int)") | - chr : doConvertC (p, n, "(char)") | + float : doConvertSC (p, n, getCRealType ()) | + trunc : doConvertC (p, n, "int") | + ord : doConvertC (p, n, "unsigned int") | + chr : doConvertC (p, n, "char") | cap : doCapC (p, n) | abs : doAbsC (p, n) | high : doFuncHighC (p, n^.unaryF.arg) | @@ -7878,9 +7879,9 @@ BEGIN complex : outText (p, 'double complex') | longcomplex : outText (p, 'long double complex') | shortcomplex: outText (p, 'float complex') | - real : outText (p, 'double') | - longreal : outText (p, 'long double') | - shortreal : outText (p, 'float') | + real : outTextS (p, getCRealType ()) | + longreal : outTextS (p, getCLongRealType ()) | + shortreal : outTextS (p, getCShortRealType ()) | bitset : outText (p, 'unsigned int') | boolean : doBoolC (p) | proc : outText (p, 'PROC') @@ -11026,16 +11027,31 @@ END doSizeC ; *) PROCEDURE doConvertC (p: pretty; n: node; conversion: ARRAY OF CHAR) ; +VAR + s: String ; +BEGIN + s := InitString (conversion) ; + doConvertSC (p, n, s) ; + s := KillString (s) +END doConvertC ; + + +(* + doConvertSC - +*) + +PROCEDURE doConvertSC (p: pretty; n: node; conversion: String) ; BEGIN assert (isUnary (n)) ; setNeedSpace (p) ; - outText (p, "(") ; - outText (p, conversion) ; + outText (p, "((") ; + outTextS (p, conversion) ; + outText (p, ")") ; setNeedSpace (p) ; outText (p, "(") ; doExprC (p, n^.unaryF.arg) ; outText (p, "))") -END doConvertC ; +END doConvertSC ; (* not needed? diff --git a/gcc/m2/mc/mcOptions.def b/gcc/m2/mc/mcOptions.def index a814f830298..2b2888a9542 100644 --- a/gcc/m2/mc/mcOptions.def +++ b/gcc/m2/mc/mcOptions.def @@ -155,4 +155,28 @@ PROCEDURE getSuppressNoReturn () : BOOLEAN ; PROCEDURE useBool () : BOOLEAN ; +(* + getCRealType - returns the string representing the REAL type + used by C. By default this is "double". +*) + +PROCEDURE getCRealType () : String ; + + +(* + getCLongRealType - returns the string representing the REAL type + used by C. By default this is "long double". +*) + +PROCEDURE getCLongRealType () : String ; + + +(* + getCShortRealType - returns the string representing the REAL type + used by C. By default this is "float". +*) + +PROCEDURE getCShortRealType () : String ; + + END mcOptions. diff --git a/gcc/m2/mc/mcOptions.mod b/gcc/m2/mc/mcOptions.mod index 9c439edcbac..1582dfe3125 100644 --- a/gcc/m2/mc/mcOptions.mod +++ b/gcc/m2/mc/mcOptions.mod @@ -28,7 +28,7 @@ FROM decl IMPORT setLangC, setLangCP, setLangM2 ; FROM DynamicStrings IMPORT String, Length, InitString, Mark, Slice, EqualArray, InitStringCharStar, ConCatChar, ConCat, KillString, - Dup, string, char ; + Dup, string, char, ReplaceChar ; IMPORT FIO ; IMPORT SFIO ; @@ -55,6 +55,9 @@ VAR internalDebugging, verbose, quiet : BOOLEAN ; + CReal, + CLongReal, + CShortReal, projectContents, summaryContents, contributedContents, @@ -593,6 +596,83 @@ BEGIN END useBool ; +(* + getCRealType - returns the string representing the REAL type + used by C. By default this is "double". +*) + +PROCEDURE getCRealType () : String ; +BEGIN + RETURN CReal +END getCRealType ; + + +(* + getCLongRealType - returns the string representing the REAL type + used by C. By default this is "long double". +*) + +PROCEDURE getCLongRealType () : String ; +BEGIN + RETURN CLongReal +END getCLongRealType ; + + +(* + getCShortRealType - returns the string representing the REAL type + used by C. By default this is "float". +*) + +PROCEDURE getCShortRealType () : String ; +BEGIN + RETURN CShortReal +END getCShortRealType ; + + +(* + toCType - returns a new string which has all occurences of '-' + replaced by ' '. +*) + +PROCEDURE toCType (namedType: String) : String ; +BEGIN + RETURN ReplaceChar (Dup (namedType), '-', ' ') +END toCType ; + + +(* + setCReal - assigns CReal to namedType after it has been transformed by + toCType. +*) + +PROCEDURE setCReal (namedType: String) ; +BEGIN + CReal := toCType (namedType) +END setCReal ; + + +(* + setCShortReal - assigns CShortReal to namedType after it has been + transformed by toCType. +*) + +PROCEDURE setCShortReal (namedType: String) ; +BEGIN + CShortReal := toCType (namedType) +END setCShortReal ; + + +(* + setCLongReal - assigns CLongReal to namedType after it has been + transformed by toCType. +*) + +PROCEDURE setCLongReal (namedType: String) ; +BEGIN + CLongReal := toCType (namedType) +END setCLongReal ; + + (* optionIs - returns TRUE if the first len (right) characters match left. @@ -711,6 +791,15 @@ BEGIN ELSIF optionIs ('--suppress-noreturn', arg) THEN suppressNoReturn := TRUE + ELSIF optionIs ("--real=", arg) + THEN + setCReal (Slice (arg, 7, 0)) + ELSIF optionIs ("--longreal=", arg) + THEN + setCLongReal (Slice (arg, 11, 0)) + ELSIF optionIs ("--shortreal=", arg) + THEN + setCShortReal (Slice (arg, 12, 0)) END END handleOption ; @@ -777,5 +866,8 @@ BEGIN outputFile := InitString ('-') ; summaryContents := InitString ('') ; contributedContents := InitString ('') ; - projectContents := InitString ('GNU Modula-2') + projectContents := InitString ('GNU Modula-2') ; + CReal := InitString ('double') ; + CLongReal := InitString ('long double') ; + CShortReal := InitString ('float') END mcOptions. diff --git a/gcc/testsuite/gm2/extensions/pass/libc.def b/gcc/testsuite/gm2/extensions/pass/libc.def index 73a5f650405..c06456916e9 100644 --- a/gcc/testsuite/gm2/extensions/pass/libc.def +++ b/gcc/testsuite/gm2/extensions/pass/libc.def @@ -14,6 +14,7 @@ for more details. You should have received a copy of the GNU General Public License along with gm2; see the file COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *) + DEFINITION MODULE libc ; FROM SYSTEM IMPORT ADDRESS ; diff --git a/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.c b/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.c new file mode 100644 index 00000000000..8c43ac4ba94 --- /dev/null +++ b/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.c @@ -0,0 +1,24 @@ +#if defined(PPC64LE) +typedef __float128 longreal_t; +#else +typedef long double longreal_t; +#endif + +longreal_t +cstub_identicall (longreal_t x) +{ + return x; +} + +double +cstub_identical (double x) +{ + return x; +} + + +float +cstub_identicalf (float x) +{ + return x; +} diff --git a/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.def b/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.def new file mode 100644 index 00000000000..02e2a74d64c --- /dev/null +++ b/gcc/testsuite/gm2/pim/intrinsic/run/pass/cstub.def @@ -0,0 +1,7 @@ +DEFINITION MODULE FOR "C" cstub ; (*!m2pim+gm2*) + +PROCEDURE identicall (x: LONGREAL) : LONGREAL ; +PROCEDURE identical (x: REAL) : REAL ; +PROCEDURE identicalf (x: SHORTREAL) : SHORTREAL ; + +END cstub. diff --git a/gcc/testsuite/gm2/pim/intrinsic/run/pass/pim-intrinsic-run-pass.exp b/gcc/testsuite/gm2/pim/intrinsic/run/pass/pim-intrinsic-run-pass.exp new file mode 100644 index 00000000000..69e8fb6868f --- /dev/null +++ b/gcc/testsuite/gm2/pim/intrinsic/run/pass/pim-intrinsic-run-pass.exp @@ -0,0 +1,48 @@ +# Copyright (C) 2023 Free Software Foundation, Inc. + +# This program 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 of the License, or +# (at your option) any later version. +# +# This program 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 +# . + +# This file was written by Gaius Mulley (gaiusmod2@gmail.com) +# for GNU Modula-2. + +if $tracelevel then { + strace $tracelevel +} + +# load support procs +load_lib gm2-torture.exp +load_lib file-format.exp +load_lib target-libpath.exp + +set gm2src ${srcdir}/../m2 + +gm2_init_pim "${srcdir}/gm2/pim/intrinsic/run/pass/" +gm2_link_obj "cstub.o" + +if { [istarget powerpc*-*-*] } then { + set mabi_flags "-mabi=ieeelongdouble" + set options [concat "{additional_flags=$mabi_flags}" $options] +} + +set output [target_compile $srcdir/$subdir/cstub.c cstub.o object $options] + +foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.mod]] { + # If we're only testing specific files and this isn't one of them, skip it. + if ![runtest_file_p $runtests $testcase] then { + continue + } + + gm2-torture-execute $testcase "" "pass" +} diff --git a/gcc/testsuite/gm2/pim/intrinsic/run/pass/test.mod b/gcc/testsuite/gm2/pim/intrinsic/run/pass/test.mod new file mode 100644 index 00000000000..36deb2100c4 --- /dev/null +++ b/gcc/testsuite/gm2/pim/intrinsic/run/pass/test.mod @@ -0,0 +1,102 @@ +MODULE test ; (*!m2pim+gm2*) + +IMPORT cstub ; +FROM libc IMPORT printf, exit ; +FROM Builtins IMPORT sinl, sin, cosl, cos, log10, log10l ; + + +CONST + epsilon = 0.001 ; + pi = 3.1415927 ; + +VAR + code: INTEGER ; + + +PROCEDURE near (x, y: REAL) ; +VAR + diff: REAL ; +BEGIN + diff := x - y ; + IF diff < 0.0 + THEN + diff := -diff + END ; + IF diff > epsilon + THEN + printf ("failure: %f, %f differ\n", x, y) ; + code := 1 + END +END near ; + + +PROCEDURE nearl (in, out, correct: LONGREAL; func: ARRAY OF CHAR) ; +VAR + diff: LONGREAL ; +BEGIN + diff := out - correct ; + IF diff < 0.0 + THEN + diff := -diff + END ; + IF diff > epsilon + THEN + printf ("failure: %s ( %Lf ) -> %Lf # %Lf \n", func, in, out, correct) ; + code := 1 + END +END nearl ; + + +PROCEDURE testfunc ; +VAR + l: LONGREAL ; + r: REAL ; +BEGIN + near (1.0, 1.0) ; + near (10.0, 10.0) ; + near (100.0, 100.0) ; + nearl (1.0, 1.0, 1.0, "") ; + nearl (10.0, 10.0, 10.0, "") ; + nearl (100.0, 100.0, 100.0, "") ; + + near (cstub.identical (1.0), 1.0) ; + near (cstub.identical (10.0), 10.0) ; + near (cstub.identical (100.0), 100.0) ; + nearl (cstub.identicall (1.0), 1.0, 1.0, "identicall") ; + nearl (cstub.identicall (10.0), 10.0, 10.0, "identicall") ; + nearl (cstub.identicall (100.0), 100.0, 100.0, "identicall") ; + + nearl (pi / 6.0, sinl (pi / 6.0), 0.5, "sinl") ; + near (sin (pi / 6.0), 0.5) ; + nearl (pi / 3.0, cosl (pi / 3.0), 0.5, "cosl") ; + near (cos (pi / 3.0), 0.5) ; + nearl (100.0, log10l (100.0), 2.0, "log10l") ; + near (log10 (100.0), 2.0) ; + + nearl (1.23456789, log10l (1.23456789), 0.091515, "log10l") ; + l := 1.23456789 ; + nearl (l, log10l (l), 0.091515, "log10l") ; + + r := pi / 6.0 ; + l := pi / 6.0 ; + nearl (l, sinl (l), 0.5, "sinl") ; + near (sin (r), 0.5) ; + + r := pi / 3.0 ; + l := pi / 3.0 ; + nearl (l, cosl (l), 0.5, "cosl") ; + near (cos (r), 0.5) ; + + r := 100.0 ; + l := 100.0 ; + nearl (l, log10l (l), 2.0, "log10l") ; + near (log10 (r), 2.0) ; + +END testfunc ; + + +BEGIN + code := 0 ; + testfunc ; + exit (code) +END test. diff --git a/gcc/testsuite/gm2/pim/run/pass/builtins.mod b/gcc/testsuite/gm2/pim/run/pass/builtins.mod new file mode 100644 index 00000000000..1cf9fb7cb7f --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/builtins.mod @@ -0,0 +1,79 @@ +MODULE builtins ; (*!m2pim+gm2*) + +FROM Builtins IMPORT log10l ; +FROM libc IMPORT printf, exit ; +FROM libm IMPORT powl ; + + +(* + doPowerOfTen - safely returns the exponent of a LONGREAL as an INTEGER. +*) + +PROCEDURE doPowerOfTen (r: LONGREAL) : INTEGER ; +VAR + i : INTEGER ; + c, d: LONGREAL ; +BEGIN + IF r=0.0 + THEN + RETURN( 0 ) + ELSE + IF r<0.0 + THEN + c := -r + ELSE + c := r + END ; + IF c>=1.0 + THEN + RETURN( VAL(INTEGER, log10l (c)) ) + ELSE + i := 0 ; + LOOP + d := c*powl(10.0, VAL(LONGREAL, i)) ; + IF d>=1.0 + THEN + RETURN( -i ) + ELSE + INC(i) + END + END + END + END +END doPowerOfTen ; + + +PROCEDURE test ; +BEGIN + Assert (doPowerOfTen (1.0), 0) ; + Assert (doPowerOfTen (10.0), 1) ; + Assert (doPowerOfTen (100.0), 2) ; + Assert (doPowerOfTen (-1.0), 0) ; + Assert (doPowerOfTen (-10.0), 1) ; + Assert (doPowerOfTen (-100.0), 2) +END test ; + + +(* + Assert - +*) + +PROCEDURE Assert (func, actual: INTEGER) ; +BEGIN + IF func = actual + THEN + printf ("success: computed %d = actual %d\n", func, actual) + ELSE + printf ("failure: computed %d # actual %d\n", func, actual) ; + code := 1 + END +END Assert ; + + +VAR + code: INTEGER ; +BEGIN + code := 0 ; + test ; + exit (code) +END builtins. diff --git a/gcc/testsuite/gm2/pim/run/pass/convert1.mod b/gcc/testsuite/gm2/pim/run/pass/convert1.mod new file mode 100644 index 00000000000..00eb43f7070 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/convert1.mod @@ -0,0 +1,49 @@ +MODULE convert1 ; + +FROM libc IMPORT printf, exit ; +FROM Builtins IMPORT log10l ; + + +PROCEDURE assert (a, b: INTEGER) ; +BEGIN + IF a # b + THEN + printf ("failure: %d # %d\n", a, b) ; + code := 1 + END +END assert ; + + +PROCEDURE identityl (l: LONGREAL) : LONGREAL ; +BEGIN + RETURN l +END identityl ; + + +PROCEDURE foo (l: LONGREAL) : INTEGER ; +BEGIN + RETURN VAL (INTEGER, identityl (l)) +END foo ; + + +PROCEDURE fooi (l: LONGREAL) : INTEGER ; +BEGIN + RETURN VAL (INTEGER, log10l (l)) +END fooi ; + + +PROCEDURE test ; +BEGIN + assert (foo (1.0), 1) ; + assert (fooi (100.0), 2) ; + assert (fooi (1.23456789), 0) +END test ; + + +VAR + code: INTEGER ; +BEGIN + code := 0 ; + test ; + exit (code) +END convert1. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint1.mod b/gcc/testsuite/gm2/pim/run/pass/longint1.mod new file mode 100644 index 00000000000..ed62c5ebab7 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint1.mod @@ -0,0 +1,49 @@ +MODULE longint1 ; + +FROM libc IMPORT printf, exit ; +FROM Builtins IMPORT log10l ; + + +PROCEDURE equals (left, right: LONGREAL) : BOOLEAN ; +CONST + epsilon = 0.001 ; +VAR + diff: LONGREAL ; +BEGIN + IF right > left + THEN + diff := right - left + ELSE + diff := left - right + END ; + RETURN diff <= epsilon +END equals ; + + +PROCEDURE test (function: ARRAY OF CHAR; input, output, result: LONGREAL) ; +BEGIN + printf ("function %s (%Lf) = %Lf", function, input, output) ; + IF equals (output, result) + THEN + printf (" passed") + ELSE + printf (" (incorrect and should be: %Lf)", result) ; + code := 1 + END ; + printf ("\n") +END test ; + + +VAR + code: INTEGER ; + li : LONGINT ; + in, + res : LONGREAL ; +BEGIN + code := 0 ; + li := 123 ; + in := VAL (LONGREAL, li) ; + res := log10l (in) ; + test ("log10l", in, res, 2.0899) ; + exit (code) +END longint1. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint2.mod b/gcc/testsuite/gm2/pim/run/pass/longint2.mod new file mode 100644 index 00000000000..74875448240 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint2.mod @@ -0,0 +1,51 @@ +MODULE longint2 ; + +FROM libc IMPORT printf, exit ; +FROM Builtins IMPORT log10l, fabsl ; + + +PROCEDURE equals (left, right: LONGREAL) : BOOLEAN ; +CONST + epsilon = 0.001 ; +VAR + diff: LONGREAL ; +BEGIN + IF right > left + THEN + diff := right - left + ELSE + diff := left - right + END ; + RETURN diff <= epsilon +END equals ; + + +PROCEDURE test (function: ARRAY OF CHAR; input, output, result: LONGREAL) ; +BEGIN + printf ("function %s (%Lf) = %Lf", function, input, output) ; + IF equals (output, result) + THEN + printf (" passed") + ELSE + printf (" (incorrect and should be: %Lf)", result) ; + code := 1 + END ; + printf ("\n") +END test ; + + +VAR + code: INTEGER ; + li : LONGINT ; + in, + res : LONGREAL ; +BEGIN + code := 0 ; + li := 123 ; + in := VAL (LONGREAL, li) ; + res := log10l (in) ; + test ("log10l", in, res, 2.0899) ; + res := fabsl (in) ; + test ("fabsl", in, res, 123.0) ; + exit (code) +END longint2. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint3.mod b/gcc/testsuite/gm2/pim/run/pass/longint3.mod new file mode 100644 index 00000000000..73a2531310c --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint3.mod @@ -0,0 +1,23 @@ +MODULE longint3 ; + +FROM libc IMPORT exit, printf ; +FROM Builtins IMPORT log10l ; + +PROCEDURE test ; +VAR + li : LONGINT ; + in, + res : LONGREAL ; +BEGIN + li := 123 ; + in := VAL (LONGREAL, li) ; + res := log10l (in) ; + printf ("log10l (%Lf) = %Lf\n", in, res); + in := VAL (REAL, li) ; + res := log10l (in) ; + printf ("log10l (%Lf) = %Lf\n", in, res); +END test ; + +BEGIN + test +END longint3. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint4.mod b/gcc/testsuite/gm2/pim/run/pass/longint4.mod new file mode 100644 index 00000000000..d3680566732 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint4.mod @@ -0,0 +1,21 @@ +MODULE longint4 ; + +FROM libc IMPORT exit ; + + +PROCEDURE myfunc (x: LONGREAL) : LONGREAL ; +BEGIN + RETURN x +END myfunc ; + + +PROCEDURE test ; +VAR + res : LONGREAL ; +BEGIN + res := myfunc (1.0) +END test ; + +BEGIN + test +END longint4. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint5.mod b/gcc/testsuite/gm2/pim/run/pass/longint5.mod new file mode 100644 index 00000000000..785f707c451 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint5.mod @@ -0,0 +1,24 @@ +MODULE longint5 ; + +FROM libc IMPORT exit ; + + +PROCEDURE myfunc (x: LONGREAL) : LONGREAL ; + VAR + y: LONGREAL ; +BEGIN + y := 1.2 ; + RETURN y +END myfunc ; + + +PROCEDURE test ; +VAR + res : LONGREAL ; +BEGIN + res := myfunc (1.0) +END test ; + +BEGIN + test +END longint5. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint6.mod b/gcc/testsuite/gm2/pim/run/pass/longint6.mod new file mode 100644 index 00000000000..db49fe9c8aa --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint6.mod @@ -0,0 +1,25 @@ +MODULE longint6 ; + +FROM libc IMPORT exit ; +FROM cbuiltin IMPORT sinl ; + + +PROCEDURE myfunc (x: LONGREAL) : LONGREAL ; + VAR + y: LONGREAL ; +BEGIN + y := sinl (x) ; + RETURN y +END myfunc ; + + +PROCEDURE test ; +VAR + res : LONGREAL ; +BEGIN + res := myfunc (1.0) +END test ; + +BEGIN + test +END longint6. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint7.mod b/gcc/testsuite/gm2/pim/run/pass/longint7.mod new file mode 100644 index 00000000000..ec05e7a6256 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint7.mod @@ -0,0 +1,25 @@ +MODULE longint7 ; + +FROM libc IMPORT exit ; +FROM Builtins IMPORT sinl ; + + +PROCEDURE myfunc (x: LONGREAL) : LONGREAL ; + VAR + y: LONGREAL ; +BEGIN + y := sinl (x) ; + RETURN y +END myfunc ; + + +PROCEDURE test ; +VAR + res : LONGREAL ; +BEGIN + res := myfunc (1.0) +END test ; + +BEGIN + test +END longint7. diff --git a/gcc/testsuite/gm2/pim/run/pass/longint8.mod b/gcc/testsuite/gm2/pim/run/pass/longint8.mod new file mode 100644 index 00000000000..a11869f4c29 --- /dev/null +++ b/gcc/testsuite/gm2/pim/run/pass/longint8.mod @@ -0,0 +1,25 @@ +MODULE longint8 ; + +FROM libc IMPORT exit ; +FROM Builtins IMPORT log10l ; + + +PROCEDURE myfunc (x: LONGREAL) : LONGREAL ; + VAR + y: LONGREAL ; +BEGIN + y := log10l (x) ; + RETURN y +END myfunc ; + + +PROCEDURE test ; +VAR + res : LONGREAL ; +BEGIN + res := myfunc (1.0) +END test ; + +BEGIN + test +END longint8. diff --git a/gcc/testsuite/gm2/pimlib/logitech/run/pass/realconv.mod b/gcc/testsuite/gm2/pimlib/logitech/run/pass/realconv.mod index f50f882070f..31e27a35ca2 100644 --- a/gcc/testsuite/gm2/pimlib/logitech/run/pass/realconv.mod +++ b/gcc/testsuite/gm2/pimlib/logitech/run/pass/realconv.mod @@ -45,6 +45,7 @@ VAR BEGIN res := 0 ; RealToString(100.0, 10, 10, a, ok) ; + printf ("RealToString generates string: %s\n", a) ; Assert(ok, __FILE__, __LINE__, 'testing ok return BOOLEAN') ; printf("value returned is '%s'\n", ADR(a)) ; Assert(StrEqual('100.000000', a), __FILE__, __LINE__, 'testing return value of "100.000000"') ; diff --git a/gcc/testsuite/gm2/switches/uninit-variable-checking/cascade/fail/switches-uninit-variable-checking-cascade-fail.exp b/gcc/testsuite/gm2/switches/uninit-variable-checking/cascade/fail/switches-uninit-variable-checking-cascade-fail.exp index f5e0c078b7e..10108546a52 100644 --- a/gcc/testsuite/gm2/switches/uninit-variable-checking/cascade/fail/switches-uninit-variable-checking-cascade-fail.exp +++ b/gcc/testsuite/gm2/switches/uninit-variable-checking/cascade/fail/switches-uninit-variable-checking-cascade-fail.exp @@ -22,6 +22,9 @@ if $tracelevel then { strace $tracelevel } +set OLD_TORTURE_OPTIONS $TORTURE_OPTIONS +set TORTURE_OPTIONS "{ { -g } { -g -O2 } { -g -fdebug-builtins } }" + # load support procs load_lib gm2-torture.exp @@ -35,3 +38,5 @@ foreach testcase [lsort [glob -nocomplain $srcdir/$subdir/*.mod]] { gm2-torture-fail $testcase } + +set TORTURE_OPTIONS $OLD_TORTURE_OPTIONS diff --git a/gcc/testsuite/lib/gm2.exp b/gcc/testsuite/lib/gm2.exp index ab58a567e48..82915e35f5c 100644 --- a/gcc/testsuite/lib/gm2.exp +++ b/gcc/testsuite/lib/gm2.exp @@ -221,6 +221,9 @@ proc gm2_target_compile_default { source dest type options } { if [istarget *-*-solaris2*] { lappend options "ldflags=-lnsl -lsocket" } + if [istarget "powerpc-*-*"] { + lappend options "-mabi=ieeelongdouble" + } lappend options "timeout=[timeout_value]" lappend options "compiler=$GCC_UNDER_TEST" @@ -240,6 +243,7 @@ proc gm2_target_compile { source dest type options } { return [gm2_target_compile_${gm2_compile_method} $source $dest $type $options] } + # # gm2_link_lib - allows tests to specify link libraries. # This _must_ be called before gm2_init. @@ -281,6 +285,9 @@ proc gm2_link_flags { paths } { set shlib_ext [get_shlib_extension] verbose "shared lib extension: $shlib_ext" + if [istarget "powerpc-*-*"] { + lappend flags "-mabi=ieeelongdouble" + } if { $gccpath == "" } { global tool_root_dir diff --git a/libgm2/Makefile.am b/libgm2/Makefile.am index 95df3ed7a30..de060aaccba 100644 --- a/libgm2/Makefile.am +++ b/libgm2/Makefile.am @@ -35,6 +35,8 @@ AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER) TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd) +TARGET_LONGDOUBLE_ABI := $(if $(strip $(filter powerpc64le%,$(target))),-mabi=ieeelongdouble) + GCC_DIR = $(TOP_GCCDIR)/gcc GM2_SRC = $(GCC_DIR)/m2 @@ -60,6 +62,7 @@ AM_MAKEFLAGS = \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "CFLAGS_LONGDOUBLE=$(CFLAGS_LONGDOUBLE)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ @@ -91,6 +94,7 @@ AM_MAKEFLAGS = \ "WERROR=$(WERROR)" \ "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "LIBTOOL=$(GM2_BUILDDIR)/libtool" # Subdir rules rely on $(FLAGS_TO_PASS) diff --git a/libgm2/Makefile.in b/libgm2/Makefile.in index c0396791f48..0900c027faa 100644 --- a/libgm2/Makefile.in +++ b/libgm2/Makefile.in @@ -338,6 +338,7 @@ MAKEOVERRIDES = AM_CFLAGS = -I $(srcdir)/../libgcc -I $(MULTIBUILDTOP)../../gcc/include gcc_version := $(shell @get_gcc_base_ver@ $(top_srcdir)/../gcc/BASE-VER) TOP_GCCDIR := $(shell cd $(top_srcdir) && cd .. && pwd) +TARGET_LONGDOUBLE_ABI := $(if $(strip $(filter powerpc64le%,$(target))),-mabi=ieeelongdouble) GCC_DIR = $(TOP_GCCDIR)/gcc GM2_SRC = $(GCC_DIR)/m2 SUBDIRS = libm2min libm2log libm2cor libm2iso libm2pim @@ -358,6 +359,7 @@ AM_MAKEFLAGS = \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "CFLAGS_LONGDOUBLE=$(CFLAGS_LONGDOUBLE)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ @@ -389,6 +391,7 @@ AM_MAKEFLAGS = \ "WERROR=$(WERROR)" \ "TARGET_LIB_PATH=$(TARGET_LIB_PATH)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "LIBTOOL=$(GM2_BUILDDIR)/libtool" diff --git a/libgm2/libm2cor/Makefile.am b/libgm2/libm2cor/Makefile.am index ae96b4bfe78..4c36c549d3e 100644 --- a/libgm2/libm2cor/Makefile.am +++ b/libgm2/libm2cor/Makefile.am @@ -57,6 +57,7 @@ AM_MAKEFLAGS = \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "CFLAGS_LONGDOUBLE=$(CFLAGS_LONGDOUBLE)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ @@ -90,6 +91,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" # Subdir rules rely on $(FLAGS_TO_PASS) @@ -112,12 +114,16 @@ nodist_EXTRA_libm2cor_la_SOURCES = dummy.c ## forces automake to generate the L libm2cordir = libm2cor libm2cor_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2cor_la_SOURCES))) -libm2cor_la_CFLAGS = -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso +libm2cor_la_CFLAGS = \ + -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso \ + -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso \ + $(TARGET_LONGDOUBLE_ABI) libm2cor_la_M2FLAGS = \ -fm2-pathname=m2cor -I. -I$(GM2_SRC)/gm2-libs-coroutines \ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ - -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2cor + -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2cor \ + $(TARGET_LONGDOUBLE_ABI) if TARGET_DARWIN libm2cor_la_link_flags = -Wl,-undefined,dynamic_lookup else @@ -137,10 +143,13 @@ SYSTEM.def: Makefile "$(GM2_FOR_TARGET)" $@ .mod.lo: - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2cor_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(GM2_FOR_TARGET) \ + -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2cor_la_M2FLAGS) $< -o $@ .cc.lo: - $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2cor_la_CFLAGS) $< -o $@ + $(LIBTOOL) --tag=CXX --mode=compile $(CXX) \ + -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2cor_la_CFLAGS) $< -o $@ install-data-local: force mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2cor/Makefile.in b/libgm2/libm2cor/Makefile.in index 565d3f0dc3e..eaf980e3c48 100644 --- a/libgm2/libm2cor/Makefile.in +++ b/libgm2/libm2cor/Makefile.in @@ -411,6 +411,7 @@ AM_MAKEFLAGS = \ "CXXFLAGS=$(CXXFLAGS)" \ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \ "CFLAGS_FOR_TARGET=$(CFLAGS_FOR_TARGET)" \ + "CFLAGS_LONGDOUBLE=$(CFLAGS_LONGDOUBLE)" \ "INSTALL=$(INSTALL)" \ "INSTALL_DATA=$(INSTALL_DATA)" \ "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ @@ -444,6 +445,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" @@ -461,12 +463,17 @@ FLAGS_TO_PASS = $(AM_MAKEFLAGS) @BUILD_CORLIB_TRUE@nodist_EXTRA_libm2cor_la_SOURCES = dummy.c ## forces automake to generate the LINK definition @BUILD_CORLIB_TRUE@libm2cordir = libm2cor @BUILD_CORLIB_TRUE@libm2cor_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2cor_la_SOURCES))) -@BUILD_CORLIB_TRUE@libm2cor_la_CFLAGS = -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso +@BUILD_CORLIB_TRUE@libm2cor_la_CFLAGS = \ +@BUILD_CORLIB_TRUE@ -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso \ +@BUILD_CORLIB_TRUE@ -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso \ +@BUILD_CORLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) + @BUILD_CORLIB_TRUE@libm2cor_la_M2FLAGS = \ @BUILD_CORLIB_TRUE@ -fm2-pathname=m2cor -I. -I$(GM2_SRC)/gm2-libs-coroutines \ @BUILD_CORLIB_TRUE@ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ @BUILD_CORLIB_TRUE@ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ -@BUILD_CORLIB_TRUE@ -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2cor +@BUILD_CORLIB_TRUE@ -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2cor \ +@BUILD_CORLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) @BUILD_CORLIB_TRUE@@TARGET_DARWIN_FALSE@libm2cor_la_link_flags = @BUILD_CORLIB_TRUE@@TARGET_DARWIN_TRUE@libm2cor_la_link_flags = -Wl,-undefined,dynamic_lookup @@ -803,10 +810,13 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES @BUILD_CORLIB_TRUE@ "$(GM2_FOR_TARGET)" $@ @BUILD_CORLIB_TRUE@.mod.lo: -@BUILD_CORLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2cor_la_M2FLAGS) $< -o $@ +@BUILD_CORLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +@BUILD_CORLIB_TRUE@ --mode=compile $(GM2_FOR_TARGET) \ +@BUILD_CORLIB_TRUE@ -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2cor_la_M2FLAGS) $< -o $@ @BUILD_CORLIB_TRUE@.cc.lo: -@BUILD_CORLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2cor_la_CFLAGS) $< -o $@ +@BUILD_CORLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) \ +@BUILD_CORLIB_TRUE@ -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2cor_la_CFLAGS) $< -o $@ @BUILD_CORLIB_TRUE@install-data-local: force @BUILD_CORLIB_TRUE@ mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2iso/Makefile.am b/libgm2/libm2iso/Makefile.am index 90d344f0fa8..933f6949879 100644 --- a/libgm2/libm2iso/Makefile.am +++ b/libgm2/libm2iso/Makefile.am @@ -90,6 +90,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" # Subdir rules rely on $(FLAGS_TO_PASS) @@ -187,11 +188,16 @@ C_INCLUDES = -I.. -I$(toplevel_srcdir)/libiberty -I$(toplevel_srcdir)/include libm2isodir = libm2iso libm2iso_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2iso_la_SOURCES))) -libm2iso_la_CFLAGS = $(C_INCLUDES) -I. -I.. -I$(GM2_SRC)/gm2-libs-iso -I$(GM2_SRC)/gm2-libs -DBUILD_GM2_LIBS -I@srcdir@/../ -I../../../gcc -I$(GCC_DIR) -I$(GCC_DIR)/../include -I../../libgcc -I$(GCC_DIR)/../libgcc -I$(MULTIBUILDTOP)../../gcc/include +libm2iso_la_CFLAGS = \ + $(C_INCLUDES) -I. -I.. -I$(GM2_SRC)/gm2-libs-iso -I$(GM2_SRC)/gm2-libs \ + -DBUILD_GM2_LIBS -I@srcdir@/../ -I../../../gcc -I$(GCC_DIR) -I$(GCC_DIR)/../include \ + -I../../libgcc -I$(GCC_DIR)/../libgcc -I$(MULTIBUILDTOP)../../gcc/include \ + $(TARGET_LONGDOUBLE_ABI) libm2iso_la_M2FLAGS = \ -fm2-pathname=m2iso -I. -Ilibm2iso -I$(GM2_SRC)/gm2-libs-iso \ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ - -fiso -fextended-opaque -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2iso + -fiso -fextended-opaque -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2iso \ + $(TARGET_LONGDOUBLE_ABI) if TARGET_DARWIN libm2iso_la_link_flags = -Wl,-undefined,dynamic_lookup else @@ -213,13 +219,17 @@ SYSTEM.def: Makefile "$(GM2_FOR_TARGET)" $@ .mod.lo: - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2iso_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ + $(GM2_FOR_TARGET) -c \ + $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2iso_la_M2FLAGS) $< -o $@ .cc.lo: - $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ + $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) \ + $(CXXFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ .c.lo: - $(LIBTOOL) --tag=CC --mode=compile $(CC) -c -I$(srcdir) $(CFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ + $(LIBTOOL) --tag=CC --mode=compile $(CC) -c -I$(srcdir) \ + $(CFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ install-data-local: force mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2iso/Makefile.in b/libgm2/libm2iso/Makefile.in index 7f82b182ff9..b150c691946 100644 --- a/libgm2/libm2iso/Makefile.in +++ b/libgm2/libm2iso/Makefile.in @@ -469,6 +469,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" @@ -563,11 +564,17 @@ FLAGS_TO_PASS = $(AM_MAKEFLAGS) @BUILD_ISOLIB_TRUE@C_INCLUDES = -I.. -I$(toplevel_srcdir)/libiberty -I$(toplevel_srcdir)/include @BUILD_ISOLIB_TRUE@libm2isodir = libm2iso @BUILD_ISOLIB_TRUE@libm2iso_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2iso_la_SOURCES))) -@BUILD_ISOLIB_TRUE@libm2iso_la_CFLAGS = $(C_INCLUDES) -I. -I.. -I$(GM2_SRC)/gm2-libs-iso -I$(GM2_SRC)/gm2-libs -DBUILD_GM2_LIBS -I@srcdir@/../ -I../../../gcc -I$(GCC_DIR) -I$(GCC_DIR)/../include -I../../libgcc -I$(GCC_DIR)/../libgcc -I$(MULTIBUILDTOP)../../gcc/include +@BUILD_ISOLIB_TRUE@libm2iso_la_CFLAGS = \ +@BUILD_ISOLIB_TRUE@ $(C_INCLUDES) -I. -I.. -I$(GM2_SRC)/gm2-libs-iso -I$(GM2_SRC)/gm2-libs \ +@BUILD_ISOLIB_TRUE@ -DBUILD_GM2_LIBS -I@srcdir@/../ -I../../../gcc -I$(GCC_DIR) -I$(GCC_DIR)/../include \ +@BUILD_ISOLIB_TRUE@ -I../../libgcc -I$(GCC_DIR)/../libgcc -I$(MULTIBUILDTOP)../../gcc/include \ +@BUILD_ISOLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) + @BUILD_ISOLIB_TRUE@libm2iso_la_M2FLAGS = \ @BUILD_ISOLIB_TRUE@ -fm2-pathname=m2iso -I. -Ilibm2iso -I$(GM2_SRC)/gm2-libs-iso \ @BUILD_ISOLIB_TRUE@ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ -@BUILD_ISOLIB_TRUE@ -fiso -fextended-opaque -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2iso +@BUILD_ISOLIB_TRUE@ -fiso -fextended-opaque -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2iso \ +@BUILD_ISOLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) @BUILD_ISOLIB_TRUE@@TARGET_DARWIN_FALSE@libm2iso_la_link_flags = @BUILD_ISOLIB_TRUE@@TARGET_DARWIN_TRUE@libm2iso_la_link_flags = -Wl,-undefined,dynamic_lookup @@ -908,13 +915,17 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES @BUILD_ISOLIB_TRUE@ "$(GM2_FOR_TARGET)" $@ @BUILD_ISOLIB_TRUE@.mod.lo: -@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2iso_la_M2FLAGS) $< -o $@ +@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ +@BUILD_ISOLIB_TRUE@ $(GM2_FOR_TARGET) -c \ +@BUILD_ISOLIB_TRUE@ $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2iso_la_M2FLAGS) $< -o $@ @BUILD_ISOLIB_TRUE@.cc.lo: -@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ +@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) \ +@BUILD_ISOLIB_TRUE@ $(CXXFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ @BUILD_ISOLIB_TRUE@.c.lo: -@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) -c -I$(srcdir) $(CFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ +@BUILD_ISOLIB_TRUE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) -c -I$(srcdir) \ +@BUILD_ISOLIB_TRUE@ $(CFLAGS) $(LIBCFLAGS) $(libm2iso_la_CFLAGS) $< -o $@ @BUILD_ISOLIB_TRUE@install-data-local: force @BUILD_ISOLIB_TRUE@ mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2log/Makefile.am b/libgm2/libm2log/Makefile.am index 27f38406b07..a95e5c8f939 100644 --- a/libgm2/libm2log/Makefile.am +++ b/libgm2/libm2log/Makefile.am @@ -90,6 +90,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" # Subdir rules rely on $(FLAGS_TO_PASS) @@ -136,7 +137,8 @@ libm2log_la_M2FLAGS = \ -fm2-pathname=m2log -I$(GM2_SRC)/gm2-libs-log \ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ - -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2log + -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2log \ + $(TARGET_LONGDOUBLE_ABI) if TARGET_DARWIN libm2log_la_link_flags = -Wl,-undefined,dynamic_lookup else @@ -151,7 +153,9 @@ M2LIBDIR = /m2/m2log/ cd ../libm2pim ; $(MAKE) $(AM_MAKEFLAGS) SYSTEM.def .mod.lo: - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2log_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ + $(GM2_FOR_TARGET) -c \ + $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2log_la_M2FLAGS) $< -o $@ install-data-local: force mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2log/Makefile.in b/libgm2/libm2log/Makefile.in index 97d7bdb6396..4e5580d6393 100644 --- a/libgm2/libm2log/Makefile.in +++ b/libgm2/libm2log/Makefile.in @@ -433,6 +433,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" @@ -475,7 +476,8 @@ FLAGS_TO_PASS = $(AM_MAKEFLAGS) @BUILD_LOGLIB_TRUE@ -fm2-pathname=m2log -I$(GM2_SRC)/gm2-libs-log \ @BUILD_LOGLIB_TRUE@ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs \ @BUILD_LOGLIB_TRUE@ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ -@BUILD_LOGLIB_TRUE@ -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2log +@BUILD_LOGLIB_TRUE@ -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2log \ +@BUILD_LOGLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) @BUILD_LOGLIB_TRUE@@TARGET_DARWIN_FALSE@libm2log_la_link_flags = @BUILD_LOGLIB_TRUE@@TARGET_DARWIN_TRUE@libm2log_la_link_flags = -Wl,-undefined,dynamic_lookup @@ -784,7 +786,9 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES @BUILD_LOGLIB_TRUE@ cd ../libm2pim ; $(MAKE) $(AM_MAKEFLAGS) SYSTEM.def @BUILD_LOGLIB_TRUE@.mod.lo: -@BUILD_LOGLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2log_la_M2FLAGS) $< -o $@ +@BUILD_LOGLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ +@BUILD_LOGLIB_TRUE@ $(GM2_FOR_TARGET) -c \ +@BUILD_LOGLIB_TRUE@ $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2log_la_M2FLAGS) $< -o $@ @BUILD_LOGLIB_TRUE@install-data-local: force @BUILD_LOGLIB_TRUE@ mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2min/Makefile.am b/libgm2/libm2min/Makefile.am index 1ff160028f6..8caaf7aac88 100644 --- a/libgm2/libm2min/Makefile.am +++ b/libgm2/libm2min/Makefile.am @@ -89,6 +89,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" # Subdir rules rely on $(FLAGS_TO_PASS) @@ -103,11 +104,12 @@ libm2mindir = libm2min toolexeclib_LTLIBRARIES = libm2min.la libm2min_la_SOURCES = $(M2MODS) libc.c libm2min_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2min_la_SOURCES))) -libm2min_la_CFLAGS = -I. -I$(GM2_SRC)/gm2-libs-min -I$(GM2_SRC)/gm2-libs +libm2min_la_CFLAGS = -I. -I$(GM2_SRC)/gm2-libs-min -I$(GM2_SRC)/gm2-libs $(TARGET_LONGDOUBLE_ABI) libm2min_la_M2FLAGS = \ -fm2-pathname=m2min -I. -I$(GM2_SRC)/gm2-libs-min \ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs -fno-exceptions \ - -fno-m2-plugin -fno-scaffold-dynamic -fno-scaffold-main -fm2-prefix=m2min + -fno-m2-plugin -fno-scaffold-dynamic -fno-scaffold-main -fm2-prefix=m2min \ + $(TARGET_LONGDOUBLE_ABI) if TARGET_DARWIN libm2min_la_link_flags = -Wl,-undefined,dynamic_lookup else @@ -120,7 +122,9 @@ CLEANFILES = SYSTEM.def M2LIBDIR = /m2/m2min/ .mod.lo: - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2min_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ + $(GM2_FOR_TARGET) -c \ + $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2min_la_M2FLAGS) $< -o $@ libc.o: $(GM2_SRC)/gm2-libs-min/libc.c diff --git a/libgm2/libm2min/Makefile.in b/libgm2/libm2min/Makefile.in index 9ead8397fd0..790cfb3cb0f 100644 --- a/libgm2/libm2min/Makefile.in +++ b/libgm2/libm2min/Makefile.in @@ -422,6 +422,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" @@ -435,11 +436,12 @@ libm2mindir = libm2min toolexeclib_LTLIBRARIES = libm2min.la libm2min_la_SOURCES = $(M2MODS) libc.c libm2min_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2min_la_SOURCES))) -libm2min_la_CFLAGS = -I. -I$(GM2_SRC)/gm2-libs-min -I$(GM2_SRC)/gm2-libs +libm2min_la_CFLAGS = -I. -I$(GM2_SRC)/gm2-libs-min -I$(GM2_SRC)/gm2-libs $(TARGET_LONGDOUBLE_ABI) libm2min_la_M2FLAGS = \ -fm2-pathname=m2min -I. -I$(GM2_SRC)/gm2-libs-min \ -fm2-pathname=m2pim -I$(GM2_SRC)/gm2-libs -fno-exceptions \ - -fno-m2-plugin -fno-scaffold-dynamic -fno-scaffold-main -fm2-prefix=m2min + -fno-m2-plugin -fno-scaffold-dynamic -fno-scaffold-main -fm2-prefix=m2min \ + $(TARGET_LONGDOUBLE_ABI) @TARGET_DARWIN_FALSE@libm2min_la_link_flags = @TARGET_DARWIN_TRUE@libm2min_la_link_flags = -Wl,-undefined,dynamic_lookup @@ -746,7 +748,9 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES .mod.lo: - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2min_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile \ + $(GM2_FOR_TARGET) -c \ + $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2min_la_M2FLAGS) $< -o $@ libc.o: $(GM2_SRC)/gm2-libs-min/libc.c diff --git a/libgm2/libm2pim/Makefile.am b/libgm2/libm2pim/Makefile.am index ac172b93337..f940dd29aa6 100644 --- a/libgm2/libm2pim/Makefile.am +++ b/libgm2/libm2pim/Makefile.am @@ -88,6 +88,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" # Subdir rules rely on $(FLAGS_TO_PASS) @@ -165,11 +166,15 @@ libm2pim_la_SOURCES = $(M2MODS) \ libm2pimdir = libm2pim libm2pim_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2pim_la_SOURCES))) -libm2pim_la_CFLAGS = -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso +libm2pim_la_CFLAGS = \ + -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso \ + -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso \ + $(TARGET_LONGDOUBLE_ABI) libm2pim_la_M2FLAGS = \ -fm2-pathname=m2pim -I. -I$(GM2_SRC)/gm2-libs \ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ - -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2pim + -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2pim \ + $(TARGET_LONGDOUBLE_ABI) if TARGET_DARWIN libm2pim_la_link_flags = -Wl,-undefined,dynamic_lookup else @@ -189,10 +194,13 @@ SYSTEM.def: Makefile "$(GM2_FOR_TARGET)" $@ .mod.lo: SYSTEM.def - $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2pim_la_M2FLAGS) $< -o $@ + $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(GM2_FOR_TARGET) \ + -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2pim_la_M2FLAGS) $< -o $@ .cc.lo: - $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2pim_la_CFLAGS) $< -o $@ + $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) \ + $(CXXFLAGS) $(LIBCFLAGS) $(libm2pim_la_CFLAGS) $< -o $@ install-data-local: force mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR) diff --git a/libgm2/libm2pim/Makefile.in b/libgm2/libm2pim/Makefile.in index 3bd2a9f9505..5fc026ebcb2 100644 --- a/libgm2/libm2pim/Makefile.in +++ b/libgm2/libm2pim/Makefile.in @@ -457,6 +457,7 @@ AM_MAKEFLAGS = \ "NM_FOR_TARGET=$(NM_FOR_TARGET)" \ "DESTDIR=$(DESTDIR)" \ "WERROR=$(WERROR)" \ + "TARGET_LONGDOUBLE_ABI=$(TARGET_LONGDOUBLE_ABI)" \ "TARGET_LIB_PATH_libgm2=$(TARGET_LIB_PATH_libgm2)" @@ -532,11 +533,16 @@ FLAGS_TO_PASS = $(AM_MAKEFLAGS) @BUILD_PIMLIB_TRUE@libm2pimdir = libm2pim @BUILD_PIMLIB_TRUE@libm2pim_la_DEPENDENCIES = SYSTEM.def $(addsuffix .lo, $(basename $(libm2pim_la_SOURCES))) -@BUILD_PIMLIB_TRUE@libm2pim_la_CFLAGS = -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso +@BUILD_PIMLIB_TRUE@libm2pim_la_CFLAGS = \ +@BUILD_PIMLIB_TRUE@ -I. -I.. -I$(GM2_SRC)/gm2-libs -I$(GM2_SRC)/gm2-libs-iso \ +@BUILD_PIMLIB_TRUE@ -DBUILD_GM2_LIBS -I@srcdir@/../ -I@srcdir@/../libm2iso \ +@BUILD_PIMLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) + @BUILD_PIMLIB_TRUE@libm2pim_la_M2FLAGS = \ @BUILD_PIMLIB_TRUE@ -fm2-pathname=m2pim -I. -I$(GM2_SRC)/gm2-libs \ @BUILD_PIMLIB_TRUE@ -fm2-pathname=m2iso -I$(GM2_SRC)/gm2-libs-iso \ -@BUILD_PIMLIB_TRUE@ -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2pim +@BUILD_PIMLIB_TRUE@ -fm2-g -g -Wcase-enum -Wreturn-type -fcase -fm2-prefix=m2pim \ +@BUILD_PIMLIB_TRUE@ $(TARGET_LONGDOUBLE_ABI) @BUILD_PIMLIB_TRUE@@TARGET_DARWIN_FALSE@libm2pim_la_link_flags = @BUILD_PIMLIB_TRUE@@TARGET_DARWIN_TRUE@libm2pim_la_link_flags = -Wl,-undefined,dynamic_lookup @@ -882,10 +888,13 @@ uninstall-am: uninstall-toolexeclibLTLIBRARIES @BUILD_PIMLIB_TRUE@ "$(GM2_FOR_TARGET)" $@ @BUILD_PIMLIB_TRUE@.mod.lo: SYSTEM.def -@BUILD_PIMLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(GM2_FOR_TARGET) -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2pim_la_M2FLAGS) $< -o $@ +@BUILD_PIMLIB_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ +@BUILD_PIMLIB_TRUE@ --mode=compile $(GM2_FOR_TARGET) \ +@BUILD_PIMLIB_TRUE@ -c $(CFLAGS_FOR_TARGET) $(LIBCFLAGS) $(libm2pim_la_M2FLAGS) $< -o $@ @BUILD_PIMLIB_TRUE@.cc.lo: -@BUILD_PIMLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) $(CXXFLAGS) $(LIBCFLAGS) $(libm2pim_la_CFLAGS) $< -o $@ +@BUILD_PIMLIB_TRUE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) -c -I$(srcdir) \ +@BUILD_PIMLIB_TRUE@ $(CXXFLAGS) $(LIBCFLAGS) $(libm2pim_la_CFLAGS) $< -o $@ @BUILD_PIMLIB_TRUE@install-data-local: force @BUILD_PIMLIB_TRUE@ mkdir -p $(DESTDIR)$(inst_libdir)/$(M2LIBDIR)