MLECO-3748: Documentation updates

Added documentation around known issue with Arm GNU toolchain
version 12.2.1. Minor change for MLECO-3731 also included.

Link-time warnings for Arm GNU toolchain 11.3.1 also fixed.

Change-Id: Ia8215e9f71327eeb59868aea91729d7b19dd6d34
Signed-off-by: Kshitij Sisodia <kshitij.sisodia@arm.com>
diff --git a/docs/sections/building.md b/docs/sections/building.md
index 1489343..a7a894a 100644
--- a/docs/sections/building.md
+++ b/docs/sections/building.md
@@ -35,7 +35,12 @@
 Before proceeding, it is *essential* to ensure that the following prerequisites have been fulfilled:
 
 - GNU Arm embedded toolchain 10.2.1 (or higher) or the Arm Compiler version 6.16, or higher, is installed and available
-  on the path. Test the compiler by running:
+  on the path.
+
+> **Note**: There is a known issue with Arm GNU Embedded Toolchain version 12.2.Rel1. See
+> [Internal Compiler Error](./troubleshooting.md#internal-compiler-error) for details.
+
+  Test the compiler by running:
 
     ```commandline
     armclang -v
diff --git a/docs/sections/troubleshooting.md b/docs/sections/troubleshooting.md
index d5224c4..0b6f4f9 100644
--- a/docs/sections/troubleshooting.md
+++ b/docs/sections/troubleshooting.md
@@ -9,6 +9,7 @@
   - [No matching distribution found for ethos-u-vela==3.5.0](./troubleshooting.md#no-matching-distribution-found-for-ethos_u_vela)
     - [How to update Python3 package to 3.7 version](./troubleshooting.md#how-to-update-python3-package-to-newer-version)
   - [Error trying to build on Arm Virtual Hardware](./troubleshooting.md#error-trying-to-build-on-arm-virtual-hardware)
+  - [Internal Compiler Error](./troubleshooting.md#internal-compiler-error)
 
 ## Inference results are incorrect for my custom files
 
@@ -247,4 +248,29 @@
 ```commandline
 python3 ./build_default.py
 ```
-and the error should be fixed.
\ No newline at end of file
+and the error should be fixed.
+
+## Internal Compiler Error
+
+There is a known issue with the Arm GNU toolchain version 12.2 (release December 22, 2022).
+Compiler from this toolchain throws up this error:
+
+```
+during RTL pass: combine
+/home/user/ml-embedded-evaluation-kit/dependencies/cmsis-nn/Source/SoftmaxFunctions/arm_softmax_s8.c: In function 'arm_exp_on_negative_values_mve_32x4':
+/home/user/ml-embedded-evaluation-kit/dependencies/cmsis-nn/Source/SoftmaxFunctions/arm_softmax_s8.c:74:1: internal compiler error: in trunc_int_for_mode, at explow.cc:59
+   74 | }
+      | ^
+0x7f0343d9b082 __libc_start_main
+	../csu/libc-start.c:308
+Please submit a full bug report, with preprocessed source (by using -freport-bug).
+Please include the complete backtrace with any bug report.
+See <https://bugs.linaro.org/> for instructions.
+```
+
+This is expected to be fixed in the next release of the toolchain. We recommend using the previous version 11.3.Rel1
+(from August 2022).
+
+See
+- [GCC patches: PR107987](https://gcc.gnu.org/pipermail/gcc-patches/2022-December/607963.html)
+- [CMSIS-NN issue 13](https://github.com/ARM-software/CMSIS-NN/issues/13)
diff --git a/source/hal/source/components/stdout/source/retarget.c b/source/hal/source/components/stdout/source/retarget.c
index 47d5189..41c070a 100644
--- a/source/hal/source/components/stdout/source/retarget.c
+++ b/source/hal/source/components/stdout/source/retarget.c
@@ -1,6 +1,6 @@
 /*
- * SPDX-FileCopyrightText: Copyright 2022 Arm Limited and/or its affiliates <open-source-office@arm.com>
- * SPDX-License-Identifier: Apache-2.0
+ * SPDX-FileCopyrightText: Copyright 2022 Arm Limited and/or its affiliates
+ * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -287,3 +287,51 @@
 #endif /* #ifndef ferror */
 
 #endif /* !defined(USE_SEMIHOSTING) */
+
+/* If using GNU compiler */
+#if defined(__GNUC__)
+
+/* If Arm GNU compiler version > 11.3.0 */
+#if __GNUC__ > 11 || \
+    (__GNUC__ == 11 && (__GNUC_MINOR__ > 3 || (__GNUC_MINOR__ == 3 && __GNUC_PATCHLEVEL__ > 0)))
+struct stat;
+int _fstat_r(struct _reent* r, int fdes, struct stat* s)
+{
+    (void)(r);
+    (void)(fdes);
+    (void)(s);
+    return -1;
+}
+
+int _getpid_r(struct _reent* r)
+{
+    (void)(r);
+    return -1;
+}
+
+int _isatty_r(struct _reent* r, int desc)
+{
+    (void)(r);
+    (void)(desc);
+    return -1;
+}
+
+int _kill_r(struct _reent* r, int pid, int signal)
+{
+    (void)(r);
+    (void)(pid);
+    (void)(signal);
+    return -1;
+}
+
+_off_t _lseek_r(struct _reent* r, int fdes, _off_t offset, int w)
+{
+    (void)(r);
+    (void)(fdes);
+    (void)(offset);
+    (void)(w);
+    return -1;
+}
+
+#endif /* GNU  toolchain version > 11.3.0 */
+#endif /* If using GNU toolchain */
diff --git a/source/log/include/log_macros.h b/source/log/include/log_macros.h
index faf8435..6c115ab 100644
--- a/source/log/include/log_macros.h
+++ b/source/log/include/log_macros.h
@@ -1,6 +1,6 @@
 /*
- * SPDX-FileCopyrightText: Copyright 2021 Arm Limited and/or its affiliates <open-source-office@arm.com>
- * SPDX-License-Identifier: Apache-2.0
+ * SPDX-FileCopyrightText: Copyright 2021 Arm Limited and/or its affiliates
+ * <open-source-office@arm.com> SPDX-License-Identifier: Apache-2.0
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,50 +21,62 @@
 extern "C" {
 #endif
 
-#include <stdio.h>
 #include <inttypes.h>
+#include <stdio.h>
 
-#define LOG_LEVEL_TRACE       0
-#define LOG_LEVEL_DEBUG       1
-#define LOG_LEVEL_INFO        2
-#define LOG_LEVEL_WARN        3
-#define LOG_LEVEL_ERROR       4
+#define LOG_LEVEL_TRACE 0
+#define LOG_LEVEL_DEBUG 1
+#define LOG_LEVEL_INFO  2
+#define LOG_LEVEL_WARN  3
+#define LOG_LEVEL_ERROR 4
 
 #ifndef LOG_LEVEL
-#define LOG_LEVEL             LOG_LEVEL_INFO
+#define LOG_LEVEL LOG_LEVEL_INFO
 #endif /*LOG_LEVEL*/
 
-#define UNUSED(x)       ((void)(x))
+#if !defined(UNUSED)
+#define UNUSED(x) ((void)(x))
+#endif /* #if !defined(UNUSED) */
 
 #if (LOG_LEVEL == LOG_LEVEL_TRACE)
-    #define trace(...)        printf("TRACE - "); printf(__VA_ARGS__)
+#define trace(...)      \
+    printf("TRACE - "); \
+    printf(__VA_ARGS__)
 #else
-    #define trace(...)
-#endif  /* LOG_LEVEL == LOG_LEVEL_TRACE */
+#define trace(...)
+#endif /* LOG_LEVEL == LOG_LEVEL_TRACE */
 
 #if (LOG_LEVEL <= LOG_LEVEL_DEBUG)
-    #define debug(...)        printf("DEBUG - "); printf(__VA_ARGS__)
+#define debug(...)      \
+    printf("DEBUG - "); \
+    printf(__VA_ARGS__)
 #else
-    #define debug(...)
-#endif  /* LOG_LEVEL > LOG_LEVEL_TRACE */
+#define debug(...)
+#endif /* LOG_LEVEL > LOG_LEVEL_TRACE */
 
 #if (LOG_LEVEL <= LOG_LEVEL_INFO)
-    #define info(...)         printf("INFO - "); printf(__VA_ARGS__)
+#define info(...)      \
+    printf("INFO - "); \
+    printf(__VA_ARGS__)
 #else
-    #define info(...)
-#endif  /* LOG_LEVEL > LOG_LEVEL_DEBUG */
+#define info(...)
+#endif /* LOG_LEVEL > LOG_LEVEL_DEBUG */
 
 #if (LOG_LEVEL <= LOG_LEVEL_WARN)
-    #define warn(...)         printf("WARN - "); printf(__VA_ARGS__)
+#define warn(...)      \
+    printf("WARN - "); \
+    printf(__VA_ARGS__)
 #else
-    #define warn(...)
-#endif  /* LOG_LEVEL > LOG_LEVEL_INFO */
+#define warn(...)
+#endif /* LOG_LEVEL > LOG_LEVEL_INFO */
 
 #if (LOG_LEVEL <= LOG_LEVEL_ERROR)
-    #define printf_err(...)   printf("ERROR - "); printf(__VA_ARGS__)
+#define printf_err(...) \
+    printf("ERROR - "); \
+    printf(__VA_ARGS__)
 #else
-    #define printf_err(...)
-#endif  /* LOG_LEVEL > LOG_LEVEL_INFO */
+#define printf_err(...)
+#endif /* LOG_LEVEL > LOG_LEVEL_INFO */
 
 #ifdef __cplusplus
 }