View | Details | Return to bug 63810 | Differences between
and this patch

Collapse All | Expand All

(-)a/gcc/config/darwin-c.c (-26 / +151 lines)
Lines 590-631 find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp) Link Here
590
  return 0;
590
  return 0;
591
}
591
}
592
592
593
/* Return the value of darwin_macosx_version_min suitable for the
593
/*  Given a version string, return the version as a statically-allocated
594
   __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro, so '10.4.2'
594
    array of three non-negative integers.  If the version string is
595
   becomes 1040 and '10.10.0' becomes 101000.  The lowest digit is
595
    invalid, return null.
596
   always zero, as is the second lowest for '10.10.x' and above.
596
597
   Print a warning if the version number can't be understood.  */
597
    Version strings must consist of one, two, or three tokens, each
598
    separated by a single period.  Each token must contain only the
599
    characters '0' through '9' and is converted to an equivalent
600
    integer.  Omitted tokens are treated as zeros.  For example:
601
602
        "10"              becomes   {10,0,0}
603
        "10.10"           becomes   {10,10,0}
604
        "10.10.1"         becomes   {10,10,1}
605
        "10.000010.1"     becomes   {10,10,1}
606
        "10.010.001"      becomes   {10,10,1}
607
        "000010.10.00001" becomes   {10,10,1}  */
608
609
enum version_components { MAJOR, MINOR, TINY };
610
611
static const unsigned long *
612
parse_version (const char *version_str)
613
{
614
  size_t version_len;
615
  char *end;
616
  static unsigned long version_array[3];
617
618
  if (! version_str)
619
    return NULL;
620
621
  version_len = strlen (version_str);
622
  if (version_len < 1)
623
    return NULL;
624
625
  /* Version string must consist of digits and periods only.  */
626
  if (strspn (version_str, "0123456789.") != version_len)
627
    return NULL;
628
629
  if (! ISDIGIT (version_str[0]) || ! ISDIGIT (version_str[version_len - 1]))
630
    return NULL;
631
632
  version_array[MAJOR] = strtoul (version_str, &end, 10);
633
  version_str = end + ((*end == '.') ? 1 : 0);
634
635
  /* Version string must not contain adjacent periods.  */
636
  if (*version_str == '.')
637
    return NULL;
638
639
  version_array[MINOR] = strtoul (version_str, &end, 10);
640
  version_str = end + ((*end == '.') ? 1 : 0);
641
642
  version_array[TINY] = strtoul (version_str, &end, 10);
643
644
  /* Version string must contain no more than three tokens.  */
645
  if (*end != '\0')
646
    return NULL;
647
648
  return version_array;
649
}
650
651
/*  Given a three-component version represented as an array of
652
    non-negative integers, return a statically-allocated string suitable
653
    for the legacy __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.
654
    If the version is invalid and cannot be coerced into a valid form,
655
    return null.
656
657
    The legacy format is a four-character string -- two chars for the
658
    major number and one each for the minor and tiny numbers.  Major
659
    numbers are zero-padded if necessary.  Minor and tiny numbers from
660
    10 through 99 are permitted but are clamped to 9 (for example,
661
    {10,9,10} produces "1099").  Versions containing numbers greater
662
    than 99 are rejected.  */
