8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-22 20:03:02 +01:00

Add platform support for Linux/m68k (#51)

* Add generic platform support for Linux/m68k

* Include sem_t when determining values for FB_ALIGNMENT and FB_DOUBLE_ALIGN

On m68k, 'long long' is 16-bit aligned while 'sem_t' is 32-bit aligned
and we must therefore include 'sem_t' when determining the values for
FB_ALIGNMENT and FB_DOUBLE_ALIGN. Otherwise, the futex system call
will fail on these systems.

* Don't try to include headers for __cpuid on non-x86 targets

* Make sure that the version scripts include _IO_stdin_used on Linux

The GNU C library supports two ABIs for libio, one is the pre-2.1
ABI and the other is the current one. In order to determine which
ABI is to be used, the C library checks whether the _IO_stdin_used
symbol is exported by the executable. In case the symbol is present,
the new ABI is assumed, if the symbol is missing, the old ABI is
assumed. Thus, if an application is linked against a modern version
of glibc, it must export the _IO_stdin_used symbol as otherwise the
executable can crash or provoke other unexpected behavior on some
architectures like PowerPC or MIPS because the C library is using
the old ABI in this case.
This commit is contained in:
John Paul Adrian Glaubitz 2016-10-14 12:12:09 +02:00 committed by Alexander Peshkov
parent 83899abaac
commit 7ba46163c7
6 changed files with 27 additions and 5 deletions

View File

@ -57,6 +57,7 @@ platform_linux() {
echo "${TAB}$i;"
done
echo "${TAB}_IO_stdin_used;"
echo 'local:'
echo "${TAB}*;"
echo '};'

View File

@ -363,6 +363,17 @@ dnl CPU_TYPE=ppc64
SHRLIB_EXT=so
;;
m68k*-*-linux*)
MAKEFILE_PREFIX=linux_generic
INSTALL_PREFIX=linux
PLATFORM=LINUX
AC_DEFINE(LINUX, 1, [Define this if OS is Linux])
AC_DEFINE(M68K, 1, [Define this if CPU is M68k])
LOCK_MANAGER_FLG=Y
EDITLINE_FLG=Y
SHRLIB_EXT=so
;;
*-*-linux* | *-*-gnu*)
MAKEFILE_PREFIX=linux_generic
INSTALL_PREFIX=linux
@ -1027,10 +1038,11 @@ AC_CHECK_MEMBER([struct dirent.d_type],
dnl EKU: try to determine the alignment of long and double
dnl replaces FB_ALIGNMENT and FB_DOUBLE_ALIGN in src/jrd/common.h
AC_MSG_CHECKING(alignment of long)
AC_RUN_IFELSE([AC_LANG_SOURCE([[main () {
AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <semaphore.h>
main () {
struct s {
char a;
long long b;
union { long long x; sem_t y; } b;
};
exit((int)&((struct s*)0)->b);
}]])],[ac_cv_c_alignment=$ac_status],[ac_cv_c_alignment=$ac_status],[])

View File

@ -48,6 +48,7 @@ static const UCHAR CpuHppa = 13;
static const UCHAR CpuAlpha = 14;
static const UCHAR CpuArm64 = 15;
static const UCHAR CpuPowerPc64el = 16;
static const UCHAR CpuM68k = 17;
static const UCHAR OsWindows = 0;
static const UCHAR OsLinux = 1;
@ -87,7 +88,8 @@ const char* hardware[] = {
"HPPA",
"Alpha",
"ARM64",
"PowerPC64el"
"PowerPC64el",
"M68k"
};
const char* operatingSystem[] = {
@ -128,8 +130,8 @@ const UCHAR backwardTable[FB_NELEM(hardware) * FB_NELEM(operatingSystem)] =
const UCHAR backEndianess[FB_NELEM(hardware)] =
{
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha ARM64 PowerPC64el
0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0
// Intel AMD Sparc PPC PPC64 MIPSEL MIPS ARM IA64 s390 s390x SH SHEB HPPA Alpha ARM64 PowerPC64el M68k
0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1
};
} // anonymous namespace

View File

@ -23,11 +23,13 @@
#include "firebird.h"
#include "../common/classes/Hash.h"
#if defined(_M_IX86) || defined(_M_X64) || defined(__x86_64__) || defined(__i386__)
#ifdef _MSC_VER
#include <intrin.h>
#else
#include <cpuid.h>
#endif
#endif
using namespace Firebird;

View File

@ -199,6 +199,10 @@
#define FB_CPU CpuPowerPc64
#endif /* PPC64 */
#ifdef M68K
#define FB_CPU CpuM68k
#endif /* M68K */
#endif /* LINUX */

View File

@ -241,6 +241,7 @@ enum info_db_implementations
isc_info_db_impl_linux_arm64 = 84,
isc_info_db_impl_linux_ppc64el = 85,
isc_info_db_impl_linux_ppc64 = 86,
isc_info_db_impl_linux_m68k = 87,
isc_info_db_impl_last_value // Leave this LAST!