From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1698) id 4694038438A4; Sun, 13 Dec 2020 17:43:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4694038438A4 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Iain D Sandoe To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/users/iains/heads/d-for-darwin)] darwin: Implement osxVersionMin for getTargetInfo X-Act-Checkin: gcc X-Git-Author: Iain Buclaw X-Git-Refname: refs/users/iains/heads/d-for-darwin X-Git-Oldrev: 4d952061d58d4cc69f1383b5c6159f07325893c8 X-Git-Newrev: 1f5441578341a62611f3136225038f5a3a143119 Message-Id: <20201213174318.4694038438A4@sourceware.org> Date: Sun, 13 Dec 2020 17:43:18 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 13 Dec 2020 17:43:18 -0000 https://gcc.gnu.org/g:1f5441578341a62611f3136225038f5a3a143119 commit 1f5441578341a62611f3136225038f5a3a143119 Author: Iain Buclaw Date: Sat Dec 5 00:08:04 2020 +0100 darwin: Implement osxVersionMin for getTargetInfo Diff: --- gcc/config/darwin-d.c | 54 ++++++++++++++++++++++++++++ libphobos/libdruntime/core/sys/posix/stdio.d | 7 ++-- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/gcc/config/darwin-d.c b/gcc/config/darwin-d.c index 7b8c72efe27..9ebc90fd1ca 100644 --- a/gcc/config/darwin-d.c +++ b/gcc/config/darwin-d.c @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see #include "tm_d.h" #include "d/d-target.h" #include "d/d-target-def.h" +#include "diagnostic.h" /* Implement TARGET_D_OS_VERSIONS for Darwin targets. */ @@ -42,6 +43,58 @@ darwin_d_handle_target_object_format (void) return build_string_literal (strlen (objfmt) + 1, objfmt); } +/* Given an OS X version VERSION_STR, return it as a six digit integer. */ + +static unsigned long +parse_version (const char *version_str) +{ + const size_t version_len = strlen (version_str); + if (version_len < 1) + return 0; + + /* Version string must consist of digits and periods only. */ + if (strspn (version_str, "0123456789.") != version_len) + return 0; + + if (!ISDIGIT (version_str[0]) || !ISDIGIT (version_str[version_len - 1])) + return 0; + + char *endptr; + unsigned long major = strtoul (version_str, &endptr, 10); + version_str = endptr + ((*endptr == '.') ? 1 : 0); + + /* Version string must not contain adjacent periods. */ + if (*version_str == '.') + return 0; + + unsigned long minor = strtoul (version_str, &endptr, 10); + version_str = endptr + ((*endptr == '.') ? 1 : 0); + + unsigned long tiny = strtoul (version_str, &endptr, 10); + + /* Version string must contain no more than three tokens. */ + if (*endptr != '\0') + return 0; + + return (major * 10000) + (minor * 100) + tiny; +} + +/* Handle a call to `__traits(getTargetInfo, "osxVersionMin")'. */ + +static tree +darwin_d_handle_target_version_min (void) +{ + const unsigned long version = parse_version (darwin_macosx_version_min); + + if (version == 0) + { + error ("unknown value %qs of %<-mmacosx-version-min%>", + darwin_macosx_version_min); + } + + return build_int_cst_type (integer_type_node, version); +} + /* Implement TARGET_D_REGISTER_OS_TARGET_INFO for Darwin targets. */ static void @@ -49,6 +102,7 @@ darwin_d_register_target_info (void) { const struct d_target_info_spec handlers[] = { { "objectFormat", darwin_d_handle_target_object_format }, + { "osxVersionMin", darwin_d_handle_target_version_min }, { NULL, NULL }, }; diff --git a/libphobos/libdruntime/core/sys/posix/stdio.d b/libphobos/libdruntime/core/sys/posix/stdio.d index a47aec525e8..0b3f8436254 100644 --- a/libphobos/libdruntime/core/sys/posix/stdio.d +++ b/libphobos/libdruntime/core/sys/posix/stdio.d @@ -377,8 +377,11 @@ else version (Darwin) int fseeko(FILE*, off_t, int); off_t ftello(FILE*); - ssize_t getdelim(char**, size_t*, int, FILE*); - ssize_t getline(char**, size_t*, FILE*); + static if (__traits(getTargetInfo, "osxVersionMin") >= 100700) + { + ssize_t getdelim(char**, size_t*, int, FILE*); + ssize_t getline(char**, size_t*, FILE*); + } } else version (FreeBSD) {