Skip to content

Commit 54ef20f

Browse files
committed
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
1 parent e7fa0e7 commit 54ef20f

File tree

3 files changed

+38
-17
lines changed

3 files changed

+38
-17
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
Copyright (c) 2014 Arduino. All right reserved.
3+
4+
This library is free software; you can redistribute it and/or
5+
modify it under the terms of the GNU Lesser General Public
6+
License as published by the Free Software Foundation; either
7+
version 2.1 of the License, or (at your option) any later version.
8+
9+
This library is distributed in the hope that it will be useful,
10+
but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12+
See the GNU Lesser General Public License for more details.
13+
14+
You should have received a copy of the GNU Lesser General Public
15+
License along with this library; if not, write to the Free Software
16+
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17+
*/
18+
19+
#include <stdlib.h>
20+
21+
extern "C" void __cxa_pure_virtual(void) __attribute__ ((__noreturn__));
22+
extern "C" void __cxa_deleted_virtual(void) __attribute__ ((__noreturn__));
23+
24+
void __cxa_pure_virtual(void) {
25+
// We might want to write some diagnostics to uart in this case
26+
//std::terminate();
27+
abort();
28+
}
29+
30+
void __cxa_deleted_virtual(void) {
31+
// We might want to write some diagnostics to uart in this case
32+
//std::terminate();
33+
abort();
34+
}
35+

hardware/arduino/avr/cores/arduino/new.cpp

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
#include <new.h>
21

3-
void * operator new(size_t size)
4-
{
2+
#include <stdlib.h>
3+
4+
void *operator new(size_t size) {
55
return malloc(size);
66
}
77

@@ -20,9 +20,3 @@ void operator delete[](void * ptr)
2020
free(ptr);
2121
}
2222

23-
int __cxa_guard_acquire(__guard *g) {return !*(char *)(g);};
24-
void __cxa_guard_release (__guard *g) {*(char *)g = 1;};
25-
void __cxa_guard_abort (__guard *) {};
26-
27-
void __cxa_pure_virtual(void) {};
28-

hardware/arduino/avr/cores/arduino/new.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,5 @@ void * operator new[](size_t size);
1212
void operator delete(void * ptr);
1313
void operator delete[](void * ptr);
1414

15-
__extension__ typedef int __guard __attribute__((mode (__DI__)));
16-
17-
extern "C" int __cxa_guard_acquire(__guard *);
18-
extern "C" void __cxa_guard_release (__guard *);
19-
extern "C" void __cxa_guard_abort (__guard *);
20-
21-
extern "C" void __cxa_pure_virtual(void);
22-
2315
#endif
2416

0 commit comments

Comments
 (0)