MSP430: Add -mtiny-printf option
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Mon, 4 Nov 2019 11:23:46 +0000 (11:23 +0000)
committerJozef Lawrynowicz <jozefl@gcc.gnu.org>
Mon, 4 Nov 2019 11:23:46 +0000 (11:23 +0000)
2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>

gcc/
* config.in: Regenerate.
* config/msp430/msp430.c (msp430_option_override): Emit an error if
-mtiny-printf is used without GCC being configured with
--enable-newlib-nano-formatted-io.
* config/msp430/msp430.h (LINK_SPEC): Pass
"--wrap puts --wrap printf" when -mtiny-printf is used.
* config/msp430/msp430.opt: Document -mtiny-printf.
* configure: Regenerate.
* configure.ac: Enable --enable-newlib-nano-formatted-io flag.
Define HAVE_NEWLIB_NANO_FORMATTED_IO if
--enable-newlib-nano-formatted-io is passed.
* doc/invoke.texi: Document -mtiny-printf.

gcc/testsuite/
* gcc.target/msp430/tiny-printf.c: New test.

From-SVN: r277774

gcc/ChangeLog
gcc/config.in
gcc/config/msp430/msp430.c
gcc/config/msp430/msp430.h
gcc/config/msp430/msp430.opt
gcc/configure
gcc/configure.ac
gcc/doc/invoke.texi
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/msp430/tiny-printf.c [new file with mode: 0644]

index 6f0bd8381a07ad73ac2a83844b975f64ae07335a..193e8e40d1976d82b4df0335a75015f5b4f7702c 100644 (file)
@@ -1,3 +1,18 @@
+2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * config.in: Regenerate.
+       * config/msp430/msp430.c (msp430_option_override): Emit an error if
+       -mtiny-printf is used without GCC being configured with
+       --enable-newlib-nano-formatted-io.
+       * config/msp430/msp430.h (LINK_SPEC): Pass 
+       "--wrap puts --wrap printf" when -mtiny-printf is used.
+       * config/msp430/msp430.opt: Document -mtiny-printf.
+       * configure: Regenerate.
+       * configure.ac: Enable --enable-newlib-nano-formatted-io flag.
+       Define HAVE_NEWLIB_NANO_FORMATTED_IO if
+       --enable-newlib-nano-formatted-io is passed.
+       * doc/invoke.texi: Document -mtiny-printf.
+
 2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * configure: Regenerate.
index c0baa761fcd2966fe394ef47033d6bacab4d2670..e2afcbc894047c3f42dd89d17ed68db383a52ac1 100644 (file)
 #endif
 
 
+/* Define if GCC has been configured with --enable-newlib-nano-formatted-io.
+   */
+#ifndef USED_FOR_TARGET
+#undef HAVE_NEWLIB_NANO_FORMATTED_IO
+#endif
+
+
 /* Define to 1 if you have the `nl_langinfo' function. */
 #ifndef USED_FOR_TARGET
 #undef HAVE_NL_LANGINFO
index b5d3edb42d0bc24e814711a497d0f52104857ec2..4ebdcf51e8b14ea483c457758563bf126bb13ac8 100644 (file)
@@ -287,6 +287,12 @@ msp430_option_override (void)
      possible to build newlib with -Os enabled.  Until now...  */
   if (TARGET_OPT_SPACE && optimize < 3)
     optimize_size = 1;
+
+#ifndef HAVE_NEWLIB_NANO_FORMATTED_IO
+  if (TARGET_TINY_PRINTF)
+    error ("GCC must be configured with %<--enable-newlib-nano-formatted-io%> "
+          "to use %<-mtiny-printf%>");
+#endif
 }
 
 #undef  TARGET_SCALAR_MODE_SUPPORTED_P
index 2e70e0d6ab6cf7880dc8d3faa6f6c2d6b17d1a52..0ea6b0a093e64951776d9c998a0d609a18fc578d 100644 (file)
@@ -75,7 +75,8 @@ extern bool msp430x;
     "msp430_propagate_region_opt(%* %{muse-lower-region-prefix})} " \
   "%{mdata-region=*:--data-region=%:" \
     "msp430_propagate_region_opt(%* %{muse-lower-region-prefix})} " \
-  "%:msp430_get_linker_devices_include_path()"
+  "%:msp430_get_linker_devices_include_path() " \
+  "%{mtiny-printf:--wrap puts --wrap printf} "
 
 #define DRIVER_SELF_SPECS \
   " %{!mlarge:%{mcode-region=*:%{mdata-region=*:%e-mcode-region and "  \
index 2db2906ca11052fbe27cc6870809bc7c0ea6618d..b451174c3d10832e675c930d0dc18e0707bcb766 100644 (file)
@@ -2,6 +2,10 @@ msim
 Target
 Use simulator runtime.
 
+mtiny-printf
+Target Report Mask(TINY_PRINTF)
+Use a lightweight configuration of printf and puts to reduce code size. For single-threaded applications, not requiring reentrant I/O only. Requires Newlib Nano IO.
+
 masm-hex
 Target Mask(ASM_HEX)
 Force assembly output to always use hex constants.
index fd33bc661a821ec1d3c30f79e869a8aaccd1281f..9fe04293f726043f81ce8afe1b625faf63d2e9a4 100755 (executable)
@@ -990,6 +990,7 @@ with_plugin_ld
 enable_gnu_indirect_function
 enable_initfini_array
 enable_comdat
+enable_newlib_nano_formatted_io
 enable_standard_branch_protection
 enable_fix_cortex_a53_835769
 enable_fix_cortex_a53_843419
