Commit 37341412 by Iain Sandoe Committed by Iain Sandoe

Improve handling of -arch flag for Darwin

gcc/
	* config/darwin-driver.c (darwin_driver_init): Handle '-arch' for
	PPC, detect conflicts between -arch and multilib settings.  Detect
	and warn about conflicts between multiple -arch definitions.

From-SVN: r228941
parent 38217d3e
2015-10-18 Iain Sandoe <iain@codesourcery.com> 2015-10-18 Iain Sandoe <iain@codesourcery.com>
* config/darwin-driver.h: Adjust includes to add diagnostic-core. * config/darwin-driver.c (darwin_driver_init): Handle '-arch' for
PPC, detect conflicts between -arch and multilib settings. Detect
and warn about conflicts between multiple -arch definitions.
2015-10-18 Iain Sandoe <iain@codesourcery.com>
* config/darwin-driver.c: Adjust includes to add diagnostic-core.
2015-10-16 Trevor Saunders <tbsaunde+gcc@tbsaunde.org> 2015-10-16 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
...@@ -179,21 +179,55 @@ darwin_driver_init (unsigned int *decoded_options_count, ...@@ -179,21 +179,55 @@ darwin_driver_init (unsigned int *decoded_options_count,
struct cl_decoded_option **decoded_options) struct cl_decoded_option **decoded_options)
{ {
unsigned int i; unsigned int i;
bool seenX86 = false;
bool seenX86_64 = false;
bool seenPPC = false;
bool seenPPC64 = false;
bool seenM32 = false;
bool seenM64 = false;
bool appendM32 = false;
bool appendM64 = false;
for (i = 1; i < *decoded_options_count; i++) for (i = 1; i < *decoded_options_count; i++)
{ {
if ((*decoded_options)[i].errors & CL_ERR_MISSING_ARG) if ((*decoded_options)[i].errors & CL_ERR_MISSING_ARG)
continue; continue;
switch ((*decoded_options)[i].opt_index) switch ((*decoded_options)[i].opt_index)
{ {
#if DARWIN_X86
case OPT_arch: case OPT_arch:
/* Support provision of a single -arch xxxx flag as a means of
specifying the sub-target/multi-lib. Translate this into -m32/64
as appropriate. */
if (!strcmp ((*decoded_options)[i].arg, "i386")) if (!strcmp ((*decoded_options)[i].arg, "i386"))
generate_option (OPT_m32, NULL, 1, CL_DRIVER, &(*decoded_options)[i]); seenX86 = true;
else if (!strcmp ((*decoded_options)[i].arg, "x86_64")) else if (!strcmp ((*decoded_options)[i].arg, "x86_64"))
generate_option (OPT_m64, NULL, 1, CL_DRIVER, &(*decoded_options)[i]); seenX86_64 = true;
else if (!strcmp ((*decoded_options)[i].arg, "ppc"))
seenPPC = true;
else if (!strcmp ((*decoded_options)[i].arg, "ppc64"))
seenPPC64 = true;
else
error ("this compiler does not support %s",
(*decoded_options)[i].arg);
/* Now we've examined it, drop the -arch arg. */
if (*decoded_options_count > i) {
memmove (*decoded_options + i,
*decoded_options + i + 1,
((*decoded_options_count - i)
* sizeof (struct cl_decoded_option)));
}
--i;
--*decoded_options_count;
break;
case OPT_m32:
seenM32 = true;
break;
case OPT_m64:
seenM64 = true;
break; break;
#endif
case OPT_filelist: case OPT_filelist:
case OPT_framework: case OPT_framework:
...@@ -218,4 +252,60 @@ darwin_driver_init (unsigned int *decoded_options_count, ...@@ -218,4 +252,60 @@ darwin_driver_init (unsigned int *decoded_options_count,
} }
darwin_default_min_version (decoded_options_count, decoded_options); darwin_default_min_version (decoded_options_count, decoded_options);
/* Turn -arch xxxx into the appropriate -m32/-m64 flag.
If the User tried to specify multiple arch flags (which is possible with
some Darwin compilers) warn that this mode is not supported by this
compiler (and ignore the arch flags, which means that the default multi-
lib will be generated). */
/* TODO: determine if these warnings would better be errors. */
#if DARWIN_X86
if (seenPPC || seenPPC64)
warning (0, "this compiler does not support PowerPC (arch flags ignored)");
if (seenX86)
{
if (seenX86_64 || seenM64)
warning (0, "%s conflicts with i386 (arch flags ignored)",
(seenX86_64? "x86_64": "m64"));
else if (! seenM32) /* Add -m32 if the User didn't. */
appendM32 = true;
}
else if (seenX86_64)
{
if (seenX86 || seenM32)
warning (0, "%s conflicts with x86_64 (arch flags ignored)",
(seenX86? "i386": "m32"));
else if (! seenM64) /* Add -m64 if the User didn't. */
appendM64 = true;
}
#elif DARWIN_PPC
if (seenX86 || seenX86_64)
warning (0, "this compiler does not support X86 (arch flags ignored)");
if (seenPPC)
{
if (seenPPC64 || seenM64)
warning (0, "%s conflicts with ppc (arch flags ignored)",
(seenPPC64? "ppc64": "m64"));
else if (! seenM32) /* Add -m32 if the User didn't. */
appendM32 = true;
}
else if (seenPPC64)
{
if (seenPPC || seenM32)
warning (0, "%s conflicts with ppc64 (arch flags ignored)",
(seenPPC? "ppc": "m32"));
else if (! seenM64) /* Add -m64 if the User didn't. */
appendM64 = true;
}
#endif
if (appendM32 || appendM64)
{
++*decoded_options_count;
*decoded_options = XRESIZEVEC (struct cl_decoded_option,
*decoded_options,
*decoded_options_count);
generate_option (appendM32 ? OPT_m32 : OPT_m64, NULL, 1, CL_DRIVER,
&(*decoded_options)[*decoded_options_count - 1]);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment