Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a4496b9

Browse files
committedSep 6, 2014
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 df77892 commit a4496b9

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed
 

‎cores/arduino/abi.cpp

+35
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+

‎cores/arduino/new.cpp

+3-9
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-

‎cores/arduino/new.h

-8
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

‎platform.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ compiler.c.elf.flags=-w -Os -Wl,--gc-sections
2121
compiler.c.elf.cmd=avr-gcc
2222
compiler.S.flags=-c -g -x assembler-with-cpp
2323
compiler.cpp.cmd=avr-g++
24-
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -MMD
24+
compiler.cpp.flags=-c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
2525
compiler.ar.cmd=avr-ar
2626
compiler.ar.flags=rcs
2727
compiler.objcopy.cmd=avr-objcopy

0 commit comments

Comments
 (0)
Please sign in to comment.