From a4496b927bb7889ed076e7b7f0cc27fa0c4b9b75 Mon Sep 17 00:00:00 2001
From: Cristian Maglie <c.maglie@bug.st>
Date: Sat, 6 Sep 2014 12:42:25 +0200
Subject: Correct implementation of gcc specific internal functions

The following empty stubs has been replaced by the gcc
flag -fno-threadsafe-static:

  int __cxa_guard_acquire(__guard *);
  void __cxa_guard_release (__guard *);
  void __cxa_guard_abort (__guard *);

The following empty stubs has been moved into their specific
module abi.cpp:

  void __cxa_pure_virtual(void) __attribute ((noreturn));
  void __cxa_deleted_virtual(void) __attribute ((noreturn));

Fix #107
---
 cores/arduino/abi.cpp | 35 +++++++++++++++++++++++++++++++++++
 cores/arduino/new.cpp | 12 +++---------
 cores/arduino/new.h   |  8 --------
 3 files changed, 38 insertions(+), 17 deletions(-)
 create mode 100644 cores/arduino/abi.cpp

(limited to 'cores')

diff --git a/cores/arduino/abi.cpp b/cores/arduino/abi.cpp
new file mode 100644
index 0000000..8d719b8
--- /dev/null
+++ b/cores/arduino/abi.cpp
@@ -0,0 +1,35 @@
+/*
+  Copyright (c) 2014 Arduino.  All right reserved.
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, 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 Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+*/
+
+#include <stdlib.h>
+
+extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__));
+extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
+
+void __cxa_pure_virtual(void) {
+  // We might want to write some diagnostics to uart in this case
+  //std::terminate();
+  abort();
+}
+
+void __cxa_deleted_virtual(void) {
+  // We might want to write some diagnostics to uart in this case
+  //std::terminate();
+  abort();
+}
+
diff --git a/cores/arduino/new.cpp b/cores/arduino/new.cpp
index b81031e..1486012 100644
--- a/cores/arduino/new.cpp
+++ b/cores/arduino/new.cpp
@@ -1,7 +1,7 @@
-#include <new.h>
 
-void * operator new(size_t size)
-{
+#include <stdlib.h>
+
+void *operator new(size_t size) {
   return malloc(size);
 }
 
@@ -20,9 +20,3 @@ void operator delete[](void * ptr)
   free(ptr);
 }
 
-int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
-void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
-void __cxa_guard_abort (__guard *) {}; 
-
-void __cxa_pure_virtual(void) {};
-
diff --git a/cores/arduino/new.h b/cores/arduino/new.h
index 991c86c..50756f9 100644
--- a/cores/arduino/new.h
+++ b/cores/arduino/new.h
@@ -12,13 +12,5 @@ void * operator new[](size_t size);
 void operator delete(void * ptr);
 void operator delete[](void * ptr);
 
-__extension__ typedef int __guard __attribute__((mode (__DI__)));
-
-extern "C" int __cxa_guard_acquire(__guard *);
-extern "C" void __cxa_guard_release (__guard *);
-extern "C" void __cxa_guard_abort (__guard *); 
-
-extern "C" void __cxa_pure_virtual(void);
-
 #endif
 
-- 
cgit v1.2.3-18-g5258