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 570-611 find_subframework_header (cpp_reader *pfile, const char *header, cpp_dir **dirp) Link Here
570
  return 0;
570
  return 0;
571
}
571
}
572
572
573
/* Return the value of darwin_macosx_version_min suitable for the
573
/*  Given a version string, return the version as a statically-allocated
574
   __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro, so '10.4.2'
574
    array of three non-negative integers.  If the version string is
575
   becomes 1040 and '10.10.0' becomes 101000.  The lowest digit is
575
    invalid, return null.
576
   always zero, as is the second lowest for '10.10.x' and above.
576
577
   Print a warning if the version number can't be understood.  */
577
    Version strings must consist of one, two, or three tokens, each
578
    separated by a single period.  Each token must contain only the
579
    characters '0' through '9' and is converted to an equivalent
580
    integer.  Omitted tokens are treated as zeros.  For example:
581
582
        "10"              becomes   {10,0,0}
583
        "10.10"           becomes   {10,10,0}
584
        "10.10.1"         becomes   {10,10,1}
585
        "10.000010.1"     becomes   {10,10,1}
586
        "10.010.001"      becomes   {10,10,1}
587
        "000010.10.00001" becomes   {10,10,1}  */
588
589
enum version_components { MAJOR, MINOR, TINY };
590
591
static const unsigned long *
592
parse_version (const char *version_str)
593
{
594
  size_t version_len;
595
  char *end;
596
  static unsigned long version_array[3];
597
598
  if (! version_str)
599
    return NULL;
600
601
  version_len = strlen (version_str);
602
  if (version_len < 1)
603
    return NULL;
604
605
  /* Version string must consist of digits and periods only.  */
606
  if (strspn (version_str, "0123456789.") != version_len)
607
    return NULL;
608
609
  if (! ISDIGIT (version_str[0]) || ! ISDIGIT (version_str[version_len - 1]))
610
    return NULL;
611
612
  version_array[MAJOR] = strtoul (version_str, &end, 10);
613
  version_str = end + ((*end == '.') ? 1 : 0);
614
615
  /* Version string must not contain adjacent periods.  */
616
  if (*version_str == '.')
617
    return NULL;
618
619
  version_array[MINOR] = strtoul (version_str, &end, 10);
620
  version_str = end + ((*end == '.') ? 1 : 0);
621
622
  version_array[TINY] = strtoul (version_str, &end, 10);
623
624
  /* Version string must contain no more than three tokens.  */
625
  if (*end != '\0')
626
    return NULL;
627
628
  return version_array;
629
}
630
631
/*  Given a three-component version represented as an array of
632
    non-negative integers, return a statically-allocated string suitable
633
    for the legacy __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.
634
    If the version is invalid and cannot be coerced into a valid form,
635
    return null.
636
637
    The legacy format is a four-character string -- two chars for the
638
    major number and one each for the minor and tiny numbers.  Major
639
    numbers are zero-padded if necessary.  Minor and tiny numbers from
640
    10 through 99 are permitted but are clamped to 9 (for example,
641
    {10,9,10} produces "1099").  Versions containing numbers greater
642
    than 99 are rejected.  */