663
598
static const char *
664
static const char *
599
version_as_macro (void)
665
version_as_legacy_macro (const unsigned long *version)
600
{
666
{
601
  static char result[7] = "1000";
667
  unsigned long major = version[MAJOR];
602
  int minorDigitIdx;
668
  unsigned long minor = version[MINOR];
669
  unsigned long tiny = version[TINY];
670
  static char result[sizeof "9999"];
603
671
604
  if (strncmp (darwin_macosx_version_min, "10.", 3) != 0)
672
  if (major > 99 || minor > 99 || tiny > 99)
673
    return NULL;
674
675
  minor = ((minor > 9) ? 9 : minor);
676
  tiny = ((tiny > 9) ? 9 : tiny);
677
678
  /* NOTE: Cast result of sizeof so that result of sprintf is not
679
     converted to an unsigned type.  */
680
  if (sprintf (result, "%02lu%lu%lu", major, minor, tiny)
681
      != (int) sizeof "9999" - 1)
682
    return NULL;
683
684
  return result;
685
}
686
687
/*  Given a three-component version represented as an array of
688
    non-negative integers, return a statically-allocated string suitable
689
    for the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro
690
    or the __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ macro.  If the
691
    version is invalid, return null.
692
693
    The modern format is a five- or six-character string -- one or two
694
    chars for the major number and two each for the minor and tiny
695
    numbers, which are zero-padded if necessary (for example, {8,1,0}
696
    produces "80100", and {10,10,1} produces "101001").  Versions
697
    containing numbers greater than 99 are rejected.  */
698
699
static const char *
700
version_as_modern_macro (const unsigned long *version)
701
{
702
  unsigned long major = version[MAJOR];
703
  unsigned long minor = version[MINOR];
704
  unsigned long tiny = version[TINY];
705
  static char result[sizeof "999999"];
706
707
  if (major > 99 || minor > 99 || tiny > 99)
708
    return NULL;
709
710
  /* NOTE: 'sizeof "foo"' returns size of char array, but
711
     'sizeof ((x > y) ? "foo" : "bar")' returns size of char pointer.  */
712
  /* NOTE: Cast result of sizeof so that result of sprintf is not
713
     converted to an unsigned type.  */
714
  if (sprintf (result, "%lu%02lu%02lu", major, minor, tiny)
715
      != (int) ((major > 9) ? sizeof "999999" : sizeof "99999") - 1)
716
    return NULL;
717
718
  return result;
719
}
720
721
/*  Return the value of darwin_macosx_version_min, suitably formatted
722
    for the __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  (For
723
    example, "10.9" produces "1090", and "10.10.1" produces "101001".)
724
    If its value is invalid and cannot be coerced into a valid form,
725
    print a warning and return "1000".  */
726
727
static const char *
728
macosx_version_as_macro (void)
729
{
730
  const unsigned long *version_array;
731
  const char *version_macro;
732
733
  version_array = parse_version (darwin_macosx_version_min);
734
  if (! version_array)
605
    goto fail;
735
    goto fail;
606
  if (! ISDIGIT (darwin_macosx_version_min[3]))
736
737
  /* Do not assume that the major number will always be exactly 10.  */
738
  if (version_array[MAJOR] < 10 || version_array[MAJOR] > 10)
607
    goto fail;
739
    goto fail;
608
740
609
  minorDigitIdx = 3;
741
  if (version_array[MAJOR] == 10 && version_array[MINOR] < 10)
610
  result[2] = darwin_macosx_version_min[minorDigitIdx++];
742
    version_macro = version_as_legacy_macro (version_array);
611
  if (ISDIGIT (darwin_macosx_version_min[minorDigitIdx]))
743
  else
612
  {
744
    version_macro = version_as_modern_macro (version_array);
613
    /* Starting with OS X 10.10, the macro ends '00' rather than '0',
745
614
       i.e. 10.10.x becomes 101000 rather than 10100.  */
746
  if (! version_macro)
615
    result[3] = darwin_macosx_version_min[minorDigitIdx++];
616
    result[4] = '0';
617
    result[5] = '0';
618
    result[6] = '\0';
619
  }
620
  if (darwin_macosx_version_min[minorDigitIdx] != '\0'
621
      && darwin_macosx_version_min[minorDigitIdx] != '.')
622
    goto fail;
747
    goto fail;
623
748
624
  return result;
749
  return version_macro;
625
750
626
 fail:
751
 fail:
627
  error ("unknown value %qs of -mmacosx-version-min",
752
  error ("unknown value %qs of -mmacosx-version-min",
628
	 darwin_macosx_version_min);
753
         darwin_macosx_version_min);
629
  return "1000";
754
  return "1000";
630
}
755
}
631
756
Lines 647-653 darwin_cpp_builtins (cpp_reader *pfile) Link Here
647
    builtin_define ("__CONSTANT_CFSTRINGS__");
772
    builtin_define ("__CONSTANT_CFSTRINGS__");
648
773
649
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
774
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
650
			     version_as_macro(), false);
775
			     macosx_version_as_macro(), false);
651
776
652
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
777
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
653
     following will cause a syntax error if one tries to compile gc attributed
