From 4ae7f4c1f60a7e4109077b7982e5f764b44c80a4 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Tue, 3 May 2022 17:49:10 +0800 Subject: [PATCH] libs: Move libxx_impure.cxx from libs/libxx/ to libs/libc/misc/ to fix the gcov link error: arm-none-eabi-ld: /home/xiaoxiang/vela/prebuilts/gcc/linux/arm/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m/nofp/libgcov.a(_gcov.o): in function `gcov_error_exit': libgcov-driver.c:(.text+0x7c): undefined reference to `_impure_ptr' arm-none-eabi-ld: /home/xiaoxiang/vela/prebuilts/gcc/linux/arm/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m/nofp/libgcov.a(_gcov.o): in function `get_gcov_error_file': libgcov-driver.c:(.text+0x1e0): undefined reference to `_impure_ptr' arm-none-eabi-ld: /home/xiaoxiang/vela/prebuilts/gcc/linux/arm/bin/../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m/nofp/libgcov.a(_gcov.o): in function `gcov_exit_open_gcda_file.isra.0': libgcov-driver.c:(.text+0x660): undefined reference to `_impure_ptr' Signed-off-by: Xiang Xiao --- libs/libc/misc/Make.defs | 2 +- libs/libc/misc/lib_impure.c | 71 +++++++++++++++++++++++++++++++++++++ libs/libxx/Makefile | 4 +-- libs/libxx/libxx_impure.cxx | 61 ------------------------------- 4 files changed, 73 insertions(+), 65 deletions(-) create mode 100644 libs/libc/misc/lib_impure.c delete mode 100644 libs/libxx/libxx_impure.cxx diff --git a/libs/libc/misc/Make.defs b/libs/libc/misc/Make.defs index 3e25e4038a..0a73af711d 100644 --- a/libs/libc/misc/Make.defs +++ b/libs/libc/misc/Make.defs @@ -22,7 +22,7 @@ CSRCS += lib_mknod.c lib_umask.c lib_utsname.c lib_getrandom.c CSRCS += lib_xorshift128.c lib_tea_encrypt.c lib_tea_decrypt.c -CSRCS += lib_cxx_initialize.c +CSRCS += lib_cxx_initialize.c lib_impure.c # Support for platforms that do not have long long types diff --git a/libs/libc/misc/lib_impure.c b/libs/libc/misc/lib_impure.c new file mode 100644 index 0000000000..ed339a17eb --- /dev/null +++ b/libs/libc/misc/lib_impure.c @@ -0,0 +1,71 @@ +/**************************************************************************** + * libs/libc/misc/lib_impure.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#if defined(__has_include) +# if __has_include() + +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifndef __ATTRIBUTE_IMPURE_PTR__ +# define __ATTRIBUTE_IMPURE_PTR__ +#endif + +#ifndef __ATTRIBUTE_IMPURE_DATA__ +# define __ATTRIBUTE_IMPURE_DATA__ +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +#ifdef _REENT_SMALL +extern const struct __sFILE_fake __sf_fake_stdin _ATTRIBUTE((weak)); +extern const struct __sFILE_fake __sf_fake_stdout _ATTRIBUTE((weak)); +extern const struct __sFILE_fake __sf_fake_stderr _ATTRIBUTE((weak)); +#endif + +static struct _reent __ATTRIBUTE_IMPURE_DATA__ +impure_data = _REENT_INIT(impure_data); + +#ifdef __CYGWIN__ +extern struct _reent reent_data __attribute__((alias("impure_data"))); +#endif + +struct _reent *__ATTRIBUTE_IMPURE_PTR__ +_impure_ptr = &impure_data; + +#ifdef CONFIG_ARCH_XTENSA +struct _reent *__ATTRIBUTE_IMPURE_PTR__ +_global_impure_ptr = &impure_data; +#else +struct _reent *const __ATTRIBUTE_IMPURE_PTR__ +_global_impure_ptr = &impure_data; +#endif + +# endif /* __has_include() */ +#endif /* defined(__has_include) */ diff --git a/libs/libxx/Makefile b/libs/libxx/Makefile index 5f78359c11..3e0e1c8327 100644 --- a/libs/libxx/Makefile +++ b/libs/libxx/Makefile @@ -41,9 +41,7 @@ ifeq ($(CONFIG_LIBCXXABI),y) include libcxxabi.defs endif -ifeq ($(CONFIG_LIBSUPCXX),y) -CXXSRCS += libxx_impure.cxx -else +ifneq ($(CONFIG_LIBSUPCXX),y) CXXSRCS += libxx_eabi_atexit.cxx endif diff --git a/libs/libxx/libxx_impure.cxx b/libs/libxx/libxx_impure.cxx deleted file mode 100644 index 92d92f1d10..0000000000 --- a/libs/libxx/libxx_impure.cxx +++ /dev/null @@ -1,61 +0,0 @@ -//*************************************************************************** -// libs/libxx/libxx_impure.cxx -// -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. The -// ASF licenses this file to you 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. -// -//*************************************************************************** - -//*************************************************************************** -// Included Files -//*************************************************************************** - -#if defined(__has_include) && __has_include() - -#include - -//*************************************************************************** -// Pre-processor Definitions -//*************************************************************************** - -#ifndef __ATTRIBUTE_IMPURE_PTR__ -#define __ATTRIBUTE_IMPURE_PTR__ -#endif - -#ifndef __ATTRIBUTE_IMPURE_DATA__ -#define __ATTRIBUTE_IMPURE_DATA__ -#endif - -//*************************************************************************** -// Public Data -//*************************************************************************** - -extern "C" -{ - #ifdef _REENT_SMALL - extern const struct __sFILE_fake __sf_fake_stdin _ATTRIBUTE ((weak)); - extern const struct __sFILE_fake __sf_fake_stdout _ATTRIBUTE ((weak)); - extern const struct __sFILE_fake __sf_fake_stderr _ATTRIBUTE ((weak)); - #endif - - static struct _reent __ATTRIBUTE_IMPURE_DATA__ impure_data = _REENT_INIT (impure_data); - #ifdef __CYGWIN__ - extern struct _reent reent_data __attribute__ ((alias("impure_data"))); - #endif - struct _reent *__ATTRIBUTE_IMPURE_PTR__ _impure_ptr = &impure_data; - struct _reent *const __ATTRIBUTE_IMPURE_PTR__ _global_impure_ptr = &impure_data; -} - -#endif