643
578
static const char *
644
static const char *
579
version_as_macro (void)
645
version_as_legacy_macro (const unsigned long *version)
580
{
646
{
581
  static char result[7] = "1000";
647
  unsigned long major = version[MAJOR];
582
  int minorDigitIdx;
648
  unsigned long minor = version[MINOR];
649
  unsigned long tiny = version[TINY];
650
  static char result[sizeof "9999"];
651
652
  if (major > 99 || minor > 99 || tiny > 99)
653
    return NULL;
654
655
  minor = ((minor > 9) ? 9 : minor);
656
  tiny = ((tiny > 9) ? 9 : tiny);
657
658
  if (sprintf (result, "%02lu%lu%lu", major, minor, tiny)
659
      != sizeof "9999" - 1)
660
    return NULL;
661
662
  return result;
663
}
583
664
584
  if (strncmp (darwin_macosx_version_min, "10.", 3) != 0)
665
/*  Given a three-component version represented as an array of
666
    non-negative integers, return a statically-allocated string suitable
667
    for the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro
668
    or the __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ macro.  If the
669
    version is invalid, return null.
670
671
    The modern format is a five- or six-character string -- one or two
672
    chars for the major number and two each for the minor and tiny
673
    numbers, which are zero-padded if necessary (for example, {8,1,0}
674
    produces "80100", and {10,10,1} produces "101001").  Versions
675
    containing numbers greater than 99 are rejected.  */
676
677
static const char *
678
version_as_modern_macro (const unsigned long *version)
679
{
680
  unsigned long major = version[MAJOR];
681
  unsigned long minor = version[MINOR];
682
  unsigned long tiny = version[TINY];
683
  static char result[sizeof "999999"];
684
685
  if (major > 99 || minor > 99 || tiny > 99)
686
    return NULL;
687
688
  /* NOTE: 'sizeof "foo"' returns size of char array, but
689
     'sizeof ((x > y) ? "foo" : "bar")' returns size of char pointer.  */
690
  if (sprintf (result, "%lu%02lu%02lu", major, minor, tiny)
691
      != ((major > 9) ? sizeof "999999" : sizeof "99999") - 1)
692
    return NULL;
693
694
  return result;
695
}
696
697
/*  Return the value of darwin_macosx_version_min, suitably formatted
698
    for the __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  (For
699
    example, "10.9" produces "1090", and "10.10.1" produces "101001".)
700
    If its value is invalid and cannot be coerced into a valid form,
701
    print a warning and return "1000".  */
702
703
static const char *
704
macosx_version_as_macro (void)
705
{
706
  const unsigned long *version_array;
707
  const char *version_macro;
708
709
  version_array = parse_version (darwin_macosx_version_min);
710
  if (! version_array)
585
    goto fail;
711
    goto fail;
586
  if (! ISDIGIT (darwin_macosx_version_min[3]))
712
713
  /* Do not assume that the major number will always be exactly 10.  */
714
  if (version_array[MAJOR] < 10 || version_array[MAJOR] > 10)
587
    goto fail;
715
    goto fail;
588
716
589
  minorDigitIdx = 3;
717
  if (version_array[MAJOR] == 10 && version_array[MINOR] < 10)
590
  result[2] = darwin_macosx_version_min[minorDigitIdx++];
718
    version_macro = version_as_legacy_macro (version_array);
591
  if (ISDIGIT (darwin_macosx_version_min[minorDigitIdx]))
719
  else
592
  {
720
    version_macro = version_as_modern_macro (version_array);
593
    /* Starting with OS X 10.10, the macro ends '00' rather than '0',
721
594
       i.e. 10.10.x becomes 101000 rather than 10100.  */
722
  if (! version_macro)
595
    result[3] = darwin_macosx_version_min[minorDigitIdx++];
596
    result[4] = '0';
597
    result[5] = '0';
598
    result[6] = '\0';
599
  }
600
  if (darwin_macosx_version_min[minorDigitIdx] != '\0'
601
      && darwin_macosx_version_min[minorDigitIdx] != '.')
602
    goto fail;
723
    goto fail;
603
724
604
  return result;
725
  return version_macro;
605
726
606
 fail:
727
 fail:
607
  error ("unknown value %qs of -mmacosx-version-min",
728
  error ("unknown value %qs of -mmacosx-version-min",
608
	 darwin_macosx_version_min);
729
         darwin_macosx_version_min);
609
  return "1000";
730
  return "1000";
610
}
731
}
611
732
Lines 627-633 darwin_cpp_builtins (cpp_reader *pfile) Link Here
627
    builtin_define ("__CONSTANT_CFSTRINGS__");
748
    builtin_define ("__CONSTANT_CFSTRINGS__");
628
749
629
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
750
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
630
			     version_as_macro(), false);
751
			     macosx_version_as_macro(), false);
631
752
632
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
753
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
633
     following will cause a syntax error if one tries to compile gc attributed
754
     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