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

Collapse All | Expand All

(-)a/gcc/config/darwin-c.c (-26 / +147 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"];
671
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
  if (sprintf (result, "%02lu%lu%lu", major, minor, tiny)
679
      != sizeof "9999" - 1)
680
    return NULL;
681
682
  return result;
683
}
603
684
604
  if (strncmp (darwin_macosx_version_min, "10.", 3) != 0)
685
/*  Given a three-component version represented as an array of
686
    non-negative integers, return a statically-allocated string suitable
687
    for the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro
688
    or the __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ macro.  If the
689
    version is invalid, return null.
690
691
    The modern format is a five- or six-character string -- one or two
692
    chars for the major number and two each for the minor and tiny
693
    numbers, which are zero-padded if necessary (for example, {8,1,0}
694
    produces "80100", and {10,10,1} produces "101001").  Versions
695
    containing numbers greater than 99 are rejected.  */
696
697
static const char *
698
version_as_modern_macro (const unsigned long *version)
699
{
700
  unsigned long major = version[MAJOR];
701
  unsigned long minor = version[MINOR];
702
  unsigned long tiny = version[TINY];
703
  static char result[sizeof "999999"];
704
705
  if (major > 99 || minor > 99 || tiny > 99)
706
    return NULL;
707
708
  /* NOTE: 'sizeof "foo"' returns size of char array, but
709
     'sizeof ((x > y) ? "foo" : "bar")' returns size of char pointer.  */
710
  if (sprintf (result, "%lu%02lu%02lu", major, minor, tiny)
711
      != ((major > 9) ? sizeof "999999" : sizeof "99999") - 1)
712
    return NULL;
713
714
  return result;
715
}
716
717
/*  Return the value of darwin_macosx_version_min, suitably formatted
718
    for the __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  (For
719
    example, "10.9" produces "1090", and "10.10.1" produces "101001".)
720
    If its value is invalid and cannot be coerced into a valid form,
721
    print a warning and return "1000".  */
722
723
static const char *
724
macosx_version_as_macro (void)
725
{
726
  const unsigned long *version_array;
727
  const char *version_macro;
728
729
  version_array = parse_version (darwin_macosx_version_min);
730
  if (! version_array)
605
    goto fail;
731
    goto fail;
606
  if (! ISDIGIT (darwin_macosx_version_min[3]))
732
733
  /* Do not assume that the major number will always be exactly 10.  */
734
  if (version_array[MAJOR] < 10 || version_array[MAJOR] > 10)
607
    goto fail;
735
    goto fail;
608
736
609
  minorDigitIdx = 3;
737
  if (version_array[MAJOR] == 10 && version_array[MINOR] < 10)
610
  result[2] = darwin_macosx_version_min[minorDigitIdx++];
738
    version_macro = version_as_legacy_macro (version_array);
611
  if (ISDIGIT (darwin_macosx_version_min[minorDigitIdx]))
739
  else
612
  {
740
    version_macro = version_as_modern_macro (version_array);
613
    /* Starting with OS X 10.10, the macro ends '00' rather than '0',
741
614
       i.e. 10.10.x becomes 101000 rather than 10100.  */
742
  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;
743
    goto fail;
623
744
624
  return result;
745
  return version_macro;
625
746
626
 fail:
747
 fail:
627
  error ("unknown value %qs of -mmacosx-version-min",
748
  error ("unknown value %qs of -mmacosx-version-min",
628
	 darwin_macosx_version_min);
749
         darwin_macosx_version_min);
629
  return "1000";
750
  return "1000";
630
}
751
}
631
752
Lines 647-653 darwin_cpp_builtins (cpp_reader *pfile) Link Here
647
    builtin_define ("__CONSTANT_CFSTRINGS__");
768
    builtin_define ("__CONSTANT_CFSTRINGS__");
648
769
649
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
770
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
650
			     version_as_macro(), false);
771
			     macosx_version_as_macro(), false);
651
772
652
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
773
  /* 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
774
     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