@@ -1718,6 +1719,8 @@ Optional Features:
                           glibc systems
   --enable-initfini-array      use .init_array/.fini_array sections
   --enable-comdat         enable COMDAT group support
+  --enable-newlib-nano-formatted-io
+                          Use nano version formatted IO
 
   --enable-standard-branch-protection
                           enable Branch Target Identification Mechanism and
@@ -18923,7 +18926,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 18926 "configure"
+#line 18929 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -19029,7 +19032,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 19032 "configure"
+#line 19035 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -24549,6 +24552,19 @@ $as_echo "#define HAVE_GAS_DISCRIMINATOR 1" >>confdefs.h
 fi
 
 
+# Catch the newlib flag of the same name so we can gate GCC features on it.
+# Check whether --enable-newlib-nano-formatted-io was given.
+if test "${enable_newlib_nano_formatted_io+set}" = set; then :
+  enableval=$enable_newlib_nano_formatted_io; case "${enableval}" in
+  yes|no)
+    ;;
+  *)
+    as_fn_error $? "unknown newlib-nano-formatted-io setting $enableval" "$LINENO" 5
+    ;;
+esac
+fi
+
+
 # Thread-local storage - the check is heavily parameterized.
 conftest_s=
 tls_first_major=
@@ -27939,6 +27955,11 @@ $as_echo "#define HAVE_AS_MSPABI_ATTRIBUTE 1" >>confdefs.h
 
 fi
 
+    if test x$enable_newlib_nano_formatted_io = xyes; then
+
+$as_echo "#define HAVE_NEWLIB_NANO_FORMATTED_IO 1" >>confdefs.h
+
+      fi
     ;;
     riscv*-*-*)
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for .attribute support" >&5
index bc15683fd02bed41eabc0e8fd80be5c603d7b9fc..0fe4e5472728e90eb4993da89e5b33754036870e 100644 (file)
@@ -3359,6 +3359,18 @@ gcc_GAS_CHECK_FEATURE([line table discriminator support],
 [AC_DEFINE(HAVE_GAS_DISCRIMINATOR, 1,
   [Define if your assembler supports the .loc discriminator sub-directive.])])
 
+# Catch the newlib flag of the same name so we can gate GCC features on it.
+AC_ARG_ENABLE(newlib-nano-formatted-io,
+[AS_HELP_STRING([--enable-newlib-nano-formatted-io], [Use nano version
+ formatted IO])],
+[case "${enableval}" in
+  yes|no)
+    ;;
+  *)
+    AC_MSG_ERROR([unknown newlib-nano-formatted-io setting $enableval])
+    ;;
+esac], [])
+
 # Thread-local storage - the check is heavily parameterized.
 conftest_s=
 tls_first_major=
@@ -4999,6 +5011,10 @@ pointers into PC-relative form.])
       [.mspabi_attribute 4,1],,
       [AC_DEFINE(HAVE_AS_MSPABI_ATTRIBUTE, 1,
          [Define if your assembler supports .mspabi_attribute.])])
+    if test x$enable_newlib_nano_formatted_io = xyes; then
+      AC_DEFINE(HAVE_NEWLIB_NANO_FORMATTED_IO, 1, [Define if GCC has been
+configured with --enable-newlib-nano-formatted-io.])
+      fi
     ;;
     riscv*-*-*)
     gcc_GAS_CHECK_FEATURE([.attribute support],
index 122a23eef115b79380ddae9161b50a48ad760b68..bf3ea3f6c046f652f81dd104ef0a4d03e26fff9a 100644 (file)
@@ -1010,7 +1010,7 @@ Objective-C and Objective-C++ Dialects}.
 -mwarn-mcu @gol
 -mcode-region=  -mdata-region= @gol
 -msilicon-errata=  -msilicon-errata-warn= @gol
--mhwmult=  -minrt}
+-mhwmult=  -minrt  -mtiny-printf}
 
 @emph{NDS32 Options}
 @gccoptlist{-mbig-endian  -mlittle-endian @gol
@@ -23323,6 +23323,19 @@ initializers or constructors.  This is intended for memory-constrained
 devices.  The compiler includes special symbols in some objects
 that tell the linker and runtime which code fragments are required.
 
+@item -mtiny-printf
+@opindex mtiny-printf
+Enable reduced code size @code{printf} and @code{puts} library functions.
+The @samp{tiny} implementations of these functions are not reentrant, so
+must be used with caution in multi-threaded applications.
+
+Support for streams has been removed and the string to be printed will
+always be sent to stdout via the @code{write} syscall.  The string is not
+buffered before it is sent to write.
+
+This option requires Newlib Nano IO, so GCC must be configured with
+@samp{--enable-newlib-nano-formatted-io}.
+
 @item -mcode-region=
 @itemx -mdata-region=
 @opindex mcode-region
index 45ec73ab7d2cf0547637590bccfe3ee26f8b7901..7f7acb3f887a8f7b805e69ae618fc98f99a29924 100644 (file)
@@ -1,3 +1,7 @@
+2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
+
+       * gcc.target/msp430/tiny-printf.c: New test.
+
 2019-11-04  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        * gcc.target/msp430/devices/csv-using-env-var.c: New test.
diff --git a/gcc/testsuite/gcc.target/msp430/tiny-printf.c b/gcc/testsuite/gcc.target/msp430/tiny-printf.c
new file mode 100644 (file)
index 0000000..55ef5f7
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+/* { dg-options "-mtiny-printf" } */
+/* { dg-error "GCC must be configured with --enable-newlib-nano-formatted-io to use -mtiny-printf" "" { target { ! newlib_nano_io } } 0 } */