Skip to content

Commit

Permalink
Merge pull request #44 from grygorek/arm_gcc13
Browse files Browse the repository at this point in the history
Enable building with GCC13
  • Loading branch information
grygorek authored Mar 13, 2024
2 parents 614e09d + a533e6f commit 487a27d
Show file tree
Hide file tree
Showing 10 changed files with 1,084 additions and 9 deletions.
99 changes: 99 additions & 0 deletions .github/workflows/arm_gcc13.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: ARM none GCC 13.2

on: [push]

jobs:
Build-All-ARM-none-GCC13:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install ARM none GCC 13.2
shell: bash
run: |
wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-eabi.tar.xz
echo "-----Unpack gcc tarball----"
tar -xf arm-gnu*
echo "Done"
echo ""
ls -la
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/bin" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/arm-none-eabi/lib" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/arm-none-eabi/include" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/arm-none-eabi/include/c++/13.2.1" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/arm-none-eabi/include/c++/13.2.1/arm-none-eabi" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/arm-none-eabi/include/c++/13.2.1/backward" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include" >> $GITHUB_PATH
echo "${{github.workspace}}/arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/13.2.1/include-fixed" >> $GITHUB_PATH
echo "$PATH"
#
# Cortex A9
#

- name: Create Build Environment ARM CA9
run: cmake -E make_directory ${{github.workspace}}/build_ca9

- name: Configure CMake
shell: bash
working-directory: ${{github.workspace}}/build_ca9
run: |
arm-none-eabi-gcc --version
cmake $GITHUB_WORKSPACE -Darmca9=1 -DDEBUG=1
- name: Build ARM CA9
working-directory: ${{github.workspace}}/build_ca9
shell: bash
run: cmake --build . -j

- name: Save binaries
uses: actions/upload-artifact@v4
with:
name: arm-ca9-elf
retention-days: 1
path: |
build_ca9/test_ca9.elf
#
# Cortex M4
#

- name: Create Build Environment ARM CM4
working-directory: ${{github.workspace}}
run: cmake -E make_directory ${{github.workspace}}/build_cm4

- name: Configure CMake
shell: bash
working-directory: ${{github.workspace}}/build_cm4
run: |
arm-none-eabi-gcc --version
cmake $GITHUB_WORKSPACE -Dk64frdmevk=1 -DDEBUG=1
- name: Build ARM CM4
working-directory: ${{github.workspace}}/build_cm4
shell: bash
run: cmake --build . -j

Run-QEMU:
runs-on: ubuntu-latest
needs: Build-All-ARM-none-GCC13
timeout-minutes: 5
steps:
- name: Set up QEMU
run: |
sudo apt-get install qemu-system-arm
qemu-system-arm --version
- name: Donwload arm binaries
uses: actions/download-artifact@v4
with:
name: arm-ca9-elf

- name: Run Test
working-directory: /home/runner/work/FreeRTOS_cpp11/FreeRTOS_cpp11/
run: |
ls -la /home/runner/work/FreeRTOS_cpp11/FreeRTOS_cpp11/
qemu-system-arm -M vexpress-a9 -m 128M -nographic -semihosting -kernel test_ca9.elf
1 change: 1 addition & 0 deletions FreeRTOS/cpp11_gcc/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.

