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