Skip to content

Commit

Permalink
[Silabs] Fix compilation issues with gcc 12.2 (#26090)
Browse files Browse the repository at this point in the history
* disable -Werror=array-parameter= for gsdk sources build

* Fix compilation issues with gcc arm 12.2

* Restyled by whitespace

* Comment the cflag -Wno-error=array-parameter until gcc 12.2 is used

---------

Co-authored-by: Restyled.io <[email protected]>
  • Loading branch information
jmartinez-silabs and restyled-commits authored Apr 13, 2023
1 parent e56fe6d commit 5568b70
Show file tree
Hide file tree
Showing 4 changed files with 225 additions and 1 deletion.
5 changes: 5 additions & 0 deletions examples/platform/silabs/efr32/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,10 @@ config("efr32-common-config") {
if (enable_heap_monitoring) {
defines += [ "HEAP_MONITORING" ]
}

# Do not warn for LOAD segment with RWX permissions
# Uncomment this cflag when pigweed update is done and GCC 12.2 is used.
#ldflags = [ "-Wl,--no-warn-rwx-segment" ]
}

config("silabs-wifi-config") {
Expand Down Expand Up @@ -279,6 +283,7 @@ source_set("efr32-common") {

sources = [
"${silabs_common_plat_dir}/heap_4_silabs.c",
"${silabs_common_plat_dir}/syscalls_stubs.cpp",
"efr32_utils.cpp",
"init_efrPlatform.cpp",
"matter_config.cpp",
Expand Down
215 changes: 215 additions & 0 deletions examples/platform/silabs/syscalls_stubs.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
/*
*
* Copyright (c) 2023 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/*
This file is only used to implement weak syscall stubs
that gcc-arm-none-eabi 12.2.1 expect to link when using Libc
(newlib/libc_nano)
*/

#include <reent.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>

#ifdef __cplusplus
extern "C" {
#endif

#if SILABS_LOG_OUT_UART
#include "uart.h"
#endif

int _close(int file);
int _fstat(int file, struct stat * st);
int _isatty(int file);
int _lseek(int file, int ptr, int dir);
int _read(int file, char * ptr, int len);
int _write(int file, const char * ptr, int len);

/**************************************************************************
* @brief
* Close a file.
*
* @param[in] file
* File you want to close.
*
* @return
* Returns 0 when the file is closed.
**************************************************************************/
int __attribute__((weak)) _close(int file)
{
(void) file;
return 0;
}

/**************************************************************************
* @brief Exit the program.
* @param[in] status The value to return to the parent process as the
* exit status (not used).
**************************************************************************/
void __attribute__((weak)) _exit(int status)
{
(void) status;
while (1)
{
} /* Hang here forever... */
}

/*************************************************************************
* @brief
* Status of an open file.
*
* @param[in] file
* Check status for this file.
*
* @param[in] st
* Status information.
*
* @return
* Returns 0 when st_mode is set to character special.
************************************************************************/
int __attribute__((weak)) _fstat(int file, struct stat * st)
{
(void) file;
(void) st;
return 0;
}

/**************************************************************************
* @brief Get process ID.
*************************************************************************/
int __attribute__((weak)) _getpid(void)
{
return 1;
}

/**************************************************************************
* @brief
* Query whether output stream is a terminal.
*
* @param[in] file
* Descriptor for the file.
*
* @return
* Returns 1 when query is done.
**************************************************************************/
int __attribute__((weak)) _isatty(int file)
{
(void) file;
return 1;
}

/**************************************************************************
* @brief Send signal to process.
* @param[in] pid Process id (not used).
* @param[in] sig Signal to send (not used).
*************************************************************************/
int __attribute__((weak)) _kill(int pid, int sig)
{
(void) pid;
(void) sig;
return -1;
}

/**************************************************************************
* @brief
* Set position in a file.
*
* @param[in] file
* Descriptor for the file.
*
* @param[in] ptr
* Poiter to the argument offset.
*
* @param[in] dir
* Directory whence.
*
* @return
* Returns 0 when position is set.
*************************************************************************/
int __attribute__((weak)) _lseek(int file, int ptr, int dir)
{
(void) file;
(void) ptr;
(void) dir;
return 0;
}

/**************************************************************************
* @brief
* Read from a file.
*
* @param[in] file
* Descriptor for the file you want to read from.
*
* @param[in] ptr
* Pointer to the chacaters that are beeing read.
*
* @param[in] len
* Number of characters to be read.
*
* @return
* Number of characters that have been read.
*************************************************************************/
int __attribute__((weak)) _read(int file, char * ptr, int len)
{
(void) file;
#if SILABS_LOG_OUT_UART
return = uartConsoleRead(ptr, len);
#else
(void) ptr;
(void) len;
#endif
return 0;
}

/**************************************************************************
* @brief
* Write to a file.
*
* @param[in] file
* Descriptor for the file you want to write to.
*
* @param[in] ptr
* Pointer to the text you want to write
*
* @param[in] len
* Number of characters to be written.
*
* @return
* Number of characters that have been written.
**************************************************************************/
int __attribute__((weak)) _write(int file, const char * ptr, int len)
{
(void) file;
#if SILABS_LOG_OUT_UART
uartConsoleWrite(ptr, len);
#else
(void) ptr;
#endif

return len;
}

#ifdef __cplusplus
}
#endif
2 changes: 1 addition & 1 deletion src/platform/silabs/KeyValueStoreManagerImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ uint16_t KeyValueStoreManagerImpl::hashKvsKeyString(const char * key) const
uint8_t hash256[Crypto::kSHA256_Hash_Length] = { 0 };
Crypto::Hash_SHA256(reinterpret_cast<const uint8_t *>(key), strlen(key), hash256);

uint16_t hash16, i = 0;
uint16_t hash16 = 0, i = 0;

while (!hash16 && (i < (Crypto::kSHA256_Hash_Length - 1)))
{
Expand Down
4 changes: 4 additions & 0 deletions third_party/silabs/efr32_sdk.gni
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,10 @@ template("efr32_sdk") {
cflags += [
"-Wno-maybe-uninitialized",
"-Wno-shadow",

# see https://github.com/project-chip/connectedhomeip/issues/26058
# Uncomment this cflag when pigweed update is done and GCC 12.2 is used.
# "-Wno-error=array-parameter",
]

if (silabs_family == "efr32mg24" || silabs_family == "mgm24") {
Expand Down

0 comments on commit 5568b70

Please sign in to comment.