mirror of
https://github.com/yann64/haikuports.git
synced 2026-04-10 05:40:07 +02:00
dmd v2.067.1 is useful to build latest version of dmd, because any version above this require bootstrapping to build.
1797 lines
72 KiB
Plaintext
1797 lines
72 KiB
Plaintext
From f40ecb6165036088fb75e1f51066c3e9e289f26d Mon Sep 17 00:00:00 2001
|
|
From: raefaldhia <raefaldhiamartya@gmail.com>
|
|
Date: Sat, 1 Apr 2017 07:42:48 +0000
|
|
Subject: Add platform support
|
|
|
|
|
|
diff --git a/src/backend/backconfig.c b/src/backend/backconfig.c
|
|
index a3b3c19..c9a6dab 100644
|
|
--- a/src/backend/backconfig.c
|
|
+++ b/src/backend/backconfig.c
|
|
@@ -171,6 +171,23 @@ void out_config_init(
|
|
config.flags3 |= CFG3pic;
|
|
config.objfmt = OBJ_ELF;
|
|
#endif
|
|
+#if TARGET_HAIKU
|
|
+ if (model == 64)
|
|
+ { config.exe = EX_HAIKU64;
|
|
+ config.fpxmmregs = TRUE;
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ config.exe = EX_HAIKU;
|
|
+ if (!exe)
|
|
+ config.flags |= CFGromable; // put switch tables in code segment
|
|
+ }
|
|
+ config.flags |= CFGnoebp;
|
|
+ config.flags |= CFGalwaysframe;
|
|
+ if (!exe)
|
|
+ config.flags3 |= CFG3pic;
|
|
+ config.objfmt = OBJ_ELF;
|
|
+#endif
|
|
config.flags2 |= CFG2nodeflib; // no default library
|
|
config.flags3 |= CFG3eseqds;
|
|
#if 0
|
|
@@ -303,7 +320,7 @@ void util_set32()
|
|
tysize[TYjhandle + i] = LONGSIZE;
|
|
tysize[TYnptr + i] = LONGSIZE;
|
|
tysize[TYnref + i] = LONGSIZE;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
tysize[TYldouble + i] = 12;
|
|
tysize[TYildouble + i] = 12;
|
|
tysize[TYcldouble + i] = 24;
|
|
@@ -335,7 +352,7 @@ void util_set32()
|
|
tyalignsize[TYjhandle + i] = LONGSIZE;
|
|
tyalignsize[TYnref + i] = LONGSIZE;
|
|
tyalignsize[TYnptr + i] = LONGSIZE;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
tyalignsize[TYldouble + i] = 4;
|
|
tyalignsize[TYildouble + i] = 4;
|
|
tyalignsize[TYcldouble + i] = 4;
|
|
@@ -378,7 +395,7 @@ void util_set64()
|
|
tysize[TYjhandle + i] = 8;
|
|
tysize[TYnptr + i] = 8;
|
|
tysize[TYnref + i] = 8;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS || TARGET_OSX
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS || TARGET_OSX || TARGET_HAIKU
|
|
tysize[TYldouble + i] = 16;
|
|
tysize[TYildouble + i] = 16;
|
|
tysize[TYcldouble + i] = 32;
|
|
@@ -406,7 +423,7 @@ void util_set64()
|
|
tyalignsize[TYjhandle + i] = 8;
|
|
tyalignsize[TYnptr + i] = 8;
|
|
tyalignsize[TYnref + i] = 8;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
tyalignsize[TYldouble + i] = 16;
|
|
tyalignsize[TYildouble + i] = 16;
|
|
tyalignsize[TYcldouble + i] = 16;
|
|
diff --git a/src/backend/cc.h b/src/backend/cc.h
|
|
index 0507def..128b3f7 100644
|
|
--- a/src/backend/cc.h
|
|
+++ b/src/backend/cc.h
|
|
@@ -77,7 +77,7 @@ enum WM
|
|
WM_badnumber = 24,
|
|
WM_ccast = 25,
|
|
WM_obsolete = 26,
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
WM_skip_attribute = 27, // skip GNUC attribute specification
|
|
WM_warning_message = 28, // preprocessor warning message
|
|
WM_bad_vastart = 29, // args for builtin va_start bad
|
|
@@ -110,7 +110,7 @@ enum LANG
|
|
#include "msgs2.h"
|
|
#endif
|
|
#include "ty.h"
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#include "../tk/mem.h"
|
|
#else
|
|
#include "mem.h"
|
|
@@ -669,7 +669,7 @@ typedef struct FUNC_S
|
|
#define Fnteh 0x08 // uses NT Structured EH
|
|
#define Fdoinline 0x40 // do inline walk
|
|
#define Foverridden 0x80 // ignore for overriding purposes
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define Fnowrite 0x100 // SCinline should never output definition
|
|
#else
|
|
#define Fjmonitor 0x100 // Jupiter synchronized function
|
|
@@ -1233,7 +1233,7 @@ struct Symbol
|
|
#define SFLmutable 0x100000 // SCmember or SCfield is mutable
|
|
#define SFLdyninit 0x200000 // symbol has dynamic initializer
|
|
#define SFLtmp 0x400000 // symbol is a generated temporary
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define SFLthunk 0x40000 // symbol is temporary for thunk
|
|
#endif
|
|
|
|
@@ -1450,7 +1450,7 @@ enum FL
|
|
FLallocatmp, // temp for built-in alloca()
|
|
FLstack, // offset from ESP rather than EBP
|
|
FLdsymbol, // it's a Dsymbol
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
// Change this, update debug.c too
|
|
FLgot, // global offset table entry outside this object file
|
|
FLgotoff, // global offset table entry inside this object file
|
|
diff --git a/src/backend/cdef.h b/src/backend/cdef.h
|
|
index 2dc4657..6fc20ea 100644
|
|
--- a/src/backend/cdef.h
|
|
+++ b/src/backend/cdef.h
|
|
@@ -193,9 +193,14 @@ One and only one of these macros must be set by the makefile:
|
|
#define TARGET_SOLARIS 0 // target is a Solaris executable
|
|
#endif
|
|
|
|
+// Set to 1 using the makefile
|
|
+#ifndef TARGET_HAIKU
|
|
+#define TARGET_HAIKU 0 // target is a Solaris executable
|
|
+#endif
|
|
+
|
|
// This is the default
|
|
#ifndef TARGET_WINDOS
|
|
-#define TARGET_WINDOS (!(TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS))
|
|
+#define TARGET_WINDOS (!(TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU))
|
|
#endif
|
|
|
|
#if __GNUC__
|
|
@@ -271,7 +276,7 @@ typedef long double longdouble;
|
|
|
|
// Precompiled header variations
|
|
#define MEMORYHX (_WINDLL && _WIN32) // HX and SYM files are cached in memory
|
|
-#define MMFIO (_WIN32 || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun) // if memory mapped files
|
|
+#define MMFIO (_WIN32 || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__) // if memory mapped files
|
|
#define LINEARALLOC _WIN32 // if we can reserve address ranges
|
|
|
|
// H_STYLE takes on one of these precompiled header methods
|
|
@@ -476,7 +481,7 @@ typedef unsigned targ_uns;
|
|
#define DOUBLESIZE 8
|
|
#if TARGET_OSX
|
|
#define LNGDBLSIZE 16 // 80 bit reals
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define LNGDBLSIZE 12 // 80 bit reals
|
|
#else
|
|
#define LNGDBLSIZE 10 // 80 bit reals
|
|
@@ -496,7 +501,7 @@ typedef unsigned targ_uns;
|
|
#define REGMASK 0xFFFF
|
|
|
|
// targ_llong is also used to store host pointers, so it should have at least their size
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_OSX || MARS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_OSX || MARS || TARGET_HAIKU
|
|
typedef targ_llong targ_ptrdiff_t; /* ptrdiff_t for target machine */
|
|
typedef targ_ullong targ_size_t; /* size_t for the target machine */
|
|
#else
|
|
@@ -527,14 +532,14 @@ typedef targ_uns targ_size_t; /* size_t for the target machine */
|
|
#define OMFOBJ TARGET_WINDOS
|
|
#endif
|
|
#ifndef ELFOBJ
|
|
-#define ELFOBJ (TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS)
|
|
+#define ELFOBJ (TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU)
|
|
#endif
|
|
#ifndef MACHOBJ
|
|
#define MACHOBJ TARGET_OSX
|
|
#endif
|
|
|
|
#define SYMDEB_CODEVIEW TARGET_WINDOS
|
|
-#define SYMDEB_DWARF (TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_OSX)
|
|
+#define SYMDEB_DWARF (TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_OSX || TARGET_HAIKU)
|
|
|
|
#define TOOLKIT_H
|
|
|
|
@@ -733,11 +738,14 @@ struct Config
|
|
#define EX_SOLARIS64 0x200000
|
|
#define EX_OPENBSD 0x400000
|
|
#define EX_OPENBSD64 0x800000
|
|
+#define EX_HAIKU 0x1000000
|
|
+#define EX_HAIKU64 0x2000000
|
|
|
|
#define EX_flat (EX_OS2 | EX_NT | EX_LINUX | EX_WIN64 | EX_LINUX64 | \
|
|
EX_OSX | EX_OSX64 | EX_FREEBSD | EX_FREEBSD64 | \
|
|
EX_OPENBSD | EX_OPENBSD64 | \
|
|
- EX_SOLARIS | EX_SOLARIS64)
|
|
+ EX_SOLARIS | EX_SOLARIS64 | \
|
|
+ EX_HAIKU | EX_HAIKU64)
|
|
#define EX_dos (EX_DOSX | EX_ZPM | EX_RATIONAL | EX_PHARLAP | \
|
|
EX_COM | EX_MZ /*| EX_WIN16*/)
|
|
|
|
@@ -792,7 +800,7 @@ struct Config
|
|
#define CFG3relax 0x200 // relaxed type checking (C only)
|
|
#define CFG3cpp 0x400 // C++ compile
|
|
#define CFG3igninc 0x800 // ignore standard include directory
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define CFG3mars 0x1000 // use mars libs and headers
|
|
#define NO_FAR (TRUE) // always ignore __far and __huge keywords
|
|
#else
|
|
@@ -804,7 +812,7 @@ struct Config
|
|
#define CFG3cppcomment 0x8000 // allow C++ style comments
|
|
#define CFG3wkfloat 0x10000 // make floating point references weak externs
|
|
#define CFG3digraphs 0x20000 // support ANSI C++ digraphs
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define CFG3semirelax 0x40000 // moderate relaxed type checking
|
|
#endif
|
|
#define CFG3pic 0x80000 // position independent code
|
|
@@ -1013,7 +1021,7 @@ union eve
|
|
#define SYMBOLZERO
|
|
#endif
|
|
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define UNIXFIELDS (unsigned)-1,(unsigned)-1,0,0,
|
|
#elif TARGET_OSX
|
|
#define UNIXFIELDS (unsigned)-1,(unsigned)-1,0,0,0,
|
|
diff --git a/src/backend/cgcod.c b/src/backend/cgcod.c
|
|
index 726bf87..0f9dac5 100644
|
|
--- a/src/backend/cgcod.c
|
|
+++ b/src/backend/cgcod.c
|
|
@@ -2392,7 +2392,7 @@ reload: /* reload result from memory */
|
|
case OPrelconst:
|
|
c = cdrelconst(e,pretregs);
|
|
break;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case OPgot:
|
|
c = cdgot(e,pretregs);
|
|
break;
|
|
diff --git a/src/backend/cgcv.c b/src/backend/cgcv.c
|
|
index c6e3d6c..5c3d1b1 100644
|
|
--- a/src/backend/cgcv.c
|
|
+++ b/src/backend/cgcv.c
|
|
@@ -17,7 +17,7 @@
|
|
#include <time.h>
|
|
#include <stdlib.h>
|
|
|
|
-#if _WIN32 || __linux__
|
|
+#if _WIN32 || __linux__ || __HAIKU__
|
|
#include <malloc.h>
|
|
#endif
|
|
|
|
diff --git a/src/backend/cgelem.c b/src/backend/cgelem.c
|
|
index 07482d3..dc65de4 100644
|
|
--- a/src/backend/cgelem.c
|
|
+++ b/src/backend/cgelem.c
|
|
@@ -791,7 +791,7 @@ L1:
|
|
e2 = e->E2;
|
|
if (e2->Eoper == OPconst)
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (e1->Eoper == OPrelconst && e1->EV.sp.Vsym->Sfl == FLgot)
|
|
goto ret;
|
|
#endif
|
|
@@ -807,7 +807,7 @@ L1:
|
|
}
|
|
else if (e1->Eoper == OPconst)
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (e2->Eoper == OPrelconst && e2->EV.sp.Vsym->Sfl == FLgot)
|
|
goto ret;
|
|
#endif
|
|
@@ -4880,7 +4880,7 @@ STATIC elem * elvalist(elem *e, goal_t goal)
|
|
|
|
#endif
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
|
|
assert(I64); // va_start is not an intrinsic on 32-bit
|
|
// (OPva_start &va)
|
|
diff --git a/src/backend/cgen.c b/src/backend/cgen.c
|
|
index ac2e139..34a7220 100644
|
|
--- a/src/backend/cgen.c
|
|
+++ b/src/backend/cgen.c
|
|
@@ -630,7 +630,7 @@ void searchfixlist(symbol *s)
|
|
// resolve directly.
|
|
if (s->Sseg == p->Lseg &&
|
|
(s->Sclass == SCstatic ||
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
(!(config.flags3 & CFG3pic) && s->Sclass == SCglobal)) &&
|
|
#else
|
|
s->Sclass == SCglobal) &&
|
|
diff --git a/src/backend/cod1.c b/src/backend/cod1.c
|
|
index d56949b..be25a1d 100644
|
|
--- a/src/backend/cod1.c
|
|
+++ b/src/backend/cod1.c
|
|
@@ -1324,7 +1324,7 @@ code *getlvalue(code *pcs,elem *e,regm_t keepmsk)
|
|
case FLextern:
|
|
if (s->Sident[0] == '_' && memcmp(s->Sident + 1,"tls_array",10) == 0)
|
|
{
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
// Rewrite as GS:[0000], or FS:[0000] for 64 bit
|
|
if (I64)
|
|
{
|
|
@@ -1370,7 +1370,7 @@ code *getlvalue(code *pcs,elem *e,regm_t keepmsk)
|
|
#if TARGET_SEGMENTED
|
|
case FLcsdata:
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case FLgot:
|
|
case FLgotoff:
|
|
case FLtlsdata:
|
|
@@ -1420,7 +1420,7 @@ code *getlvalue(code *pcs,elem *e,regm_t keepmsk)
|
|
pcs->Iflags |= CFcs | CFoff;
|
|
}
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I64 && config.flags3 & CFG3pic &&
|
|
(fl == FLtlsdata || s->ty() & mTYthread))
|
|
{
|
|
@@ -1869,12 +1869,12 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
{
|
|
//printf("callclib(e = %p, clib = %d, *pretregs = %s, keepmask = %s\n", e, clib, regm_str(*pretregs), regm_str(keepmask));
|
|
//elem_print(e);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
static symbol lib[] =
|
|
{
|
|
/* Convert destroyed regs into saved regs */
|
|
#define Z(desregs) (~(desregs) & (mBP| mES | ALLREGS))
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define N(name) "_" name
|
|
#else
|
|
#define N(name) name
|
|
@@ -2106,7 +2106,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
{DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1}, // _INTDBL@ intdbl
|
|
{mAX,mAX,0,INFfloat,1,1}, // _DBLUNS@ dbluns
|
|
{DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1}, // _UNSDBL@ unsdbl
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
{mDX|mAX,mAX,0,INF32|INFfloat,0,1}, // _DBLULNG@ dblulng
|
|
#else
|
|
{mDX|mAX,mAX,0,INFfloat,1,1}, // _DBLULNG@ dblulng
|
|
@@ -2119,7 +2119,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
|
|
{DOUBLEREGS_16,mDX|mAX,0,INFfloat,1,1}, // _DBLLLNG@
|
|
{DOUBLEREGS_16,DOUBLEREGS_32,0,INFfloat,1,1}, // _LLNGDBL@
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
{DOUBLEREGS_16,mDX|mAX,0,INFfloat,2,2}, // _DBLULLNG@
|
|
#else
|
|
{DOUBLEREGS_16,mDX|mAX,0,INFfloat,1,1}, // _DBLULLNG@
|
|
@@ -2164,7 +2164,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
lib[i].Stypidx = 0;
|
|
#endif
|
|
}
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
clibldiv2.Stype = tsclib;
|
|
clibuldiv2.Stype = tsclib;
|
|
clibldiv3.Stype = tsclib;
|
|
@@ -2293,7 +2293,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
{
|
|
code *cgot = NULL;
|
|
bool pushebx = false;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I32)
|
|
{
|
|
/* Pass EBX on the stack instead, this is because EBX is used
|
|
@@ -2303,7 +2303,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
{
|
|
cgot = load_localgot(); // EBX gets set to this value
|
|
}
|
|
-#if TARGET_LINUX || TARGET_FREEBSD
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_HAIKU
|
|
switch (clib)
|
|
{
|
|
case CLIBldiv:
|
|
@@ -2354,7 +2354,7 @@ code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask)
|
|
}
|
|
if (pushebx)
|
|
{
|
|
-#if TARGET_LINUX || TARGET_FREEBSD
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_HAIKU
|
|
c = gen1(c, 0x50 + CX); // PUSH ECX
|
|
c = gen1(c, 0x50 + BX); // PUSH EBX
|
|
c = gen1(c, 0x50 + DX); // PUSH EDX
|
|
@@ -3083,7 +3083,7 @@ STATIC code * funccall(elem *e,unsigned numpara,unsigned numalign,regm_t *pretre
|
|
if (tym1 == TYifunc)
|
|
c1 = gen1(c1,0x9C); // PUSHF
|
|
ce = CNIL;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (s != tls_get_addr_sym)
|
|
{
|
|
//printf("call %s\n", s->Sident);
|
|
@@ -3092,7 +3092,7 @@ STATIC code * funccall(elem *e,unsigned numpara,unsigned numalign,regm_t *pretre
|
|
#endif
|
|
ce = gencs(ce,farfunc ? 0x9A : 0xE8,0,fl,s); // CALL extern
|
|
code_orflag(ce, farfunc ? (CFseg | CFoff) : (CFselfrel | CFoff));
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (s == tls_get_addr_sym)
|
|
{
|
|
if (I64)
|
|
@@ -3125,7 +3125,7 @@ STATIC code * funccall(elem *e,unsigned numpara,unsigned numalign,regm_t *pretre
|
|
assert(!I16 || (e11ty == TYnptr));
|
|
#endif
|
|
c = cat(c, load_localgot());
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic && I32)
|
|
keepmsk |= mBX;
|
|
#endif
|
|
diff --git a/src/backend/cod2.c b/src/backend/cod2.c
|
|
index 3d7c2eb..e4c0863 100644
|
|
--- a/src/backend/cod2.c
|
|
+++ b/src/backend/cod2.c
|
|
@@ -175,7 +175,7 @@ code *cdorth(elem *e,regm_t *pretregs)
|
|
{
|
|
if (*pretregs & XMMREGS || tyvector(ty1))
|
|
return orthxmm(e,pretregs);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
return orth87(e,pretregs);
|
|
#else
|
|
return opdouble(e,pretregs,(e->Eoper == OPadd) ? CLIBdadd
|
|
@@ -874,7 +874,7 @@ code *cdmul(elem *e,regm_t *pretregs)
|
|
{
|
|
if (*pretregs & XMMREGS && oper != OPmod && tyxmmreg(tyml))
|
|
return orthxmm(e,pretregs);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
return orth87(e,pretregs);
|
|
#else
|
|
return opdouble(e,pretregs,(oper == OPmul) ? CLIBdmul : CLIBddiv);
|
|
@@ -4178,7 +4178,7 @@ code *getoffset(elem *e,unsigned reg)
|
|
#endif
|
|
|
|
case FLtlsdata:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
{
|
|
L5:
|
|
if (config.flags3 & CFG3pic)
|
|
@@ -4305,7 +4305,7 @@ code *getoffset(elem *e,unsigned reg)
|
|
goto L4;
|
|
|
|
case FLextern:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (e->EV.sp.Vsym->ty() & mTYthread)
|
|
goto L5;
|
|
#endif
|
|
@@ -4315,7 +4315,7 @@ code *getoffset(elem *e,unsigned reg)
|
|
#endif
|
|
case FLdata:
|
|
case FLudata:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case FLgot:
|
|
case FLgotoff:
|
|
#endif
|
|
@@ -4639,7 +4639,7 @@ code *cdpost(elem *e,regm_t *pretregs)
|
|
|
|
if (tyfloating(tyml))
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
return post87(e,pretregs);
|
|
#else
|
|
if (config.inline8087)
|
|
@@ -5142,7 +5142,7 @@ code *cdddtor(elem *e,regm_t *pretregs)
|
|
code *c = codelem(e->E1,pretregs,FALSE);
|
|
gen1(c,0xC3); // RET
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic)
|
|
{
|
|
int nalign = 0;
|
|
diff --git a/src/backend/cod3.c b/src/backend/cod3.c
|
|
index 10dc347..279bbe7 100644
|
|
--- a/src/backend/cod3.c
|
|
+++ b/src/backend/cod3.c
|
|
@@ -622,7 +622,7 @@ regm_t regmask(tym_t tym, tym_t tyf)
|
|
return mST0;
|
|
|
|
case TYcfloat:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I32 && tybasic(tyf) == TYnfunc)
|
|
return mDX | mAX;
|
|
#endif
|
|
@@ -1363,7 +1363,7 @@ void doswitch(block *b)
|
|
regm_t retregs = IDXREGS;
|
|
if (dword)
|
|
retregs |= mMSW;
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I32 && config.flags3 & CFG3pic)
|
|
retregs &= ~mBX; // need EBX for GOT
|
|
#endif
|
|
@@ -1555,7 +1555,7 @@ void doswitch(block *b)
|
|
genjmp(c,JNE,FLblock,list_block(b->Bsucc)); /* JNE default */
|
|
}
|
|
ce = getregs(mCX|mDI);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic)
|
|
{ // Add in GOT
|
|
code *cx;
|
|
@@ -1635,7 +1635,7 @@ void doswitch(block *b)
|
|
mod = (disp > 127) ? 2 : 1; /* 1 or 2 byte displacement */
|
|
if (csseg)
|
|
gen1(ce,SEGCS); // table is in code segment
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic)
|
|
{ // ADD EDX,(ncases-1)*2[EDI]
|
|
ct = genc1(CNIL,0x03,modregrm(mod,DX,7),FLconst,disp);
|
|
@@ -1708,7 +1708,7 @@ void outjmptab(block *b)
|
|
break;
|
|
}
|
|
}
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I64)
|
|
{
|
|
if (config.flags3 & CFG3pic)
|
|
@@ -2286,7 +2286,7 @@ code *cdgot(elem *e, regm_t *pretregs)
|
|
gen1(c, 0x58 + reg); // L1: POP reg
|
|
|
|
return cat(c,fixresult(e,retregs,pretregs));
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
regm_t retregs;
|
|
unsigned reg;
|
|
code *c;
|
|
@@ -2325,7 +2325,7 @@ code *cdgot(elem *e, regm_t *pretregs)
|
|
|
|
code *load_localgot()
|
|
{
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic && I32)
|
|
{
|
|
if (localgot && !(localgot->Sflags & SFLdead))
|
|
@@ -2351,7 +2351,7 @@ code *load_localgot()
|
|
return NULL;
|
|
}
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
/*****************************
|
|
* Returns:
|
|
* # of bytes stored
|
|
@@ -2969,7 +2969,7 @@ code* prolog_frame(unsigned farfunc, unsigned* xlocalsize, bool* enter)
|
|
if (config.wflags & WFincbp && farfunc)
|
|
c = gen1(c,0x40 + BP); /* INC BP */
|
|
if (config.target_cpu < TARGET_80286 ||
|
|
- config.exe & (EX_LINUX | EX_LINUX64 | EX_OSX | EX_OSX64 | EX_FREEBSD | EX_FREEBSD64 | EX_SOLARIS | EX_SOLARIS64 | EX_WIN64) ||
|
|
+ config.exe & (EX_LINUX | EX_LINUX64 | EX_OSX | EX_OSX64 | EX_FREEBSD | EX_FREEBSD64 | EX_SOLARIS | EX_SOLARIS64 | EX_WIN64 | EX_HAIKU | EX_HAIKU64) ||
|
|
!localsize ||
|
|
config.flags & CFGstack ||
|
|
(*xlocalsize >= 0x1000 && config.exe & EX_flat) ||
|
|
@@ -4159,7 +4159,7 @@ void cod3_thunk(symbol *sthunk,symbol *sfunc,unsigned p,tym_t thisty,
|
|
sthunk->Soffset = thunkoffset;
|
|
sthunk->Ssize = Coffset - thunkoffset; /* size of thunk */
|
|
sthunk->Sseg = cseg;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
objmod->pubdef(cseg,sthunk,sthunk->Soffset);
|
|
#endif
|
|
#if TARGET_WINDOS
|
|
@@ -6307,7 +6307,7 @@ STATIC void do64bit(enum FL fl,union evc *uev,int flags)
|
|
// un-named external with is the start of .rodata or .data
|
|
case FLextern: /* external data symbol */
|
|
case FLtlsdata:
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case FLgot:
|
|
case FLgotoff:
|
|
#endif
|
|
@@ -6421,7 +6421,7 @@ STATIC void do32bit(enum FL fl,union evc *uev,int flags, int val)
|
|
// un-named external with is the start of .rodata or .data
|
|
case FLextern: /* external data symbol */
|
|
case FLtlsdata:
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case FLgot:
|
|
case FLgotoff:
|
|
#endif
|
|
diff --git a/src/backend/cod4.c b/src/backend/cod4.c
|
|
index 2ac097c..204cb9f 100644
|
|
--- a/src/backend/cod4.c
|
|
+++ b/src/backend/cod4.c
|
|
@@ -824,7 +824,7 @@ code *cdaddass(elem *e,regm_t *pretregs)
|
|
|
|
if (tyfloating(tyml))
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (op == OPnegass)
|
|
c = cdnegass87(e,pretregs);
|
|
else
|
|
@@ -1335,7 +1335,7 @@ code *cdmulass(elem *e,regm_t *pretregs)
|
|
|
|
if (tyfloating(tyml))
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
return opass87(e,pretregs);
|
|
#else
|
|
return opassdbl(e,pretregs,op);
|
|
@@ -1837,7 +1837,7 @@ code *cdcmp(elem *e,regm_t *pretregs)
|
|
unsigned rex = (I64 && sz == 8) ? REX_W : 0;
|
|
unsigned grex = rex << 16; // 64 bit operands
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (tyfloating(tym)) /* if floating operation */
|
|
{
|
|
retregs = mPSW;
|
|
@@ -2715,7 +2715,7 @@ code *cdcnvt(elem *e, regm_t *pretregs)
|
|
return xmmcnvt(e,pretregs);
|
|
if (I32 || I64)
|
|
return cdd_u32(e,pretregs);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
retregs = mST0;
|
|
#else
|
|
retregs = DOUBLEREGS;
|
|
diff --git a/src/backend/code.h b/src/backend/code.h
|
|
index 774eb93..77a341e 100644
|
|
--- a/src/backend/code.h
|
|
+++ b/src/backend/code.h
|
|
@@ -292,7 +292,7 @@ void WRcodlst (code *c );
|
|
cd_t cdcomma;
|
|
cd_t cdloglog;
|
|
cd_t cdshift;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
cd_t cdindpic;
|
|
#endif
|
|
cd_t cdind;
|
|
diff --git a/src/backend/code_x86.h b/src/backend/code_x86.h
|
|
index 42b4370..e2c242a 100644
|
|
--- a/src/backend/code_x86.h
|
|
+++ b/src/backend/code_x86.h
|
|
@@ -116,7 +116,7 @@ enum // #defining R12-R15 interfere with setjmps' _JUMP_BUFFER members
|
|
|
|
extern regm_t ALLREGS;
|
|
extern regm_t BYTEREGS;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
// To support positional independent code,
|
|
// must be able to remove BX from available registers
|
|
#define ALLREGS_INIT (mAX|mBX|mCX|mDX|mSI|mDI)
|
|
diff --git a/src/backend/debug.c b/src/backend/debug.c
|
|
index a319f5a..20b2d20 100644
|
|
--- a/src/backend/debug.c
|
|
+++ b/src/backend/debug.c
|
|
@@ -91,7 +91,7 @@ void WRTYxx(tym_t t)
|
|
dbg_printf("mTYconst|");
|
|
if (t & mTYvolatile)
|
|
dbg_printf("mTYvolatile|");
|
|
-#if !MARS && (__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun)
|
|
+#if !MARS && (__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__)
|
|
if (t & mTYtransu)
|
|
dbg_printf("mTYtransu|");
|
|
#endif
|
|
@@ -270,7 +270,7 @@ void WRFL(enum FL fl)
|
|
"local ","tlsdat",
|
|
"bprel ","frameh","blocko","alloca",
|
|
"stack ","dsym ",
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
"got ","gotoff",
|
|
#endif
|
|
};
|
|
diff --git a/src/backend/dwarf.c b/src/backend/dwarf.c
|
|
index 73a71e7..4ae325b 100644
|
|
--- a/src/backend/dwarf.c
|
|
+++ b/src/backend/dwarf.c
|
|
@@ -18,11 +18,11 @@
|
|
#include <fcntl.h>
|
|
#include <ctype.h>
|
|
|
|
-#if __DMC__ || __linux__
|
|
+#if __DMC__ || __linux__ || __HAIKU__
|
|
#include <malloc.h>
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#include <errno.h>
|
|
diff --git a/src/backend/el.c b/src/backend/el.c
|
|
index de5ff31..cc65d45 100644
|
|
--- a/src/backend/el.c
|
|
+++ b/src/backend/el.c
|
|
@@ -1154,7 +1154,7 @@ Lnodep:
|
|
|
|
symbol *el_alloc_localgot()
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
/* Since localgot is a local variable to each function,
|
|
* localgot must be set back to NULL
|
|
* at the start of code gen for each function.
|
|
@@ -1279,7 +1279,7 @@ elem *el_picvar(symbol *s)
|
|
return e;
|
|
}
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
|
|
elem *el_picvar(symbol *s)
|
|
{ elem *e;
|
|
@@ -1474,13 +1474,13 @@ elem * el_var(symbol *s)
|
|
|
|
//printf("el_var(s = '%s')\n", s->Sident);
|
|
//printf("%x\n", s->Stype->Tty);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic &&
|
|
!tyfunc(s->ty()))
|
|
// Position Independent Code
|
|
return el_picvar(s);
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic && tyfunc(s->ty()))
|
|
{
|
|
switch (s->Sclass)
|
|
@@ -1506,7 +1506,7 @@ elem * el_var(symbol *s)
|
|
//printf("thread local %s\n", s->Sident);
|
|
#if TARGET_OSX
|
|
;
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
/* For 32 bit:
|
|
* Generate for var locals:
|
|
* MOV reg,GS:[00000000] // add GS: override in back end
|
|
@@ -1625,7 +1625,7 @@ elem * el_var(symbol *s)
|
|
{ elem *e;
|
|
|
|
//printf("el_var(s = '%s')\n", s->Sident);
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic && !tyfunc(s->ty()))
|
|
return el_picvar(s);
|
|
#endif
|
|
@@ -1716,7 +1716,7 @@ elem * el_ptr(symbol *s)
|
|
return e;
|
|
}
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (config.flags3 & CFG3pic &&
|
|
tyfunc(s->ty()))
|
|
e = el_picvar(s);
|
|
diff --git a/src/backend/elfobj.c b/src/backend/elfobj.c
|
|
index d7f1cd4..d8209f2 100644
|
|
--- a/src/backend/elfobj.c
|
|
+++ b/src/backend/elfobj.c
|
|
@@ -50,6 +50,8 @@
|
|
# define ELFOSABI ELFOSABI_SYSV
|
|
# elif TARGET_OPENBSD
|
|
# define ELFOSABI ELFOSABI_OPENBSD
|
|
+# elif TARGET_HAIKU
|
|
+# define ELFOSABI ELFOSABI_HAIKU
|
|
# else
|
|
# error "No ELF OS ABI defined. Please fix"
|
|
# endif
|
|
@@ -77,7 +79,7 @@ char *obj_mangle2(Symbol *s,char *dest);
|
|
* section registration and will no longer create global bracket
|
|
* symbols (_deh_beg,_deh_end,_tlsstart,_tlsend).
|
|
*/
|
|
-#define REQUIRE_DSO_REGISTRY (DMDV2 && (TARGET_LINUX || TARGET_FREEBSD))
|
|
+#define REQUIRE_DSO_REGISTRY (DMDV2 && (TARGET_LINUX || TARGET_FREEBSD || TARGET_HAIKU))
|
|
|
|
/***************************************************
|
|
* Correspondence of relocation types
|
|
@@ -2017,7 +2019,7 @@ char *obj_mangle2(Symbol *s,char *dest)
|
|
}
|
|
break;
|
|
case mTYman_std:
|
|
-#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (tyfunc(s->ty()) && !variadic(s->Stype))
|
|
#else
|
|
if (!(config.flags4 & CFG4oldstdmangle) &&
|
|
diff --git a/src/backend/evalu8.c b/src/backend/evalu8.c
|
|
index ec8c7b8..5a12dfb 100644
|
|
--- a/src/backend/evalu8.c
|
|
+++ b/src/backend/evalu8.c
|
|
@@ -547,7 +547,7 @@ elem *poptelem(elem *e)
|
|
if (e2->Eoper == OPconst)
|
|
{ targ_int i = e2->EV.Vint;
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (i && e1->EV.sp.Vsym->Sfl == FLgot)
|
|
break;
|
|
#endif
|
|
diff --git a/src/backend/global.h b/src/backend/global.h
|
|
index 02b0abb..b10d6d0 100644
|
|
--- a/src/backend/global.h
|
|
+++ b/src/backend/global.h
|
|
@@ -502,7 +502,7 @@ void dwarf_CFA_offset(int reg, int offset);
|
|
void dwarf_CFA_args_size(size_t sz);
|
|
#endif
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
elem * exp_isconst();
|
|
elem *lnx_builtin_next_arg(elem *efunc,list_t arglist);
|
|
char *lnx_redirect_funcname(const char *);
|
|
diff --git a/src/backend/machobj.c b/src/backend/machobj.c
|
|
index aabc365..547293e 100644
|
|
--- a/src/backend/machobj.c
|
|
+++ b/src/backend/machobj.c
|
|
@@ -17,11 +17,11 @@
|
|
#include <fcntl.h>
|
|
#include <ctype.h>
|
|
|
|
-#if _WIN32 || __linux__
|
|
+#if _WIN32 || __linux__ || __HAIKU__
|
|
#include <malloc.h>
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
@@ -1925,7 +1925,7 @@ char *obj_mangle2(Symbol *s,char *dest)
|
|
*p = toupper(*p);
|
|
break;
|
|
case mTYman_std:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (tyfunc(s->ty()) && !variadic(s->Stype))
|
|
#else
|
|
if (!(config.flags4 & CFG4oldstdmangle) &&
|
|
diff --git a/src/backend/melf.h b/src/backend/melf.h
|
|
index 69276ee..b32b925 100644
|
|
--- a/src/backend/melf.h
|
|
+++ b/src/backend/melf.h
|
|
@@ -49,6 +49,7 @@ typedef struct
|
|
#define ELFOSABI_LINUX 3
|
|
#define ELFOSABI_FREEBSD 9
|
|
#define ELFOSABI_OPENBSD 12
|
|
+ #define ELFOSABI_HAIKU 15
|
|
#define ELFOSABI_ARM 97 /* ARM */
|
|
#define ELFOSABI_STANDALONE 255 /* Standalone/embedded */
|
|
|
|
diff --git a/src/backend/mscoffobj.c b/src/backend/mscoffobj.c
|
|
index e7d11c1..818af68 100644
|
|
--- a/src/backend/mscoffobj.c
|
|
+++ b/src/backend/mscoffobj.c
|
|
@@ -18,7 +18,7 @@
|
|
#include <ctype.h>
|
|
#include <time.h>
|
|
|
|
-#if _WIN32 || __linux__
|
|
+#if _WIN32 || __linux__ || __HAIKU__
|
|
#include <malloc.h>
|
|
#endif
|
|
|
|
@@ -1797,7 +1797,7 @@ char *obj_mangle2(Symbol *s,char *dest)
|
|
strupr(dest); // to upper case
|
|
break;
|
|
case mTYman_std:
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (tyfunc(s->ty()) && !variadic(s->Stype))
|
|
#else
|
|
if (!(config.flags4 & CFG4oldstdmangle) &&
|
|
diff --git a/src/backend/nteh.c b/src/backend/nteh.c
|
|
index 2e0771a..56a4af3 100644
|
|
--- a/src/backend/nteh.c
|
|
+++ b/src/backend/nteh.c
|
|
@@ -315,7 +315,7 @@ code *nteh_prolog()
|
|
/* An sindex value of -2 is a magic value that tells the
|
|
* stack unwinder to skip this frame.
|
|
*/
|
|
- assert(config.exe & (EX_LINUX | EX_LINUX64 | EX_OSX | EX_OSX64 | EX_FREEBSD | EX_FREEBSD64 | EX_SOLARIS | EX_SOLARIS64 | EX_OPENBSD | EX_OPENBSD64));
|
|
+ assert(config.exe & (EX_LINUX | EX_LINUX64 | EX_OSX | EX_OSX64 | EX_FREEBSD | EX_FREEBSD64 | EX_SOLARIS | EX_SOLARIS64 | EX_OPENBSD | EX_OPENBSD64 | EX_HAIKU | EX_HAIKU64));
|
|
cs.Iop = 0x68;
|
|
cs.Iflags = 0;
|
|
cs.Irex = 0;
|
|
diff --git a/src/backend/obj.h b/src/backend/obj.h
|
|
index 9d00631..9210ca3 100644
|
|
--- a/src/backend/obj.h
|
|
+++ b/src/backend/obj.h
|
|
@@ -86,7 +86,7 @@ struct Obj
|
|
VIRTUAL void func_start(Symbol *sfunc);
|
|
VIRTUAL void func_term(Symbol *sfunc);
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
static unsigned addstr(Outbuffer *strtab, const char *);
|
|
static void gotref(symbol *s);
|
|
static symbol *getGOTsym();
|
|
diff --git a/src/backend/optabgen.c b/src/backend/optabgen.c
|
|
index 449767c..5aaa81c 100644
|
|
--- a/src/backend/optabgen.c
|
|
+++ b/src/backend/optabgen.c
|
|
@@ -799,7 +799,7 @@ void fltables()
|
|
case FLctor: segfl[i] = -1; break;
|
|
case FLdtor: segfl[i] = -1; break;
|
|
case FLdsymbol: segfl[i] = -1; break;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case FLgot: segfl[i] = -1; break;
|
|
case FLgotoff: segfl[i] = -1; break;
|
|
#endif
|
|
@@ -1113,7 +1113,7 @@ void dotytab()
|
|
case TYcldouble:
|
|
#if TARGET_OSX
|
|
sz = 16;
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
sz = 4;
|
|
#elif TARGET_WINDOS
|
|
sz = 2;
|
|
diff --git a/src/backend/os.c b/src/backend/os.c
|
|
index cac16f5..737b548 100644
|
|
--- a/src/backend/os.c
|
|
+++ b/src/backend/os.c
|
|
@@ -25,7 +25,7 @@
|
|
#include <sys\stat.h>
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <fcntl.h>
|
|
@@ -666,7 +666,7 @@ int os_file_exists(const char *name)
|
|
if (!find)
|
|
return 0;
|
|
return (find->attribute & FA_DIREC) ? 2 : 1;
|
|
-#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
struct stat buf;
|
|
|
|
return stat(name,&buf) == 0; /* file exists if stat succeeded */
|
|
@@ -743,7 +743,7 @@ char *file_8dot3name(const char *filename)
|
|
|
|
int file_write(char *name, void *buffer, unsigned len)
|
|
{
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
int fd;
|
|
ssize_t numwritten;
|
|
|
|
@@ -819,7 +819,7 @@ err:
|
|
|
|
int file_createdirs(char *name)
|
|
{
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
return 1;
|
|
#endif
|
|
#if _WIN32
|
|
diff --git a/src/backend/out.c b/src/backend/out.c
|
|
index 608ede1..7ffb0f3 100644
|
|
--- a/src/backend/out.c
|
|
+++ b/src/backend/out.c
|
|
@@ -366,7 +366,7 @@ void outdata(symbol *s)
|
|
objmod->reftocodeseg(seg,offset,dt->DTabytes);
|
|
else
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
objmod->reftodatseg(seg,offset,dt->DTabytes,dt->DTseg,flags);
|
|
#else
|
|
/*else*/ if (dt->DTseg == DATA)
|
|
diff --git a/src/backend/strtold.c b/src/backend/strtold.c
|
|
index 4f284c6..64e0829 100644
|
|
--- a/src/backend/strtold.c
|
|
+++ b/src/backend/strtold.c
|
|
@@ -19,7 +19,7 @@
|
|
#include <fenv.h>
|
|
#include <fltpnt.h>
|
|
#endif
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
@@ -31,7 +31,7 @@ extern char * __cdecl __locale_decpoint;
|
|
void __pascal __set_errno (int an_errno);
|
|
#endif
|
|
|
|
-#if _WIN32 || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if _WIN32 || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
|
|
#if 0
|
|
/* This is for compilers that don't support hex float literals,
|
|
diff --git a/src/backend/token.h b/src/backend/token.h
|
|
index e12c828..68ac7e4 100644
|
|
--- a/src/backend/token.h
|
|
+++ b/src/backend/token.h
|
|
@@ -174,7 +174,7 @@ enum TK {
|
|
TK_stdcall,
|
|
TK_syscall,
|
|
TK_try,
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
TK_attribute,
|
|
TK_extension,
|
|
TK_format,
|
|
@@ -206,7 +206,7 @@ enum TK {
|
|
TKandand,TKshl,TKshr,TKrcur,TKeq,TKaddass,TKminass,TKmulass,TKdivass,
|
|
TKmodass,TKshrass,TKshlass,TKandass,TKxorass,TKorass,TKsemi,
|
|
TKadd,TKellipsis,
|
|
-#if !TX86 || TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if !TX86 || TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
TKdollar,
|
|
#endif
|
|
|
|
diff --git a/src/backend/ty.h b/src/backend/ty.h
|
|
index 3e826eb..cd6124e 100644
|
|
--- a/src/backend/ty.h
|
|
+++ b/src/backend/ty.h
|
|
@@ -169,7 +169,7 @@ extern int TYptrdiff, TYsize, TYsize_t;
|
|
#define mTYnothrow 0x00200000 // nothrow function
|
|
|
|
#if !MARS
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define mTYnoret 0x01000000 // function has no return
|
|
#define mTYtransu 0x01000000 // transparent union
|
|
#else
|
|
@@ -183,7 +183,7 @@ extern int TYptrdiff, TYsize, TYsize_t;
|
|
#define mTYsyscall 0x40000000
|
|
#define mTYjava 0x80000000
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define mTYTFF 0xFE000000
|
|
#else
|
|
#define mTYTFF 0xFF000000
|
|
@@ -351,7 +351,7 @@ extern const tym_t tytouns[];
|
|
/* Array to give the 'relaxed' type for relaxed type checking */
|
|
extern unsigned char _tyrelax[];
|
|
#define type_relax (config.flags3 & CFG3relax) // !=0 if relaxed type checking
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
#define type_semirelax (config.flags3 & CFG3semirelax) // !=0 if semi-relaxed type checking
|
|
#else
|
|
#define type_semirelax type_relax
|
|
diff --git a/src/backend/util2.c b/src/backend/util2.c
|
|
index 74ee4d0..913ba6e 100644
|
|
--- a/src/backend/util2.c
|
|
+++ b/src/backend/util2.c
|
|
@@ -142,7 +142,7 @@ void util_progress(int linnum)
|
|
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || _MSC_VER
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || _MSC_VER || __HAIKU__
|
|
void util_progress()
|
|
{
|
|
}
|
|
diff --git a/src/backend/var.c b/src/backend/var.c
|
|
index 4bdd1ef..b070079 100644
|
|
--- a/src/backend/var.c
|
|
+++ b/src/backend/var.c
|
|
@@ -61,7 +61,7 @@ int linkage_spec = 0; /* using the default */
|
|
#if MEMMODELS == 1
|
|
tym_t functypetab[LINK_MAXDIM] =
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
TYnfunc,
|
|
TYnpfunc,
|
|
TYnpfunc,
|
|
diff --git a/src/cppmangle.c b/src/cppmangle.c
|
|
index c2c90fc..3f10394 100644
|
|
--- a/src/cppmangle.c
|
|
+++ b/src/cppmangle.c
|
|
@@ -38,7 +38,7 @@
|
|
* so nothing would be compatible anyway.
|
|
*/
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
|
|
/*
|
|
* Follows Itanium C++ ABI 1.86
|
|
diff --git a/src/eh.c b/src/eh.c
|
|
index 783ee57..e758f1a 100644
|
|
--- a/src/eh.c
|
|
+++ b/src/eh.c
|
|
@@ -32,7 +32,7 @@ static char __file__[] = __FILE__; /* for tassert.h */
|
|
/* If we do our own EH tables and stack walking scheme
|
|
* (Otherwise use NT Structured Exception Handling)
|
|
*/
|
|
-#if (TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS)
|
|
+#if (TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU)
|
|
#define OUREH 1
|
|
#elif TARGET_WINDOS
|
|
#define OUREH I64
|
|
diff --git a/src/errors.c b/src/errors.c
|
|
index 428d3f3..04bc931 100644
|
|
--- a/src/errors.c
|
|
+++ b/src/errors.c
|
|
@@ -16,7 +16,7 @@
|
|
#include <io.h>
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <string.h>
|
|
@@ -59,7 +59,7 @@ bool isConsoleColorSupported()
|
|
{
|
|
#if _WIN32
|
|
return _isatty(_fileno(stderr)) != 0;
|
|
-#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
const char *term = getenv("TERM");
|
|
return isatty(STDERR_FILENO) && term && term[0] && 0 != strcmp(term, "dumb");
|
|
#else
|
|
diff --git a/src/globals.c b/src/globals.c
|
|
index 9110227..3f22cf1 100644
|
|
--- a/src/globals.c
|
|
+++ b/src/globals.c
|
|
@@ -27,7 +27,7 @@ void Global::init()
|
|
|
|
#if TARGET_WINDOS
|
|
obj_ext = "obj";
|
|
-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
obj_ext = "o";
|
|
#else
|
|
#error "fix this"
|
|
@@ -35,7 +35,7 @@ void Global::init()
|
|
|
|
#if TARGET_WINDOS
|
|
lib_ext = "lib";
|
|
-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
lib_ext = "a";
|
|
#else
|
|
#error "fix this"
|
|
@@ -43,7 +43,7 @@ void Global::init()
|
|
|
|
#if TARGET_WINDOS
|
|
dll_ext = "dll";
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
dll_ext = "so";
|
|
#elif TARGET_OSX
|
|
dll_ext = "dylib";
|
|
@@ -53,7 +53,7 @@ void Global::init()
|
|
|
|
#if TARGET_WINDOS
|
|
run_noext = false;
|
|
-#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
// Allow 'script' D source files to have no extension.
|
|
run_noext = true;
|
|
#else
|
|
diff --git a/src/glue.c b/src/glue.c
|
|
index 5011be6..26382b9 100644
|
|
--- a/src/glue.c
|
|
+++ b/src/glue.c
|
|
@@ -910,7 +910,7 @@ void FuncDeclaration_toObjFile(FuncDeclaration *fd, bool multiobj)
|
|
// Pull in RTL startup code (but only once)
|
|
if (fd->isMain() && onlyOneMain(fd->loc))
|
|
{
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
objmod->external_def("_main");
|
|
objmod->ehsections(); // initialize exception handling sections
|
|
#endif
|
|
@@ -1314,7 +1314,7 @@ void FuncDeclaration_toObjFile(FuncDeclaration *fd, bool multiobj)
|
|
}
|
|
}
|
|
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
// A hack to get a pointer to this function put in the .dtors segment
|
|
if (fd->ident && memcmp(fd->ident->toChars(), "_STD", 4) == 0)
|
|
objmod->staticdtor(s);
|
|
@@ -1379,7 +1379,7 @@ unsigned totym(Type *tx)
|
|
case Tbool: t = TYbool; break;
|
|
case Tchar: t = TYchar; break;
|
|
case Twchar: t = TYwchar_t; break;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
case Tdchar: t = TYdchar; break;
|
|
#else
|
|
case Tdchar:
|
|
@@ -1462,7 +1462,7 @@ unsigned totym(Type *tx)
|
|
case LINKcpp:
|
|
Lc:
|
|
t = TYnfunc;
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
if (I32 && retStyle(tf) == RETstack)
|
|
t = TYhfunc;
|
|
#endif
|
|
diff --git a/src/inifile.c b/src/inifile.c
|
|
index bcdab2f..5342541 100644
|
|
--- a/src/inifile.c
|
|
+++ b/src/inifile.c
|
|
@@ -81,7 +81,7 @@ const char *findConfFile(const char *argv0, const char *inifile)
|
|
if (FileName::exists(filename))
|
|
return filename;
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
// Search PATH for argv0
|
|
const char *p = getenv("PATH");
|
|
#if LOG
|
|
diff --git a/src/lib.h b/src/lib.h
|
|
index 465fb4e..415c268 100644
|
|
--- a/src/lib.h
|
|
+++ b/src/lib.h
|
|
@@ -28,7 +28,7 @@ class Library
|
|
{
|
|
#if TARGET_WINDOS
|
|
return global.params.is64bit ? LibMSCoff_factory() : LibOMF_factory();
|
|
-#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_LINUX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
return LibElf_factory();
|
|
#elif TARGET_OSX
|
|
return LibMach_factory();
|
|
diff --git a/src/link.c b/src/link.c
|
|
index 272bdb4..8bfda24 100644
|
|
--- a/src/link.c
|
|
+++ b/src/link.c
|
|
@@ -23,7 +23,7 @@
|
|
#endif
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
#include <unistd.h>
|
|
@@ -83,7 +83,7 @@ void writeFilename(OutBuffer *buf, const char *filename)
|
|
writeFilename(buf, filename, strlen(filename));
|
|
}
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
|
|
/*****************************
|
|
* As it forwards the linker error message to stderr, checks for the presence
|
|
@@ -446,7 +446,7 @@ int runLINK()
|
|
}
|
|
return status;
|
|
}
|
|
-#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
pid_t childpid;
|
|
int status;
|
|
|
|
@@ -464,7 +464,7 @@ int runLINK()
|
|
// add the "-dynamiclib" flag
|
|
if (global.params.dll)
|
|
argv.push("-dynamiclib");
|
|
-#elif __linux__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
if (global.params.dll)
|
|
argv.push("-shared");
|
|
#endif
|
|
@@ -648,7 +648,7 @@ int runLINK()
|
|
// argv.push("-ldruntime");
|
|
argv.push("-lpthread");
|
|
argv.push("-lm");
|
|
-#if __linux__
|
|
+#if __linux__ || __HAIKU__
|
|
// Changes in ld for Ubuntu 11.10 require this to appear after phobos2
|
|
argv.push("-lrt");
|
|
#endif
|
|
@@ -871,7 +871,7 @@ int runProgram()
|
|
ex = global.params.exefile;
|
|
// spawnlp returns intptr_t in some systems, not int
|
|
return spawnv(0,ex,argv.tdata());
|
|
-#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
pid_t childpid;
|
|
int status;
|
|
|
|
diff --git a/src/mars.c b/src/mars.c
|
|
index dc17d5c..4587d2d 100644
|
|
--- a/src/mars.c
|
|
+++ b/src/mars.c
|
|
@@ -16,7 +16,7 @@
|
|
#include <limits.h>
|
|
#include <string.h>
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <errno.h>
|
|
#endif
|
|
|
|
@@ -327,7 +327,7 @@ int tryMain(size_t argc, const char *argv[])
|
|
global.params.defaultlibname = "phobos";
|
|
#elif TARGET_LINUX
|
|
global.params.defaultlibname = "libphobos2.a";
|
|
-#elif TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#elif TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
global.params.defaultlibname = "phobos2";
|
|
#else
|
|
#error "fix this"
|
|
@@ -367,6 +367,11 @@ int tryMain(size_t argc, const char *argv[])
|
|
VersionCondition::addPredefinedGlobalIdent("Solaris");
|
|
VersionCondition::addPredefinedGlobalIdent("ELFv1");
|
|
global.params.isSolaris = true;
|
|
+#elif TARGET_HAIKU
|
|
+ VersionCondition::addPredefinedGlobalIdent("Posix");
|
|
+ VersionCondition::addPredefinedGlobalIdent("Haiku");
|
|
+ VersionCondition::addPredefinedGlobalIdent("ELFv1");
|
|
+ global.params.isLinux = true;
|
|
#else
|
|
#error "fix this"
|
|
#endif
|
|
@@ -386,7 +391,7 @@ int tryMain(size_t argc, const char *argv[])
|
|
{
|
|
#if _WIN32
|
|
global.inifilename = findConfFile(argv[0], "sc.ini");
|
|
-#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#elif __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
global.inifilename = findConfFile(argv[0], "dmd.conf");
|
|
#else
|
|
#error "fix this"
|
|
diff --git a/src/msc.c b/src/msc.c
|
|
index efe1ad9..658691f 100644
|
|
--- a/src/msc.c
|
|
+++ b/src/msc.c
|
|
@@ -85,7 +85,7 @@ void backend_init()
|
|
exe = true;
|
|
}
|
|
#endif
|
|
-#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS
|
|
+#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_OPENBSD || TARGET_SOLARIS || TARGET_HAIKU
|
|
exe = params->pic == 0;
|
|
#endif
|
|
|
|
diff --git a/src/osmodel.mak b/src/osmodel.mak
|
|
index a8ac16f..b842e51 100644
|
|
--- a/src/osmodel.mak
|
|
+++ b/src/osmodel.mak
|
|
@@ -20,6 +20,9 @@ ifeq (,$(OS))
|
|
ifeq (SunOS,$(uname_S))
|
|
OS:=solaris
|
|
endif
|
|
+ ifeq (Haiku,$(uname_S))
|
|
+ OS:=haiku
|
|
+ endif
|
|
ifeq (,$(OS))
|
|
$(error Unrecognized or unsupported OS for uname: $(uname_S))
|
|
endif
|
|
@@ -40,7 +43,7 @@ ifeq (,$(MODEL))
|
|
ifneq (,$(findstring $(uname_M),x86_64 amd64))
|
|
MODEL:=64
|
|
endif
|
|
- ifneq (,$(findstring $(uname_M),i386 i586 i686))
|
|
+ ifneq (,$(findstring $(uname_M),i386 i586 i686 BePC))
|
|
MODEL:=32
|
|
endif
|
|
ifeq (,$(MODEL))
|
|
diff --git a/src/root/async.c b/src/root/async.c
|
|
index 5abdebe..6fe2cce 100644
|
|
--- a/src/root/async.c
|
|
+++ b/src/root/async.c
|
|
@@ -119,7 +119,7 @@ unsigned __stdcall startthread(void *p)
|
|
return EXIT_SUCCESS; // if skidding
|
|
}
|
|
|
|
-#elif __linux__ // Posix
|
|
+#elif __linux__ || __HAIKU__ // Posix
|
|
|
|
#include <errno.h>
|
|
#include <pthread.h>
|
|
diff --git a/src/root/man.c b/src/root/man.c
|
|
index c5dbd8e..476cbbd 100644
|
|
--- a/src/root/man.c
|
|
+++ b/src/root/man.c
|
|
@@ -25,7 +25,7 @@ void browse(const char *url)
|
|
|
|
#endif
|
|
|
|
-#if __linux__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
diff --git a/src/root/object.h b/src/root/object.h
|
|
index 2474223..e8c81b7 100644
|
|
--- a/src/root/object.h
|
|
+++ b/src/root/object.h
|
|
@@ -10,7 +10,7 @@
|
|
#ifndef OBJECT_H
|
|
#define OBJECT_H
|
|
|
|
-#define POSIX (__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun)
|
|
+#define POSIX (__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__)
|
|
|
|
#if __DMC__
|
|
#pragma once
|
|
diff --git a/src/root/port.c b/src/root/port.c
|
|
index e62082c..f392fa0 100644
|
|
--- a/src/root/port.c
|
|
+++ b/src/root/port.c
|
|
@@ -579,7 +579,7 @@ longdouble Port::strtold(const char *p, char **endp)
|
|
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __HAIKU__
|
|
|
|
#include <math.h>
|
|
#if __linux__
|
|
@@ -672,6 +672,8 @@ int Port::isNan(double r)
|
|
#endif
|
|
#elif __FreeBSD__ || __OpenBSD__
|
|
return isnan(r);
|
|
+#elif __HAIKU__
|
|
+ return ::__isnan(r);
|
|
#else
|
|
#undef isnan
|
|
return ::isnan(r);
|
|
@@ -688,6 +690,8 @@ int Port::isNan(longdouble r)
|
|
#endif
|
|
#elif __FreeBSD__ || __OpenBSD__
|
|
return isnan(r);
|
|
+#elif __HAIKU__
|
|
+ return ::__isnan(r);
|
|
#else
|
|
#undef isnan
|
|
return ::isnan(r);
|
|
@@ -716,6 +720,8 @@ int Port::isInfinity(double r)
|
|
return fpclassify(r) == FP_INFINITE;
|
|
#elif __FreeBSD__ || __OpenBSD__
|
|
return isinf(r);
|
|
+#elif __HAIKU__
|
|
+ return ::__isinf(r);
|
|
#else
|
|
#undef isinf
|
|
return ::isinf(r);
|
|
diff --git a/src/root/response.c b/src/root/response.c
|
|
index 33d28e9..101147a 100644
|
|
--- a/src/root/response.c
|
|
+++ b/src/root/response.c
|
|
@@ -20,7 +20,7 @@
|
|
#include <io.h>
|
|
#endif
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <fcntl.h>
|
|
diff --git a/src/tk/filespec.c b/src/tk/filespec.c
|
|
index f4376c4..7165b82 100644
|
|
--- a/src/tk/filespec.c
|
|
+++ b/src/tk/filespec.c
|
|
@@ -25,7 +25,7 @@
|
|
#include <ctype.h>
|
|
#endif
|
|
|
|
-#if M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#endif
|
|
@@ -87,7 +87,7 @@ char * filespecaddpath(const char *path,const char *filename)
|
|
/**********************/
|
|
char * filespecrootpath(char *filespec)
|
|
{
|
|
-#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
#define DIRCHAR '/'
|
|
#endif
|
|
#if MSDOS || __OS2__ || __NT__ || _WIN32
|
|
@@ -112,7 +112,7 @@ char * filespecrootpath(char *filespec)
|
|
#endif
|
|
|
|
/* get current working directory path */
|
|
-#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
cwd_t = (char *)getcwd(NULL, 256);
|
|
#endif
|
|
#if MSDOS || __OS2__ || __NT__ || _WIN32
|
|
@@ -134,7 +134,7 @@ char * filespecrootpath(char *filespec)
|
|
if (cwd[strlen(cwd) - 1] == DIRCHAR)
|
|
cwd[strlen(cwd) - 1] = '\0';
|
|
#endif
|
|
-#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
free(cwd_t);
|
|
#endif
|
|
p = filespec;
|
|
@@ -151,7 +151,7 @@ char * filespecrootpath(char *filespec)
|
|
{
|
|
cwd_t = cwd;
|
|
cwd = (char *)mem_calloc(strlen(cwd_t) + 1 + strlen(p) + 1);
|
|
-#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
sprintf(cwd, "%s/%s", cwd_t, p); /* add relative directory */
|
|
#endif
|
|
#if MSDOS || __OS2__ || __NT__ || _WIN32
|
|
@@ -172,7 +172,7 @@ char * filespecrootpath(char *filespec)
|
|
{ /* ... save remaining string */
|
|
cwd_t = cwd;
|
|
cwd = (char *)mem_calloc(strlen(cwd_t) + 1 + strlen(p) + 1);
|
|
-#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if SUN || M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
sprintf(cwd, "%s/%s", cwd_t, p); /* add relative directory */
|
|
#endif
|
|
#if MSDOS || __OS2__ || __NT__ || _WIN32
|
|
@@ -403,7 +403,7 @@ char * filespecbackup(const char *filespec)
|
|
#if MSDOS || __OS2__ || __NT__ || _WIN32
|
|
return filespecforceext(filespec,"BAK");
|
|
#endif
|
|
-#if BSDUNIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if BSDUNIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
char *p,*f;
|
|
|
|
/* Prepend .B to file name, if it isn't already there */
|
|
diff --git a/src/tk/mem.c b/src/tk/mem.c
|
|
index 03c60e4..8083d4a 100644
|
|
--- a/src/tk/mem.c
|
|
+++ b/src/tk/mem.c
|
|
@@ -326,7 +326,7 @@ static struct mem_debug
|
|
11111,
|
|
0,
|
|
BEFOREVAL,
|
|
-#if !(__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun)
|
|
+#if !(__linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__)
|
|
AFTERVAL
|
|
#endif
|
|
};
|
|
@@ -838,7 +838,7 @@ void mem_init()
|
|
mem_numalloc = 0;
|
|
mem_maxalloc = 0;
|
|
mem_alloclist.Mnext = NULL;
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
*(long *) &(mem_alloclist.data[0]) = AFTERVAL;
|
|
#endif
|
|
#endif
|
|
diff --git a/test/runnable/extra-files/cppb.cpp b/test/runnable/extra-files/cppb.cpp
|
|
index da99068..eb4d934 100644
|
|
--- a/test/runnable/extra-files/cppb.cpp
|
|
+++ b/test/runnable/extra-files/cppb.cpp
|
|
@@ -313,12 +313,12 @@ size_t getoffset13161a()
|
|
|
|
/****************************************************/
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __HAIKU__
|
|
#include <memory>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
-#if __linux__
|
|
+#if __linux__ || __HAIKU__
|
|
template struct std::allocator<int>;
|
|
template struct std::vector<int>;
|
|
|
|
@@ -370,7 +370,7 @@ wchar_t f13289_cpp_wchar_t(wchar_t ch)
|
|
}
|
|
}
|
|
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
unsigned short f13289_d_wchar(unsigned short ch);
|
|
wchar_t f13289_d_dchar(wchar_t ch);
|
|
#elif _WIN32
|
|
@@ -380,7 +380,7 @@ unsigned int f13289_d_dchar(unsigned int ch);
|
|
|
|
bool f13289_cpp_test()
|
|
{
|
|
-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun
|
|
+#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__
|
|
if (!(f13289_d_wchar((unsigned short)'c') == (unsigned short)'C')) return false;
|
|
if (!(f13289_d_wchar((unsigned short)'D') == (unsigned short)'D')) return false;
|
|
if (!(f13289_d_dchar(L'e') == L'E')) return false;
|
|
--
|
|
2.2.2
|
|
|
|
|
|
From 6e8ac7ee1fa64b7ad5b7123370d69ae81e2efb43 Mon Sep 17 00:00:00 2001
|
|
From: raefaldhia <raefaldhiamartya@gmail.com>
|
|
Date: Sat, 1 Apr 2017 13:31:23 +0000
|
|
Subject: Add haiku.mak
|
|
|
|
|
|
diff --git a/haiku.mak b/haiku.mak
|
|
new file mode 100644
|
|
index 0000000..ae2df76
|
|
--- /dev/null
|
|
+++ b/haiku.mak
|
|
@@ -0,0 +1,31 @@
|
|
+ECTAGS_LANGS = Make,C,C++,Sh
|
|
+ECTAGS_FILES = src/*.[ch] src/backend/*.[ch] src/root/*.[ch] src/tk/*.[ch]
|
|
+
|
|
+.PHONY: all clean test install
|
|
+
|
|
+all:
|
|
+ $(QUIET)$(MAKE) -C src -f posix.mak SYSCONFDIR=$(DATADIR)/dmd/
|
|
+
|
|
+clean:
|
|
+ $(QUIET)$(MAKE) -C src -f posix.mak clean
|
|
+ $(QUIET)$(MAKE) -C test -f Makefile clean
|
|
+ $(RM) tags
|
|
+
|
|
+test:
|
|
+ $(QUIET)$(MAKE) -C test -f Makefile
|
|
+
|
|
+# Creates Exuberant Ctags tags file
|
|
+tags: posix.mak $(ECTAGS_FILES)
|
|
+ ctags --sort=yes --links=no --excmd=number --languages=$(ECTAGS_LANGS) \
|
|
+ --langmap='C++:+.c,C++:+.h' --extra=+f --file-scope=yes --fields=afikmsSt --totals=yes posix.mak $(ECTAGS_FILES)
|
|
+
|
|
+install: all
|
|
+ mkdir -p $(BINDIR)
|
|
+ cp src/dmd $(BINDIR)/dmd$(ARCH_SUFFIX)
|
|
+ mkdir -p $(MANDIR)/man1/
|
|
+ cp -r docs/man/man1/* $(MANDIR)/man1/
|
|
+ mkdir -p $(DATADIR)/dmd
|
|
+ cp ini/haiku/bin/dmd.conf $(DATADIR)/dmd/dmd.conf
|
|
+ cp src/backendlicense.txt $(DATADIR)/dmd/dmd-backendlicense.txt
|
|
+ cp src/boostlicense.txt $(DATADIR)/dmd/dmd-boostlicense.txt
|
|
+ cp -r samples $(DATADIR)/dmd
|
|
diff --git a/ini/haiku/bin/dmd.conf b/ini/haiku/bin/dmd.conf
|
|
new file mode 100644
|
|
index 0000000..77e55fb
|
|
--- /dev/null
|
|
+++ b/ini/haiku/bin/dmd.conf
|
|
@@ -0,0 +1,2 @@
|
|
+[Environment]
|
|
+DFLAGS=-I%@P%/../../src/phobos -I%@P%/../../src/druntime/import -L-L%@P%/../lib32 -L--export-dynamic
|
|
\ No newline at end of file
|
|
diff --git a/src/e2ir.c b/src/e2ir.c
|
|
index 5c3820e..8cb30a3 100644
|
|
--- a/src/e2ir.c
|
|
+++ b/src/e2ir.c
|
|
@@ -255,7 +255,8 @@ elem *callfunc(Loc loc,
|
|
if ((global.params.isLinux ||
|
|
global.params.isOSX ||
|
|
global.params.isFreeBSD ||
|
|
- global.params.isSolaris) && tf->linkage != LINKd)
|
|
+ global.params.isSolaris ||
|
|
+ global.params.isHaiku) && tf->linkage != LINKd)
|
|
; // ehidden goes last on Linux/OSX C++
|
|
else
|
|
{
|
|
@@ -1750,7 +1751,7 @@ elem *toElem(Expression *e, IRState *irs)
|
|
{
|
|
ts = symbol_genauto(Type_toCtype(t1));
|
|
int rtl;
|
|
- if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris ||
|
|
+ if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris || global.params.isHaiku ||
|
|
I64 && global.params.isWindows)
|
|
rtl = RTLSYM__DINVARIANT;
|
|
else
|
|
diff --git a/src/globals.h b/src/globals.h
|
|
index bb57840..faf8b9c 100644
|
|
--- a/src/globals.h
|
|
+++ b/src/globals.h
|
|
@@ -49,6 +49,7 @@ struct Param
|
|
bool isFreeBSD; // generate code for FreeBSD
|
|
bool isOpenBSD; // generate code for OpenBSD
|
|
bool isSolaris; // generate code for Solaris
|
|
+ bool isHaiku; // generate code for Haiku
|
|
bool mscoff; // for Win32: write COFF object files instead of OMF
|
|
char useDeprecated; // 0: don't allow use of deprecated features
|
|
// 1: silently allow use of deprecated features
|
|
diff --git a/src/glue.c b/src/glue.c
|
|
index 26382b9..d9409ec 100644
|
|
--- a/src/glue.c
|
|
+++ b/src/glue.c
|
|
@@ -1112,7 +1112,7 @@ void FuncDeclaration_toObjFile(FuncDeclaration *fd, bool multiobj)
|
|
pi++;
|
|
}
|
|
|
|
- if ((global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isSolaris) &&
|
|
+ if ((global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isSolaris || global.params.isHaiku) &&
|
|
fd->linkage != LINKd && shidden && sthis)
|
|
{
|
|
/* swap shidden and sthis
|
|
diff --git a/src/mars.c b/src/mars.c
|
|
index 4587d2d..e2bb653 100644
|
|
--- a/src/mars.c
|
|
+++ b/src/mars.c
|
|
@@ -371,7 +371,7 @@ int tryMain(size_t argc, const char *argv[])
|
|
VersionCondition::addPredefinedGlobalIdent("Posix");
|
|
VersionCondition::addPredefinedGlobalIdent("Haiku");
|
|
VersionCondition::addPredefinedGlobalIdent("ELFv1");
|
|
- global.params.isLinux = true;
|
|
+ global.params.isHaiku = true;
|
|
#else
|
|
#error "fix this"
|
|
#endif
|
|
diff --git a/src/target.c b/src/target.c
|
|
index ecb4575..b0c4a04 100644
|
|
--- a/src/target.c
|
|
+++ b/src/target.c
|
|
@@ -33,7 +33,7 @@ void Target::init()
|
|
ptrsize = 8;
|
|
|
|
if (global.params.isLinux || global.params.isFreeBSD
|
|
- || global.params.isOpenBSD || global.params.isSolaris)
|
|
+ || global.params.isOpenBSD || global.params.isSolaris || global.params.isHaiku)
|
|
{
|
|
realsize = 12;
|
|
realpad = 2;
|
|
@@ -60,7 +60,7 @@ void Target::init()
|
|
|
|
if (global.params.is64bit)
|
|
{
|
|
- if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris)
|
|
+ if (global.params.isLinux || global.params.isFreeBSD || global.params.isSolaris || global.params.isHaiku)
|
|
{
|
|
realsize = 16;
|
|
realpad = 6;
|
|
@@ -95,7 +95,7 @@ unsigned Target::alignsize(Type* type)
|
|
|
|
case Tcomplex32:
|
|
if (global.params.isLinux || global.params.isOSX || global.params.isFreeBSD
|
|
- || global.params.isOpenBSD || global.params.isSolaris)
|
|
+ || global.params.isOpenBSD || global.params.isSolaris || global.params.isHaiku)
|
|
return 4;
|
|
break;
|
|
|
|
@@ -105,7 +105,7 @@ unsigned Target::alignsize(Type* type)
|
|
case Timaginary64:
|
|
case Tcomplex64:
|
|
if (global.params.isLinux || global.params.isOSX || global.params.isFreeBSD
|
|
- || global.params.isOpenBSD || global.params.isSolaris)
|
|
+ || global.params.isOpenBSD || global.params.isSolaris || global.params.isHaiku)
|
|
return global.params.is64bit ? 8 : 4;
|
|
break;
|
|
|
|
@@ -165,6 +165,10 @@ unsigned Target::critsecsize()
|
|
// sizeof(pthread_mutex_t) for Solaris.
|
|
return 24;
|
|
}
|
|
+ else if (global.params.isHaiku)
|
|
+ {
|
|
+ return 20;
|
|
+ }
|
|
assert(0);
|
|
return 0;
|
|
}
|
|
@@ -184,7 +188,8 @@ Type *Target::va_listType()
|
|
global.params.isFreeBSD ||
|
|
global.params.isOpenBSD ||
|
|
global.params.isSolaris ||
|
|
- global.params.isOSX)
|
|
+ global.params.isOSX ||
|
|
+ global.params.isHaiku)
|
|
{
|
|
if (global.params.is64bit)
|
|
{
|
|
diff --git a/src/toir.c b/src/toir.c
|
|
index c314102..929940c 100644
|
|
--- a/src/toir.c
|
|
+++ b/src/toir.c
|
|
@@ -934,7 +934,7 @@ L2:
|
|
//printf(" 3 RETstack\n");
|
|
return RETstack;
|
|
}
|
|
- else if ((global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isSolaris) &&
|
|
+ else if ((global.params.isLinux || global.params.isOSX || global.params.isFreeBSD || global.params.isSolaris || global.params.isHaiku) &&
|
|
tf->linkage == LINKc &&
|
|
tns->iscomplex())
|
|
{
|
|
--
|
|
2.2.2
|
|
|