0
0
Fork 0
haikuports/dev-lang/dmd/patches/dmd-2.067.1.patchset

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