778
     following will cause a syntax error if one tries to compile gc attributed
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-10.c (+16 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with a zero-padded minor number < 10
2
   and a zero-padded tiny number < 10 produces the correct
3
   four-character macro.  */
4
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
5
6
/* { dg-options "-mmacosx-version-min=10.07.02" } */
7
/* { dg-do compile { target *-*-darwin* } } */
8
9
int
10
main ()
11
{
12
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1072
13
  fail me;
14
#endif
15
  return 0;
16
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-11.c (+15 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with outrageous zero-padding and
2
   a minor number > 9 still produces a six-character macro.  */
3
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
4
5
/* { dg-options "-mmacosx-version-min=00010.010.0000098" } */
6
/* { dg-do compile { target *-*-darwin* } } */
7
8
int
9
main ()
10
{
11
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101098
12
  fail me;
13
#endif
14
  return 0;
15
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-12.c (+15 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with outrageous zero-padding and
2
   a minor number < 10 still produces a four-character macro.  */
3
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
4
5
/* { dg-options "-mmacosx-version-min=010.008.000031" } */
6
/* { dg-do compile { target *-*-darwin* } } */
7
8
int
9
main ()
10
{
11
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1089
12
  fail me;
13
#endif
14
  return 0;
15
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-3.c (-3 / +3 lines)
Lines 1-11 Link Here
1
/* Test that most-minor versions greater than 9 work.  */
1
/* Test that most minor versions < 10 work.  */
2
/* { dg-options "-mmacosx-version-min=10.4.10" } */
2
/* { dg-options "-mmacosx-version-min=10.4.1" } */
3
/* { dg-do compile { target *-*-darwin* } } */
3
/* { dg-do compile { target *-*-darwin* } } */
4
4
5
int
5
int
6
main ()
6
main ()
7
{
7
{
8
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1040
8
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1041
9
  fail me;
9
  fail me;
10
#endif
10
#endif
11
  return 0;
11
  return 0;
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-4.c (-3 / +3 lines)
Lines 1-11 Link Here
1
/* Test that major versions greater than 9 work and have the additional 0.  */
1
/* Test that minor versions > 9 produce a 6-digit macro.  */
2
/* { dg-options "-mmacosx-version-min=10.10.0" } */
2
/* { dg-options "-mmacosx-version-min=10.10.1" } */
3
/* { dg-do compile { target *-*-darwin* } } */
3
/* { dg-do compile { target *-*-darwin* } } */
4
4
5
int
5
int
6
main ()
6
main ()
7
{
7
{
8
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101000
8
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101001
9
  fail me;
9
  fail me;
10
#endif
10
#endif
11
  return 0;
11
  return 0;
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-5.c (+15 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with minor number < 10 and tiny number > 9
2
   produces a four-character macro with the tiny number clamped to 9.  */
3
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
4
5
/* { dg-options "-mmacosx-version-min=10.9.10" } */
6
/* { dg-do compile { target *-*-darwin* } } */
7
8
int
9
main ()
10
{
11
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1099
12
  fail me;
13
#endif
14
  return 0;
15
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-6.c (+14 lines)
Line 0 Link Here
1
/* PR 63810: Test that tiny numbers are preserved in six-character macros.  */
2
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
3
4
/* { dg-options "-mmacosx-version-min=10.10.11" } */
5
/* { dg-do compile { target *-*-darwin* } } */
6
7
int
8
main ()
9
{
10
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101011
11
  fail me;
12
#endif
13
  return 0;
14
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-7.c (+15 lines)
Line 0 Link Here
1
/* PR 63810: Test that tiny numbers < 10 are preserved in four-character
2
   macros.  */
3
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
4
5
/* { dg-options "-mmacosx-version-min=10.9.1" } */
6
/* { dg-do compile { target *-*-darwin* } } */
7
8
int
9
main ()
10
{
11
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1091
12
  fail me;
13
#endif
14
  return 0;
15
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-8.c (+16 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with minor number > 9 and no tiny
2
   number produces a six-character macro with "00" as the last two
3
   characters.  */
4
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
5
6
/* { dg-options "-mmacosx-version-min=10.11" } */
7
/* { dg-do compile { target *-*-darwin* } } */
8
9
int
10
main ()
11
{
12
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 101100
13
  fail me;
14
#endif
15
  return 0;
16
}
(-)a/gcc/testsuite/gcc.dg/darwin-minversion-9.c (+15 lines)
Line 0 Link Here
1
/* PR 63810: Test that a version with a zero-padded minor number < 10
2
   produces a four-character macro.  */
3
/* Added by Lawrence Velázquez <larryv@macports.org>.  */
4
5
/* { dg-options "-mmacosx-version-min=10.08.4" } */
6
/* { dg-do compile { target *-*-darwin* } } */
7
8
int
9
main ()
10
{
11
#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ != 1084
12
  fail me;
13
#endif
14
  return 0;
15
}

Return to bug 63810