Add cxa_guard functions for C++ ABI compatibility

This commit is contained in:
Eryn Wells 2016-02-28 13:19:02 -05:00
parent 8574dabf74
commit e86960a283
2 changed files with 51 additions and 1 deletions

View file

@ -10,7 +10,8 @@ import subprocess
files = [
'boot.s',
'Main.cc',
'Console.cc'
'Console.cc',
'cxa.cc',
]
toolchain_bin = Dir(os.environ['POLKA_TOOLCHAIN']).Dir('bin')

49
src/cxa.cc Normal file
View file

@ -0,0 +1,49 @@
/* cxa.cc
* vim: set tw=80:
* Eryn Wells <eryn@erynwells.me>
*/
/**
* Implements some functions required by the C++ ABI so that local static
* variables can be initialized properly.
*/
namespace __cxxabiv1 {
// 64-bit integer type to service as mutex-like guard.
__extension__ typedef int __guard __attribute__((mode(__DI__)));
extern "C" {
/*
* TODO: The functions below are required by the C++ ABI and should be thread
* safe. Since Polka currently has no threads, it should be fine to do this
* without any actual locking. Once/If I add threading, I need to come back here
* and add an actual mutex with a test-and-set.
*
* See http://wiki.osdev.org/C%2B%2B#Local_Static_Variables_.28GCC_Only.29
* See the Intel XCHG instruction
*/
int
__cxa_guard_acquire(__guard *g)
{
return !*(g);
}
void
__cxa_guard_release(__guard *g)
{
*g = 1;
}
void
__cxa_guard_abort(__guard *)
{
// TODO: What would be useful to do here?
}
}
} /* namespace __cxxabiv1 */