Skip to content

Commit 37ee800

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 b0b8362 commit 37ee800

File tree

6 files changed

+60
-28
lines changed

6 files changed

+60
-28
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright (c) 2011 Arduino. All right reserved.
2+
Copyright (c) 2014 Arduino. All right reserved.
33
44
This library is free software; you can redistribute it and/or
55
modify it under the terms of the GNU Lesser General Public
@@ -8,19 +8,28 @@
88
99
This library is distributed in the hope that it will be useful,
1010
but WITHOUT ANY WARRANTY; without even the implied warranty of
11-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
1212
See the GNU Lesser General Public License for more details.
1313
1414
You should have received a copy of the GNU Lesser General Public
1515
License along with this library; if not, write to the Free Software
1616
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
1717
*/
1818

19-
extern "C" void __cxa_pure_virtual(void) ;
19+
#include <stdlib.h>
2020

21-
/* We compile with nodefaultlibs, so we need to provide an error
22-
* handler for an empty pure virtual function */
23-
extern "C" void __cxa_pure_virtual(void) {
24-
while(1)
25-
;
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();
2634
}
35+

hardware/arduino/avr/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-

hardware/arduino/avr/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

hardware/arduino/avr/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
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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+
while (1)
28+
;
29+
}
30+
31+
void __cxa_deleted_virtual(void) {
32+
// We might want to write some diagnostics to uart in this case
33+
//std::terminate();
34+
while (1)
35+
;
36+
}
37+

hardware/arduino/sam/platform.txt

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ version=1.5.8
1313
compiler.path={runtime.ide.path}/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/
1414
compiler.c.cmd=arm-none-eabi-gcc
1515
compiler.c.flags=-c -g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -Dprintf=iprintf
16-
compiler.c.elf.cmd=arm-none-eabi-g++
16+
compiler.c.elf.cmd=arm-none-eabi-gcc
1717
compiler.c.elf.flags=-Os -Wl,--gc-sections
1818
compiler.S.flags=-c -g -x assembler-with-cpp
1919
compiler.cpp.cmd=arm-none-eabi-g++
20-
compiler.cpp.flags=-c -g -Os -w -ffunction-sections -fdata-sections -nostdlib --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -Dprintf=iprintf
20+
compiler.cpp.flags=-c -g -Os -w -ffunction-sections -fdata-sections -nostdlib -fno-threadsafe-statics --param max-inline-insns-single=500 -fno-rtti -fno-exceptions -Dprintf=iprintf
2121
compiler.ar.cmd=arm-none-eabi-ar
2222
compiler.ar.flags=rcs
2323
compiler.objcopy.cmd=arm-none-eabi-objcopy

0 commit comments

Comments
 (0)