From 49ba7f066faa6e73e8f09e2e7ed6a077f6ba0258 Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 19 Mar 2026 19:25:41 +0100 Subject: preeliminary support for openBSD --- configure | 18 ++++++++++++------ src/a_main.c | 6 +++++- src/a_targ.c | 17 +++++++++++------ src/antcc.h | 2 +- src/c_lex.c | 19 +++++++++++++++++-- 5 files changed, 46 insertions(+), 16 deletions(-) diff --git a/configure b/configure index 1f72ecd..54199fc 100755 --- a/configure +++ b/configure @@ -46,6 +46,7 @@ test -n "$host" || die "cannot determine host" host_arch= host_os= host_abi= +host_predefs= echo "host: $host" case "$host" in @@ -57,7 +58,14 @@ arm64-*) host_arch=aarch64 ;; esac case "$host" in -*-linux-*) host_os=linux ;; +*-linux-*) + host_os=linux ;; +*-openbsd*) + host_os=openbsd + host_predefs=' + "_ANSI_LIBRARY", /* works around __only_inline functions in libc headers */ + ' + ;; *) host_os=unknown ;; esac @@ -106,17 +114,15 @@ echo using abi: "$host_abi" echo host include paths: "$host_include_dirs" echo "/** GENERATED WITH $0 $@ **/ -#ifndef HOSTCONFIG_H_ -#define HOSTCONFIG_H_ - #define HOST_TRIPLE \"$host\" #define HOST_ARCH IS$host_arch #define HOST_OS OS$host_os #define HOST_ABI ABI$host_abi #define HOST_INCLUDE_DIRS $host_include_dirs #define HOST_CC \"$CC\" - -#endif // HOSTCONFIG_H_" > src/hostconfig.h +static const char *const host_predefs[] = {$host_predefs 0 +}; +" > src/hostconfig.h echo "# GENERATED WITH $0 $@ PREFIX = $prefix diff --git a/src/a_main.c b/src/a_main.c index 3db1f84..6c313a7 100644 --- a/src/a_main.c +++ b/src/a_main.c @@ -120,6 +120,8 @@ static Task task = { .inf = VINIT(infilebuf, countof(infilebuf)) }; static void prihelp(void); +void cpppredef(bool undef, const char *cmd); + static void optparse(char **args) { @@ -229,7 +231,6 @@ optparse(char **args) else if (o == '0') ccopt.o = OPT0; else goto Bad; } else if (*arg == 'D' || *arg == 'U') { - void cpppredef(bool undef, const char *cmd); const char *def = arg[1] ? arg+1 : *++args; if (!def) fatal(NULL, "macro name missing after `-%c`", *arg); cpppredef(*arg == 'U', def); @@ -706,6 +707,9 @@ main(int argc, char **argv) if (!target.arch) fatal(NULL, "unsupported target: %s", task.targ ? task.targ : HOST_TRIPLE); + for (const char *const *p = host_predefs; *p; ++p) + cpppredef(0, *p); + return driver(); } diff --git a/src/a_targ.c b/src/a_targ.c index f094f60..fab23e9 100644 --- a/src/a_targ.c +++ b/src/a_targ.c @@ -46,18 +46,23 @@ parsetriple(TargTriple *trg, const char *str) if (matchstr(&str, "unknown-") || matchstr(&str, "pc-")) {} - if (matchstr(&str, "linux-")) { - trg->os = OSlinux; - } else if (matchstr(&str, "linux$")) { + if (matchstr(&str, "linux$")) { trg->os = OSlinux; trg->abi = ABIgnu; + return 1; + } else if (matchstr(&str, "linux")) { + trg->os = OSlinux; + } else if (matchstr(&str, "openbsd")) { + trg->os = OSopenbsd; } else return 0; - if (matchstr(&str, "gnu")) { + if (trg->os == OSlinux && matchstr(&str, "-gnu")) { trg->abi = ABIgnu; - } else if (matchstr(&str, "musl")) { + } else if (trg->os == OSlinux && matchstr(&str, "-musl")) { trg->abi = ABImusl; - } else return 0; + } else if (matchstr(&str, "-")) { + return 0; + } return 1; } diff --git a/src/antcc.h b/src/antcc.h index 4cd8f5d..2078cfc 100644 --- a/src/antcc.h +++ b/src/antcc.h @@ -150,7 +150,7 @@ extern CInclPath *cinclpaths[5]; typedef struct TargTriple { enum mcarch { ISxxx, ISx86_64, ISaarch64 } arch; - enum mcos { OSunknown, OSlinux } os; + enum mcos { OSunknown, OSlinux, OSopenbsd } os; enum mcabi { ABInone, ABIgnu, ABImusl } abi; } TargTriple; extern TargTriple target; diff --git a/src/c_lex.c b/src/c_lex.c index d1c0205..43e4b18 100644 --- a/src/c_lex.c +++ b/src/c_lex.c @@ -2374,9 +2374,10 @@ addpredefmacros(Arena **tmparena) cpredefs[] = "__antcc__\0__STDC__\0__STDC_NO_ATOMICS__\0__STDC_NO_COMPLEX__\0__STDC_NO_THREADS__\0__STDC_NO_VLA__\0", *ospredefs[] = { - [OSlinux] = "__linux\0__linux__\0linux\0unix\0__unix\0__unix__\0" + [OSlinux] = "__linux\0__linux__\0linux\0unix\0__unix\0__unix__\0", + [OSopenbsd] = "__OpenBSD__\0unix\0__unix\0__unix__\0" }, *archpredefs[] = { - [ISx86_64] = "__x86_64__\0__x86_64\0", + [ISx86_64] = "__x86_64__\0__x86_64\0__amd64__\0__amd64\0", [ISaarch64] = "__aarch64__\0__aarch64\0", }, cstdver[][8] = { [STDC89] = "199409L", @@ -2394,6 +2395,20 @@ addpredefmacros(Arena **tmparena) if (target.os != OSunknown) putdef1("__STDC_HOSTED__"); putdefs1(ospredefs[target.os]); putdefs1(archpredefs[target.arch]); + if (ccopt.pie) { + putdef1("__pie__"), putdef1("__PIE__"); + } + if (ccopt.pic) { + putdef1("__pic__"), putdef1("__PIC__"); + } + if (targ_primsizes[TYPTR] == 4) { + putdef1("_ILP32"), putdef1("__ILP32__"); + } else if (targ_primsizes[TYLONG] == 4) { + putdef1("_LLP64"), putdef1("__LLP64__"); + } else { + assert(targ_primsizes[TYINT] == 4); + putdef1("_LP64"), putdef1("__LP64__"); + } if (ppcmdline.n) { MemFile *f; -- cgit v1.2.3