Darwin: Check as for .build_version support and use it if available.

This adds support for the minimum OS version data in assembler files.
At present, we have no mechanism to detect the SDK version in use, and
so that is omitted from build_versions.

We follow the implementation in clang, '.build_version' is only emitted
(where supported) for target macOS versions >= 10.14.  For earlier macOS
we fall back to using a '.macosx_version_min' directive.  This latter is
also emitted when the assembler supports it, but not build_version.

gcc/ChangeLog:

	* config.in: Regenerate.
	* config/darwin.cc (darwin_file_start): Add assembler directives
	for the target OS version, where these are supported by the
	assembler.
	(darwin_override_options): Check for building >= macOS 10.14.
	* configure: Regenerate.
	* configure.ac: Check for assembler support of .build_version
	directives.

Signed-off-by: Iain Sandoe <iain@sandoe.co.uk>
This commit is contained in:
Iain Sandoe 2023-10-17 11:10:27 +01:00
parent dd28f90c95
commit a4184c8a65
4 changed files with 79 additions and 2 deletions

View file

@ -604,6 +604,12 @@
#endif
/* Define if your macOS assembler supports .build_version directives */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_MACOS_BUILD_VERSION
#endif
/* Define if the assembler understands -march=rv*_zifencei. */
#ifndef USED_FOR_TARGET
#undef HAVE_AS_MARCH_ZIFENCEI

View file

@ -3073,7 +3073,35 @@ darwin_asm_output_dwarf_offset (FILE *file, int size, const char * lab,
void
darwin_file_start (void)
{
/* Nothing to do. */
#ifdef HAVE_AS_MMACOSX_VERSION_MIN_OPTION
/* This should not happen with a well-formed command line, but the user could
invoke cc1* directly without it. */
if (!darwin_macosx_version_min)
return;
/* This assumes that the version passed has been validated in the driver. */
unsigned maj, min, tiny;
int count = sscanf (darwin_macosx_version_min, "%u.%u.%u", &maj, &min, &tiny);
if (count < 0)
return;
if (count < 3)
tiny = 0;
if (count < 2)
min = 0;
const char *directive;
#ifdef HAVE_AS_MACOS_BUILD_VERSION
/* We only handle macos, so far. */
if (generating_for_darwin_version >= 18)
directive = "build_version macos, ";
else
#endif
directive = "macosx_version_min ";
if (count > 2 && tiny != 0)
fprintf (asm_out_file, "\t.%s %u, %u, %u\n", directive, maj, min, tiny);
else if (count > 1)
fprintf (asm_out_file, "\t.%s %u, %u\n", directive, maj, min);
else
fprintf (asm_out_file, "\t.%s %u, 0\n", directive, maj);
#endif
}
/* Called for the TARGET_ASM_FILE_END hook.
@ -3295,7 +3323,9 @@ darwin_override_options (void)
/* Keep track of which (major) version we're generating code for. */
if (darwin_macosx_version_min)
{
if (strverscmp (darwin_macosx_version_min, "10.7") >= 0)
if (strverscmp (darwin_macosx_version_min, "10.14") >= 0)
generating_for_darwin_version = 18;
else if (strverscmp (darwin_macosx_version_min, "10.7") >= 0)
generating_for_darwin_version = 11;
else if (strverscmp (darwin_macosx_version_min, "10.6") >= 0)
generating_for_darwin_version = 10;

33
gcc/configure vendored
View file

@ -26361,6 +26361,39 @@ $as_echo "#define HAVE_AS_MMACOSX_VERSION_MIN_OPTION 1" >>confdefs.h
fi
if test x$gcc_cv_as_mmacosx_version_min = "xyes"; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler for .build_version" >&5
$as_echo_n "checking assembler for .build_version... " >&6; }
if ${gcc_cv_as_darwin_build_version+:} false; then :
$as_echo_n "(cached) " >&6
else
gcc_cv_as_darwin_build_version=no
if test x$gcc_cv_as != x; then
$as_echo ' .build_version macos, 10, 14 sdk_version 10, 14' > conftest.s
if { ac_try='$gcc_cv_as $gcc_cv_as_flags -mmacosx-version-min=10.14 -o conftest.o conftest.s >&5'
{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
(eval $ac_try) 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; }
then
gcc_cv_as_darwin_build_version=yes
else
echo "configure: failed program was" >&5
cat conftest.s >&5
fi
rm -f conftest.o conftest.s
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_darwin_build_version" >&5
$as_echo "$gcc_cv_as_darwin_build_version" >&6; }
if test $gcc_cv_as_darwin_build_version = yes; then
$as_echo "#define HAVE_AS_MACOS_BUILD_VERSION 1" >>confdefs.h
fi
fi
;;
esac

View file

@ -4374,6 +4374,14 @@ case "$target_os" in
[-mmacosx-version-min=10.1], [.text],,
[AC_DEFINE(HAVE_AS_MMACOSX_VERSION_MIN_OPTION, 1,
[Define if your macOS assembler supports the -mmacos-version-min option.])])
if test x$gcc_cv_as_mmacosx_version_min = "xyes"; then
gcc_GAS_CHECK_FEATURE([.build_version],
gcc_cv_as_darwin_build_version,
[-mmacosx-version-min=10.14],
[ .build_version macos, 10, 14 sdk_version 10, 14],,
[AC_DEFINE(HAVE_AS_MACOS_BUILD_VERSION, 1,
[Define if your macOS assembler supports .build_version directives])])
fi
;;
esac