diff --git a/dev-lang/dmd/dmd-2.067.1.recipe b/dev-lang/dmd/dmd-2.067.1.recipe new file mode 100644 index 000000000..876955dd7 --- /dev/null +++ b/dev-lang/dmd/dmd-2.067.1.recipe @@ -0,0 +1,72 @@ +SUMMARY="Systems programming language with C-like syntax & static typing" +DESCRIPTION="The D programming language was started by Walter Bright, as a \ +'better C++' and has grown slowly, but steadily, for more than 15 years. Recent \ +improvements to the D development process have accelerated development of the \ +language and shown the need for a governing organization that overlooks and \ +arranges the future development of the D programming language." +HOMEPAGE="https://dlang.org/" +COPYRIGHT="1999-2014 Digital Mars" +LICENSE="Digital Mars" +REVISION="1" +SOURCE_URI="https://github.com/dlang/dmd/archive/v$portVersion.tar.gz" +CHECKSUM_SHA256="526860456d181bb39ebdb7fb2bbb13e3afe62ec07c588eb5a5e8b8b61627ed8f" +PATCHES="dmd-$portVersion.patchset" + +ARCHITECTURES="x86 x86_64" +SECONDARY_ARCHITECTURES="?x86" + +PROVIDES=" + dmd$secondaryArchSuffix = $portVersion + cmd:dmd$secondaryArchSuffix = $portVersion + " +REQUIRES=" + haiku$secondaryArchSuffix + dmd_data == $portVersion + " + +if [ -z "$secondaryArchSuffix" ]; then + SUMMARY_data="Standard resource files for dmd" + ARCHITECTURES_data="any" + PROVIDES_data=" + dmd_data = $portVersion + " + REQUIRES_data="" +fi + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + " +BUILD_PREREQUIRES=" + cmd:gcc$secondaryArchSuffix + cmd:curl + cmd:git + cmd:make + cmd:which + " + +BUILD() +{ + make $jobArgs -f haiku.mak \ + DATADIR=$dataDir/dlang +} + +INSTALL() +{ + make $jobArgs -f haiku.mak install \ + ARCH_SUFFIX=$secondaryArchSuffix \ + BINDIR=$binDir \ + DATADIR=$dataDir/dlang \ + MANDIR=$manDir + + if [ -z "$secondaryArchSuffix" ]; then + packageEntries data \ + $dataDir/dlang + else + rm -rf $dataDir/dlang $manDir + fi +} + +TEST() +{ + make $jobArgs -f haiku.mak test +} diff --git a/dev-lang/dmd/licenses/Digital Mars b/dev-lang/dmd/licenses/Digital Mars new file mode 100644 index 000000000..580c840ba --- /dev/null +++ b/dev-lang/dmd/licenses/Digital Mars @@ -0,0 +1,46 @@ + +The Software is not generally available software. It has not undergone +testing and may contain errors. The Software was not designed to operate +after December 31, 1999. It may be incomplete and it may not function +properly. No support or maintenance is provided with this Software. Do +not install or distribute the Software if +you are not accustomed to using or distributing experimental software. +Do not use this software for life critical applications, or applications +that could cause significant harm or property damage. + +Digital Mars licenses the Software to you on an "AS IS" basis, without +warranty of any kind. DIGITAL MARS AND SYMANTEC HEREBY EXPRESSLY DISCLAIM +ALL WARRANTIES AND CONDITIONS, EITHER EXPRESS OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OR CONDITIONS OF MERCHANTABILITY, +NONINFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. You are solely +responsible for determining the appropriateness of using this Software and +assume all risks associated with the use of this Software, including but not +limited to the risks of program errors, damage +to or loss of data, programs or equipment, unavailability or interruption of +operations and third party claims. You agree to defend, indemnify and hold +Digital Mars and Symantec, its subsidiaries, affiliates, directors, officers, +employees and agents harmless from all claims or demands made against them +(and any related losses, damages, expenses +and costs) arising out of your use of the Software. DIGITAL MARS AND SYMANTEC +WILL NOT BE LIABLE FOR ANY DIRECT DAMAGES OR FOR ANY SPECIAL, INCIDENTAL, OR +INDIRECT DAMAGES OR FOR ANY ECONOMIC CONSEQUENTIAL DAMAGES (INCLUDING +LOST PROFITS OR SAVINGS), EVEN IF DIGITAL MARS OR SYMANTEC HAS BEEN ADVISED +OF THE POSSIBILITY OF SUCH DAMAGES. +Digital Mars and Symantec will not be liable for the loss of, or damage to, +your records or data, the records or +data of any third party, or any damages claimed by you based on a third party +claim. + +If you send any messages to Digital Mars, on either the Digital Mars +newsgroups, the Digital Mars mailing list, or via email, you agree not +to make any claims of intellectual +property rights over the contents of those messages. + +The Software is copyrighted and comes with a single user license, +and may not be redistributed. If you wish to obtain a redistribution license, +please contact Digital Mars. + +-------------------------------------------- +Photo credits: Courtesy of NASA/JPL/Caltech +-------------------------------------------- + diff --git a/dev-lang/dmd/patches/dmd-2.067.1.patchset b/dev-lang/dmd/patches/dmd-2.067.1.patchset new file mode 100644 index 000000000..3d249608d --- /dev/null +++ b/dev-lang/dmd/patches/dmd-2.067.1.patchset @@ -0,0 +1,1796 @@ +From f40ecb6165036088fb75e1f51066c3e9e289f26d Mon Sep 17 00:00:00 2001 +From: raefaldhia +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 + #include + +-#if _WIN32 || __linux__ ++#if _WIN32 || __linux__ || __HAIKU__ + #include + #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 + #include + +-#if __DMC__ || __linux__ ++#if __DMC__ || __linux__ || __HAIKU__ + #include + #endif + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #include +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 + #include + +-#if _WIN32 || __linux__ ++#if _WIN32 || __linux__ || __HAIKU__ + #include + #endif + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #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 + #include + +-#if _WIN32 || __linux__ ++#if _WIN32 || __linux__ || __HAIKU__ + #include + #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 + #endif + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #include +@@ -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 + #include + #endif +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #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 + #endif + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #include +@@ -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 + #include + #include +@@ -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 + #include + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #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 + #include +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 + #include +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 + #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 + #endif + +-#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #include +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 + #endif + +-#if M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun ++#if M_UNIX || M_XENIX || __linux__ || __APPLE__ || __FreeBSD__ || __OpenBSD__ || __sun || __HAIKU__ + #include + #include + #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 + #include + #include + +-#if __linux__ ++#if __linux__ || __HAIKU__ + template struct std::allocator; + template struct std::vector; + +@@ -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 +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 + diff --git a/dev-lang/dmd/patches/dmd-2.073.2.patchset b/dev-lang/dmd/patches/dmd-2.073.2.patchset new file mode 100644 index 000000000..99aaeeb2b --- /dev/null +++ b/dev-lang/dmd/patches/dmd-2.073.2.patchset @@ -0,0 +1,39 @@ +From 7623d74664b644fb58c692a306d692e601e59900 Mon Sep 17 00:00:00 2001 +From: raefaldhia +Date: Fri, 31 Mar 2017 23:27:45 +0000 +Subject: a + + +diff --git a/src/osmodel.mak b/src/osmodel.mak +index f56716a..4e95132 100644 +--- a/src/osmodel.mak ++++ b/src/osmodel.mak +@@ -21,6 +21,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 +@@ -38,10 +41,14 @@ ifeq (,$(MODEL)) + else + uname_M:=$(shell uname -m) + endif ++ ifeq ($(OS),haiku) ++ OS:=linux ++ uname_M:=$(shell uname -p) ++ endif + ifneq (,$(findstring $(uname_M),x86_64 amd64)) + MODEL:=64 + endif +- ifneq (,$(findstring $(uname_M),i386 i586 i686)) ++ ifneq (,$(findstring $(uname_M),x86 i386 i586 i686)) + MODEL:=32 + endif + ifeq (,$(MODEL)) +-- +2.2.2 +