Browse Source

Fix new/delete operators

teensy4-core
PaulStoffregen 11 years ago
parent
commit
ee66b4f4a1
6 changed files with 81 additions and 23 deletions
  1. +3
    -0
      teensy/Printable.h
  2. +16
    -6
      teensy/new.cpp
  3. +7
    -3
      teensy/new.h
  4. +1
    -14
      teensy3/Printable.h
  5. +28
    -0
      teensy3/new.cpp
  6. +26
    -0
      teensy3/new.h

+ 3
- 0
teensy/Printable.h View File

@@ -21,6 +21,8 @@
#ifndef Printable_h
#define Printable_h

#ifdef __cplusplus

#include "new.h"

class Print;
@@ -38,3 +40,4 @@ class Printable

#endif
#endif
#endif

+ 16
- 6
teensy/new.cpp View File

@@ -1,18 +1,28 @@
#include <new.h>
#include "new.h"

void * operator new(size_t size)
{
return malloc(size);
}

void * operator new[](size_t size)
{
return malloc(size);
}

void operator delete(void * ptr)
{
free(ptr);
}
}

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 *) {};
//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) {};
//void __cxa_pure_virtual(void) {};


+ 7
- 3
teensy/new.h View File

@@ -5,18 +5,22 @@
#ifndef NEW_H
#define NEW_H

#ifdef __cplusplus

#include <stdlib.h>

void * operator new(size_t size);
void operator delete(void * ptr);
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
#endif // __cplusplus

#endif

+ 1
- 14
teensy3/Printable.h View File

@@ -22,20 +22,7 @@

#ifdef __cplusplus

#include <stdlib.h>

inline void * operator new(unsigned int size) __attribute__((always_inline, unused));
inline void * operator new(unsigned int size)
{
return malloc(size);
}

inline void operator delete(void * ptr) __attribute__((always_inline, unused));
inline void operator delete(void * ptr)
{
free(ptr);
}

#include "new.h"

class Print;


+ 28
- 0
teensy3/new.cpp View File

@@ -0,0 +1,28 @@
#include "new.h"

void * operator new(size_t size)
{
return malloc(size);
}

void * operator new[](size_t size)
{
return malloc(size);
}

void operator delete(void * ptr)
{
free(ptr);
}

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) {};


+ 26
- 0
teensy3/new.h View File

@@ -0,0 +1,26 @@
/* Header to define new/delete operators as they aren't provided by avr-gcc by default
Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
*/

#ifndef NEW_H
#define NEW_H

#ifdef __cplusplus

#include <stdlib.h>

void * operator new(size_t size);
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 // __cplusplus

#endif

Loading…
Cancel
Save