#define _GLIBCXX_THREAD_IMPL 1
#include <thread>
#include <system_error>
#include <cerrno>
Expand Down
8 changes: 5 additions & 3 deletions lib_test_nxp_mk64.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ SET(COMPILE_COMMON_FLAGS "${CONFIG_DEFS} ${COMPILE_PART_FLAGS} -Wall -Wextra -Wp
-fmessage-length=0 -ffunction-sections -fdata-sections -Xlinker -Map=out.map")

# When enabling exceptions, change the linker script to link libstdc++.a instead of libstdc++_nano.a
SET(CMAKE_C_FLAGS "${COMPILE_COMMON_FLAGS} -std=c17 -nostdlib -ffreestanding -fno-builtin " CACHE INTERNAL "" FORCE)
SET(CMAKE_CXX_FLAGS "${COMPILE_COMMON_FLAGS} -std=c++2a -nostdlib -ffreestanding -fno-builtin -fno-exceptions -fno-rtti -fno-unwind-tables" CACHE INTERNAL "" FORCE)
SET(CMAKE_C_FLAGS "${COMPILE_COMMON_FLAGS} -std=c17 -nostdlib -fno-builtin " CACHE INTERNAL "" FORCE)
SET(CMAKE_CXX_FLAGS "${COMPILE_COMMON_FLAGS} -std=c++2a -nostdlib -fno-builtin -fno-exceptions -fno-rtti -fno-unwind-tables" CACHE INTERNAL "" FORCE)
SET(CMAKE_ASM_FLAGS "-x assembler-with-cpp ${COMPILE_PART_FLAGS}" CACHE INTERNAL "" FORCE)

include_directories(
Expand All @@ -69,8 +69,10 @@ include_directories(
# Select the right directory for the compiler version
if(CMAKE_CXX_COMPILER_VERSION LESS 11)
SET(GCC_VER_DIR "v10")
else(CMAKE_CXX_COMPILER_VERSION LESS 11)
elseif(CMAKE_CXX_COMPILER_VERSION LESS 12)
SET(GCC_VER_DIR "v11")
else()
SET(GCC_VER_DIR "v13")
endif(CMAKE_CXX_COMPILER_VERSION LESS 11)

add_subdirectory(FreeRTOS)
Expand Down
28 changes: 28 additions & 0 deletions libstdc++_gcc/v13/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Copyright 2018-2023 Piotr Grygorczuk <[email protected]>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.

cmake_minimum_required(VERSION 3.0)

add_library(std++_freertos STATIC
future.cc
mutex.cc
condition_variable.cc
libatomic.c
)
133 changes: 133 additions & 0 deletions libstdc++_gcc/v13/condition_variable.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
// condition_variable -*- C++ -*-

// Copyright (C) 2008-2023 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library. This library 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, or (at your option)
// any later version.

// This library 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.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
// <http://www.gnu.org/licenses/>.

#include <condition_variable>
#include <cstdlib>

#ifdef _GLIBCXX_HAS_GTHREADS

namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION

condition_variable::condition_variable() noexcept = default;

condition_variable::~condition_variable() noexcept = default;

void
condition_variable::wait(unique_lock<mutex>& __lock)
{
_M_cond.wait(*__lock.mutex());
}

void
condition_variable::notify_one() noexcept
{
_M_cond.notify_one();
}

void
condition_variable::notify_all() noexcept
{
_M_cond.notify_all();
}

extern void
__at_thread_exit(__at_thread_exit_elt*);

namespace
{
__gthread_key_t key;

void run(void* p)
{
auto elt = (__at_thread_exit_elt*)p;
while (elt)
{
auto next = elt->_M_next;
elt->_M_cb(elt);
elt = next;
}
}

void run()
{
auto elt = (__at_thread_exit_elt*)__gthread_getspecific(key);
__gthread_setspecific(key, nullptr);
run(elt);
}

struct notifier final : __at_thread_exit_elt
{
notifier(condition_variable& cv, unique_lock<mutex>& l)
: cv(&cv), mx(l.release())
{
_M_cb = &notifier::run;
__at_thread_exit(this);
}

~notifier()
{
mx->unlock();
cv->notify_all();
}

condition_variable* cv;
mutex* mx;

static void run(void* p) { delete static_cast<notifier*>(p); }
};


void key_init() {
struct key_s {
key_s() { __gthread_key_create (&key, run); }
~key_s() { __gthread_key_delete (key); }
};
static key_s ks;
// Also make sure the callbacks are run by std::exit.
std::atexit (run);
}
}

void
__at_thread_exit(__at_thread_exit_elt* elt)
{
static __gthread_once_t once = __GTHREAD_ONCE_INIT;
__gthread_once (&once, key_init);

elt->_M_next = (__at_thread_exit_elt*)__gthread_getspecific(key);
__gthread_setspecific(key, elt);
}

void
notify_all_at_thread_exit(condition_variable& cv, unique_lock<mutex> l)
{
(void) new notifier{cv, l};
}

_GLIBCXX_END_NAMESPACE_VERSION
} // namespace

#endif // _GLIBCXX_HAS_GTHREADS
Loading

0 comments on commit 487a27d

Please sign in to comment.