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 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"];
583
651
584
  if (strncmp (darwin_macosx_version_min, "10.", 3) != 0)
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
  /* NOTE: Cast result of sizeof so that result of sprintf is not
659
     converted to an unsigned type.  */
660
  if (sprintf (result, "%02lu%lu%lu", major, minor, tiny)
661
      != (int) sizeof "9999" - 1)
662
    return NULL;
663
664
  return result;
665
}
666
667
/*  Given a three-component version represented as an array of
668
    non-negative integers, return a statically-allocated string suitable
669
    for the modern __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro
670
    or the __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ macro.  If the
671
    version is invalid, return null.
672
673
    The modern format is a five- or six-character string -- one or two
674
    chars for the major number and two each for the minor and tiny
675
    numbers, which are zero-padded if necessary (for example, {8,1,0}
676
    produces "80100", and {10,10,1} produces "101001").  Versions
677
    containing numbers greater than 99 are rejected.  */
678
679
static const char *
680
version_as_modern_macro (const unsigned long *version)
681
{
682
  unsigned long major = version[MAJOR];
683
  unsigned long minor = version[MINOR];
684
  unsigned long tiny = version[TINY];
685
  static char result[sizeof "999999"];
686
687
  if (major > 99 || minor > 99 || tiny > 99)
688
    return NULL;
689
690
  /* NOTE: 'sizeof "foo"' returns size of char array, but
691
     'sizeof ((x > y) ? "foo" : "bar")' returns size of char pointer.  */
692
  /* NOTE: Cast result of sizeof so that result of sprintf is not
693
     converted to an unsigned type.  */
694
  if (sprintf (result, "%lu%02lu%02lu", major, minor, tiny)
695
      != (int) ((major > 9) ? sizeof "999999" : sizeof "99999") - 1)
696
    return NULL;
697
698
  return result;
699
}
700
701
/*  Return the value of darwin_macosx_version_min, suitably formatted
702
    for the __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ macro.  (For
703
    example, "10.9" produces "1090", and "10.10.1" produces "101001".)
704
    If its value is invalid and cannot be coerced into a valid form,
705
    print a warning and return "1000".  */
706
707
static const char *
708
macosx_version_as_macro (void)
709
{
710
  const unsigned long *version_array;
711
  const char *version_macro;
712
713
  version_array = parse_version (darwin_macosx_version_min);
714
  if (! version_array)
585
    goto fail;
715
    goto fail;
586
  if (! ISDIGIT (darwin_macosx_version_min[3]))
716
717
  /* Do not assume that the major number will always be exactly 10.  */
718
  if (version_array[MAJOR] < 10 || version_array[MAJOR] > 10)
587
    goto fail;
719
    goto fail;
588
720
589
  minorDigitIdx = 3;
721
  if (version_array[MAJOR] == 10 && version_array[MINOR] < 10)
590
  result[2] = darwin_macosx_version_min[minorDigitIdx++];
722
    version_macro = version_as_legacy_macro (version_array);
591
  if (ISDIGIT (darwin_macosx_version_min[minorDigitIdx]))
723
  else
592
  {
724
    version_macro = version_as_modern_macro (version_array);
593
    /* Starting with OS X 10.10, the macro ends '00' rather than '0',
725
594
       i.e. 10.10.x becomes 101000 rather than 10100.  */
726
  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;
727
    goto fail;
603
728
604
  return result;
729
  return version_macro;
605
730
606
 fail:
731
 fail:
607
  error ("unknown value %qs of -mmacosx-version-min",
732
  error ("unknown value %qs of -mmacosx-version-min",
608
	 darwin_macosx_version_min);
733
         darwin_macosx_version_min);
609
  return "1000";
734
  return "1000";
610
}
735
}
611
736
Lines 627-633 darwin_cpp_builtins (cpp_reader *pfile) Link Here
627
    builtin_define ("__CONSTANT_CFSTRINGS__");
752
    builtin_define ("__CONSTANT_CFSTRINGS__");
628
753
629
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
754
  builtin_define_with_value ("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__",
630
			     version_as_macro(), false);
755
			     macosx_version_as_macro(), false);
631
756
632
  /* Since we do not (at 4.6) support ObjC gc for the NeXT runtime, the
757
  /* 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
758
     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