[llvm-commits] [llvm-gcc-4.2] r82237 - in /llvm-gcc-4.2/trunk: build_gcc gcc/ChangeLog.apple gcc/c-common.h gcc/c-decl.c gcc/c-lex.c gcc/c-pch.c gcc/config/arm/arm-protos.h gcc/config/arm/arm.c gcc/config/arm/arm.h gcc/config/arm/arm.md gcc/config/arm/sync.md gcc/cp/decl.c gcc/doc/extend.texi gcc/doc/invoke.texi gcc/testsuite/g++.apple/block-weak.C gcc/testsuite/gcc.apple/block-weak.c gcc/testsuite/lib/target-supports.exp gcc/version.c

Bob Wilson bob.wilson at apple.com
Fri Sep 18 11:14:39 PDT 2009


Author: bwilson
Date: Fri Sep 18 13:14:39 2009
New Revision: 82237

URL: http://llvm.org/viewvc/llvm-project?rev=82237&view=rev
Log:
Merge with Apple's gcc r155848.

Added:
    llvm-gcc-4.2/trunk/gcc/config/arm/sync.md
    llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-weak.C
    llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-weak.c
Modified:
    llvm-gcc-4.2/trunk/build_gcc
    llvm-gcc-4.2/trunk/gcc/ChangeLog.apple
    llvm-gcc-4.2/trunk/gcc/c-common.h
    llvm-gcc-4.2/trunk/gcc/c-decl.c
    llvm-gcc-4.2/trunk/gcc/c-lex.c
    llvm-gcc-4.2/trunk/gcc/c-pch.c
    llvm-gcc-4.2/trunk/gcc/config/arm/arm-protos.h
    llvm-gcc-4.2/trunk/gcc/config/arm/arm.c
    llvm-gcc-4.2/trunk/gcc/config/arm/arm.h
    llvm-gcc-4.2/trunk/gcc/config/arm/arm.md
    llvm-gcc-4.2/trunk/gcc/cp/decl.c
    llvm-gcc-4.2/trunk/gcc/doc/extend.texi
    llvm-gcc-4.2/trunk/gcc/doc/invoke.texi
    llvm-gcc-4.2/trunk/gcc/testsuite/lib/target-supports.exp
    llvm-gcc-4.2/trunk/gcc/version.c

Modified: llvm-gcc-4.2/trunk/build_gcc
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/build_gcc?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/build_gcc (original)
+++ llvm-gcc-4.2/trunk/build_gcc Fri Sep 18 13:14:39 2009
@@ -123,13 +123,20 @@
 ARM_LIBSTDCXX_VERSION=4.2.1
 ARM_CONFIGFLAGS="--with-gxx-include-dir=/usr/include/c++/$ARM_LIBSTDCXX_VERSION"
 
-ARM_PLATFORM=/Developer/Platforms/iPhoneOS.platform
-ARM_IPHONE_SDK=iPhoneOS${IPHONEOS_DEPLOYMENT_TARGET}.Internal.sdk
-ARM_EXTRA_SDK=/Developer/SDKs/Extra
+# If the build target is iPhone, use the iPhone SDK as the build sysroot
+# and use the tools from the iPhone platform directory.  These paths have to
+# be hardcoded, at least for now, because the build system does not
+# consistently identify separate host and target SDKROOTS.  (The buildit
+# script currently sets SDKROOT to the target iPhone SDK, but XBS sets it
+# to the default host SDK "/".)
+if [ "x$RC_TARGET_CONFIG" = "xiPhone" ]; then
 
-# If the Phone platform is available, use the ARM tools there, else try /
-if [ -d $ARM_PLATFORM ]; then
+  ARM_PLATFORM=/Developer/Platforms/iPhoneOS.platform
+  ARM_IPHONE_SDK=iPhoneOS${IPHONEOS_DEPLOYMENT_TARGET}.Internal.sdk
+
+  ARM_SYSROOT=$ARM_PLATFORM/Developer/SDKs/$ARM_IPHONE_SDK
   ARM_TOOLROOT=$ARM_PLATFORM/Developer
+
   # If it's being built for iPhoneOS, assume the llvmCore bits are under
   # iPhoneOS platform directory.
   if [ "x$RC_ProjectName" = "xllvmgcc42_Embedded" ]; then
@@ -137,25 +144,17 @@
     DEST_ROOT="${ARM_PLATFORM}${DEST_ROOT}"
   fi
 else
-  ARM_TOOLROOT=/
-fi
 
-# Likewise, In order of preference, look for ARM sysroot bits at:
-#   1. $ARM_SDK_EXTRA
-#   2. Phone SDK ($ARM_PLATFORM/Developers/SDKs/$ARM_IPHONE_SDK)
-#   3. /
-if [ -d $ARM_EXTRA_SDK ]; then
-  ARM_SYSROOT=$ARM_EXTRA_SDK
-  ARM_CONFIGFLAGS="$ARM_CONFIGFLAGS --with-sysroot=\"$ARM_SYSROOT\""
-else
-  if [ -d $ARM_PLATFORM/Developer/SDKs/$ARM_IPHONE_SDK ]; then
-    ARM_SYSROOT=$ARM_PLATFORM/Developer/SDKs/$ARM_IPHONE_SDK
-    ARM_CONFIGFLAGS="$ARM_CONFIGFLAGS --with-sysroot=\"$ARM_SYSROOT\""
+  # Use bootstrap SDK if it is available.
+  if [ -d /Developer/SDKs/Extra ]; then
+    ARM_SYSROOT=/Developer/SDKs/Extra
   else
     ARM_SYSROOT=/
-    ARM_CONFIG_FLAGS=
   fi
+  ARM_TOOLROOT=/
+
 fi
+ARM_CONFIGFLAGS="$ARM_CONFIGFLAGS --with-build-sysroot=\"$ARM_SYSROOT\""
 
 # If building an ARM target, check that the required directories exist
 # and query the libSystem arm slices to determine which multilibs we should
@@ -269,9 +268,9 @@
 mkdir -p $DIR/obj-$BUILD-$BUILD $DIR/dst-$BUILD-$BUILD || exit 1
 cd $DIR/obj-$BUILD-$BUILD || exit 1
 if [ \! -f Makefile ]; then
- $SRC_DIR/configure $bootstrap $CONFIGFLAGS \
-   $NON_ARM_CONFIGFLAGS \
-   --host=$BUILD-apple-darwin$DARWIN_VERS --target=$BUILD-apple-darwin$DARWIN_VERS || exit 1
+ $SRC_DIR/configure $bootstrap $CONFIGFLAGS $NON_ARM_CONFIGFLAGS \
+   --host=$BUILD-apple-darwin$DARWIN_VERS \
+   --target=$BUILD-apple-darwin$DARWIN_VERS || exit 1
 fi
 # Unset RC_DEBUG_OPTIONS because it causes the bootstrap to fail.
 # Also keep unset for cross compilers so that the cross built libraries are
@@ -347,10 +346,19 @@
    cd $DIR/obj-$BUILD-$t || exit 1
    if [ \! -f Makefile ]; then
     # APPLE LOCAL begin ARM ARM_CONFIGFLAGS
-    $SRC_DIR/configure $CONFIGFLAGS --enable-werror-always \
-      `if [ $t = 'arm' ] ; then echo $ARM_CONFIGFLAGS ; else echo $NON_ARM_CONFIGFLAGS ; fi` \
+    T_CONFIGFLAGS="$CONFIGFLAGS --enable-werror-always \
       --program-prefix=$t-apple-darwin$DARWIN_VERS- \
-      --host=$BUILD-apple-darwin$DARWIN_VERS --target=$t-apple-darwin$DARWIN_VERS || exit 1
+      --host=$BUILD-apple-darwin$DARWIN_VERS \
+      --target=$t-apple-darwin$DARWIN_VERS"
+    if [ $t = 'arm' ] ; then
+      # Explicitly set AS_FOR_TARGET and LD_FOR_TARGET to avoid picking up
+      # older versions from the gcc installed in /usr.  Radar 7230843.
+      AS_FOR_TARGET=$DIR/bin/${t}-apple-darwin$DARWIN_VERS-as \
+      LD_FOR_TARGET=$DIR/bin/${t}-apple-darwin$DARWIN_VERS-ld \
+      $SRC_DIR/configure $T_CONFIGFLAGS $ARM_CONFIGFLAGS || exit 1
+    else
+      $SRC_DIR/configure $T_CONFIGFLAGS $NON_ARM_CONFIGFLAGS || exit 1
+    fi
     # APPLE LOCAL end ARM ARM_CONFIGFLAGS
    fi
    make $MAKEFLAGS all CFLAGS="$CFLAGS" CXXFLAGS="$CFLAGS" || exit 1
@@ -393,10 +401,15 @@
 
       if [ \! -f Makefile ]; then
 	# APPLE LOCAL begin ARM ARM_CONFIGFLAGS
-        $SRC_DIR/configure $CONFIGFLAGS \
-	  `if [ $t = 'arm' ] && [ $h != 'arm' ] ; then echo $ARM_CONFIGFLAGS ; else echo $NON_ARM_CONFIGFLAGS ; fi` \
-          --program-prefix=$pp \
-          --host=$h-apple-darwin$DARWIN_VERS --target=$t-apple-darwin$DARWIN_VERS || exit 1
+        T_CONFIGFLAGS="$CONFIGFLAGS --program-prefix=$pp \
+          --host=$h-apple-darwin$DARWIN_VERS \
+          --target=$t-apple-darwin$DARWIN_VERS"
+	if [ $t = 'arm' ] && [ $h != 'arm' ] ; then
+          T_CONFIGFLAGS="$T_CONFIGFLAGS $ARM_CONFIGFLAGS"
+        else
+          T_CONFIGFLAGS="$T_CONFIGFLAGS $NON_ARM_CONFIGFLAGS"
+        fi
+        $SRC_DIR/configure $T_CONFIGFLAGS || exit 1
 	# APPLE LOCAL end ARM ARM_CONFIGFLAGS
       fi
 

Modified: llvm-gcc-4.2/trunk/gcc/ChangeLog.apple
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/ChangeLog.apple?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/ChangeLog.apple (original)
+++ llvm-gcc-4.2/trunk/gcc/ChangeLog.apple Fri Sep 18 13:14:39 2009
@@ -7,6 +7,51 @@
 	destroy helper functions a NULL/0 source location.
 	* c-parser.c (c_parser_block_literal_expr):  Ditto.
 
+2009-09-08  Jim Grosbach <grosbach at apple.com>
+
+       Radar 7174451
+       * config/arm/arm.c (arm_select_dominance_cc_mode): Unordered floats.
+
+2009-09-08  Jim Grosbach <grosbach at apple.com>
+
+	Radar 6258536
+	* gcc/testsuite/lib/target-supports.exp
+	(check_effective_target_sync_int_long): Enable __sync* tests for ARM.
+	* gcc/config/arm/arm.c (emit_load_locked, emit_store_conditional,
+	arm_split_compare_and_swap): New.
+	* gcc/config/arm/arm.h (ARM_PRINT_OPERAND_ADDRESS): Omit the ", #0"
+	for no-offset register addresses to make LDREX* and STREX* happy.
+	(arm_arch7a): Make extern for use in .md files.
+	* gcc/config/arm/arm-protos.h (arm_split_compare_and_swap): New.
+	* gcc/config/arm/sync.md: New file.
+	* gcc/config/arm/arm.md: Include "sync.md".
+	(UNSPEC_CMPXCHG, UNSPEC_BARRIER, UNSPEC_SYNC, VUNSPEC_LL,
+	VUNSPEC_SC): New.
+
+2009-09-04  Jim Grosbach <grosbach at apple.com>
+
+	Radar 6574544
+	* config/arm/arm.c (arm_expand_neon_args): Convert builtin arguments
+	to the expected mode.
+
+2009-09-04  Jim Grosbach <grosbach at apple.com>
+
+	Radar 7198870
+	* config/arm/arm.c (thumb2_legitimate_index_p): Restrict negative
+	range to -255 since that's the min for STR.
+
+2009-09-01  Jim Grosbach <grosbach at apple.com>
+
+	Radar 7191061
+	* config/arm/arm.h (ARM_DECLARE_FUNCTION_NAME): Force 32-bit
+	alignment for MI thunk functions.
+
+2009-09-01  Jim Grosbach <grosbach at apple.com>
+
+	Radar 7109945
+	* config/arm (thumb2_legitimate_index_p): VFP register addresses
+	should be restricted to constants in range for VSTR.
+
 2009-08-31  Caroline Tice  <ctice at apple.com>
 
 	Radar 6419781
@@ -14,7 +59,7 @@
 	* tree.h (type_is_block_byref_struct):  New extern function decl.
 
 2009-07-31  Bob Wilson  <bob.wilson at apple.com>
-	
+
 	Radar 7105099
 	Backport from mainline (the ARM portions were already partly there):
 	2007-07-16  Julian Brown  <julian at codesourcery.com>

Modified: llvm-gcc-4.2/trunk/gcc/c-common.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-common.h?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-common.h (original)
+++ llvm-gcc-4.2/trunk/gcc/c-common.h Fri Sep 18 13:14:39 2009
@@ -1143,7 +1143,8 @@
     BLOCK_FIELD_IS_BLOCK    =  7,  /* a block variable */
     BLOCK_FIELD_IS_BYREF    =  8,  /* the on stack structure holding the __block variable */
     BLOCK_FIELD_IS_WEAK     = 16,  /* declared __weak, only used in byref copy helpers */
-    BLOCK_BYREF_CALLER      = 128  /* called from __block (byref) copy/dispose support routines */
+    BLOCK_BYREF_CALLER      = 128, /* called from __block (byref) copy/dispose support routines */
+    BLOCK_BYREF_CURRENT_MAX = 256
 };
 /* APPLE LOCAL end radar 5847976 */
 /* APPLE LOCAL begin radar 5732232 - blocks */

Modified: llvm-gcc-4.2/trunk/gcc/c-decl.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-decl.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-decl.c (original)
+++ llvm-gcc-4.2/trunk/gcc/c-decl.c Fri Sep 18 13:14:39 2009
@@ -3598,8 +3598,9 @@
 }
 
 /* APPLE LOCAL begin radar 5932809 - copyable byref blocks (C++ cr) */
-static tree block_byref_id_object_copy;
-static tree block_byref_id_object_dispose;
+#define BLOCK_ALIGN_MAX 18
+static tree block_byref_id_object_copy[BLOCK_BYREF_CURRENT_MAX*(BLOCK_ALIGN_MAX+1)];
+static tree block_byref_id_object_dispose[BLOCK_BYREF_CURRENT_MAX*(BLOCK_ALIGN_MAX+1)];
 
 /**
  This routine builds:
@@ -3610,14 +3611,14 @@
    _Block_object_assign(&_dest->object, _src->object, BLOCK_FIELD_IS_BLOCK[|BLOCK_FIELD_IS_WEAK])  // blocks
  }  */
 static void
-synth_block_byref_id_object_copy_func (int flag)
+synth_block_byref_id_object_copy_func (int flag, int kind)
 {
   tree stmt, fnbody;
   tree dst_arg, src_arg;
   tree dst_obj, src_obj;
   struct c_arg_info * arg_info;
   tree call_exp;
-  gcc_assert (block_byref_id_object_copy);
+  gcc_assert (block_byref_id_object_copy[kind]);
   /* Set up: (void* _dest, void*_src) parameters. */
   dst_arg = build_decl (PARM_DECL, get_identifier ("_dst"),
                         ptr_type_node);
@@ -3636,7 +3637,7 @@
                                           NULL_TREE));
   /* function header synthesis. */
   push_function_context ();
-  start_block_helper_function (block_byref_id_object_copy);
+  start_block_helper_function (block_byref_id_object_copy[kind]);
   store_parm_decls_from (arg_info);
 
   /* Body of the function. */
@@ -3675,12 +3676,12 @@
     _Block_object_dispose(_src->object, BLOCK_FIELD_IS_BLOCK[|BLOCK_FIELD_IS_WEAK]) // block
   }  */
 static void
-synth_block_byref_id_object_dispose_func (int flag)
+synth_block_byref_id_object_dispose_func (int flag, int kind)
 {
   tree stmt, fnbody;
   tree src_arg, src_obj, rel_exp;
   struct c_arg_info * arg_info;
-  gcc_assert (block_byref_id_object_dispose);
+  gcc_assert (block_byref_id_object_dispose[kind]);
   /* Set up: (void *_src) parameter. */
   src_arg = build_decl (PARM_DECL, get_identifier ("_src"),
                         ptr_type_node);
@@ -3692,7 +3693,7 @@
                                NULL_TREE);
   /* function header synthesis. */
   push_function_context ();
-  start_block_helper_function (block_byref_id_object_dispose);
+  start_block_helper_function (block_byref_id_object_dispose[kind]);
   store_parm_decls_from (arg_info);
 
   /* Body of the function. */
@@ -3854,10 +3855,17 @@
 
   if (COPYABLE_BYREF_LOCAL_NONPOD (decl))
     {
-      char name [64];
+      char name[64];
+      int align = exact_log2 ((DECL_ALIGN (decl)+TYPE_ALIGN (ptr_type_node)-1) / TYPE_ALIGN (ptr_type_node));
+      int kind;
+      if (align == -1 || align > BLOCK_ALIGN_MAX) {
+	error ("invalid alignment for __block variable");
+	kind = 0;
+      } else
+	kind = align*BLOCK_BYREF_CURRENT_MAX + flag;
       /* Add &__Block_byref_id_object_copy, &__Block_byref_id_object_dispose
 	 initializers. */
-      if (!block_byref_id_object_copy)
+      if (!block_byref_id_object_copy[kind])
 	{
 	  /* Build a void __Block_byref_id_object_copy(void*, void*) type. */
 	  tree func_type =
@@ -3866,17 +3874,17 @@
 					    tree_cons (NULL_TREE, ptr_type_node,
 						       void_list_node)));
 	  strcpy (name, "__Block_byref_id_object_copy");
-	  block_byref_id_object_copy = build_helper_func_decl (get_identifier (name),
-							       func_type);
+	  block_byref_id_object_copy[kind] = build_helper_func_decl (get_identifier (name),
+								     func_type);
 	  /* Synthesize function definition. */
-	  synth_block_byref_id_object_copy_func (flag);
+	  synth_block_byref_id_object_copy_func (flag, kind);
 	}
       initlist = tree_cons (fields,
-			    build_fold_addr_expr (block_byref_id_object_copy),
+			    build_fold_addr_expr (block_byref_id_object_copy[kind]),
 			    initlist);
       fields = TREE_CHAIN (fields);
 
-      if (!block_byref_id_object_dispose)
+      if (!block_byref_id_object_dispose[kind])
 	{
 	  /* Synthesize void __Block_byref_id_object_dispose (void*) and
 	     build &__Block_byref_id_object_dispose. */
@@ -3884,13 +3892,13 @@
 	    build_function_type (void_type_node,
 				 tree_cons (NULL_TREE, ptr_type_node, void_list_node));
 	  strcpy (name, "__Block_byref_id_object_dispose");
-	  block_byref_id_object_dispose = build_helper_func_decl (get_identifier (name),
-								  func_type);
+	  block_byref_id_object_dispose[kind] = build_helper_func_decl (get_identifier (name),
+									func_type);
 	  /* Synthesize function definition. */
-	  synth_block_byref_id_object_dispose_func (flag);
+	  synth_block_byref_id_object_dispose_func (flag, kind);
 	}
       initlist = tree_cons (fields,
-			    build_fold_addr_expr (block_byref_id_object_dispose),
+			    build_fold_addr_expr (block_byref_id_object_dispose[kind]),
 			    initlist);
       fields = TREE_CHAIN (fields);
     }

Modified: llvm-gcc-4.2/trunk/gcc/c-lex.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-lex.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-lex.c (original)
+++ llvm-gcc-4.2/trunk/gcc/c-lex.c Fri Sep 18 13:14:39 2009
@@ -705,7 +705,12 @@
     /* APPLE LOCAL begin 4137741 */
   if (!no_more_pch
       && type != CPP_BINCL
-      && type != CPP_EINCL)
+      && type != CPP_EINCL
+      /* APPLE LOCAL begin distcc pch 7216809 */
+      && type != CPP_PRAGMA
+      && type != CPP_STRING
+      && type != CPP_PRAGMA_EOL)
+      /* APPLE LOCAL end distcc pch 7216809 */
     /* APPLE LOCAL end 4137741 */
     {
       no_more_pch = true;

Modified: llvm-gcc-4.2/trunk/gcc/c-pch.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-pch.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-pch.c (original)
+++ llvm-gcc-4.2/trunk/gcc/c-pch.c Fri Sep 18 13:14:39 2009
@@ -386,6 +386,11 @@
       return;
     }
 
+  /* APPLE LOCAL begin distcc pch 7216809 */
+  if (cpp_get_callbacks (parse_in)->valid_pch == 0)
+    fatal_error ("translation unit malformed for PCH");
+  /* APPLE LOCAL end distcc pch 7216809 */
+
   cpp_get_callbacks (parse_in)->valid_pch = NULL;
 
   if (fread (&h, sizeof (h), 1, f) != 1)

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm-protos.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm-protos.h?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm-protos.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm-protos.h Fri Sep 18 13:14:39 2009
@@ -71,6 +71,8 @@
 /* APPLE LOCAL end 5831562 long long constants */
 extern int arm_split_constant (RTX_CODE, enum machine_mode, rtx,
 			       HOST_WIDE_INT, rtx, rtx, int);
+/* APPLE LOCAL 6258536 atomic builtins */
+extern void arm_split_compare_and_swap(rtx, rtx, rtx, rtx, rtx);
 extern RTX_CODE arm_canonicalize_comparison (RTX_CODE, enum machine_mode,
 					     rtx *);
 extern int legitimate_pic_operand_p (rtx);

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm.c (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm.c Fri Sep 18 13:14:39 2009
@@ -2365,6 +2365,130 @@
 			   1);
 }
 
+/* APPLE LOCAL begin 6258536 atomic builtins */
+/* A subroutine of the atomic operation splitter.  Emit a load exclusive
+   instruction in MODE.  */
+static void
+emit_load_locked (enum machine_mode mode, rtx reg, rtx mem)
+{
+  rtx (*fn) (rtx, rtx) = NULL;
+  switch (mode) {
+  case QImode:
+    fn = gen_load_locked_qi;
+    break;
+  case HImode:
+    fn = gen_load_locked_hi;
+    break;
+  case SImode:
+    fn = gen_load_locked_si;
+    break;
+  case DImode:
+    fn = gen_load_locked_di;
+    break;
+  default:
+    abort();
+  }
+  emit_insn (fn (reg, mem));
+}
+
+/* A subroutine of the atomic operation splitter.  Emit a store-conditional
+   instruction in MODE.  */
+static void
+emit_store_conditional (enum machine_mode mode, rtx res, rtx mem, rtx val)
+{
+  rtx (*fn) (rtx, rtx, rtx) = NULL;
+  switch (mode) {
+  case QImode:
+    fn = gen_store_conditional_qi;
+    break;
+  case HImode:
+    fn = gen_store_conditional_hi;
+    break;
+  case SImode:
+    fn = gen_store_conditional_si;
+    break;
+  case DImode:
+    fn = gen_store_conditional_di;
+    break;
+  default:
+    abort();
+  }
+  emit_insn (fn (res, mem, val));
+}
+
+
+void
+arm_split_compare_and_swap(rtx dest, rtx mem, rtx oldval, rtx newval,
+                           rtx scratch)
+{
+  enum machine_mode mode = GET_MODE (mem);
+  rtx label1, label2, x, cond = gen_rtx_REG (CCmode, CC_REGNUM);
+  rtx dest_cmp, oldval_cmp;
+
+  emit_insn (gen_memory_barrier ());
+
+  label1 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
+  label2 = gen_rtx_LABEL_REF (VOIDmode, gen_label_rtx ());
+  emit_label (XEXP (label1, 0));
+
+  emit_load_locked (mode, dest, mem);
+  /* If this is for a mode smaller than SI, zext to SI for the comparison. */
+  dest_cmp = dest;
+  oldval_cmp = oldval;
+  switch (mode)
+    {
+    case QImode: case HImode:
+      dest_cmp = gen_rtx_REG (SImode, REGNO(dest));
+      oldval_cmp = gen_rtx_REG (SImode, REGNO(oldval));
+      emit_insn (gen_zero_extendqisi2 (dest_cmp, dest));
+      emit_insn (gen_zero_extendqisi2 (oldval_cmp, oldval));
+      /* fall through */
+    case SImode:
+      x = gen_rtx_COMPARE (CCmode, dest_cmp, oldval_cmp);
+      emit_insn (gen_rtx_SET (VOIDmode, cond, x));
+      x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
+      x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label2, pc_rtx);
+      x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
+      break;
+    case DImode:
+      {
+        rtx sub1, sub2;
+        /* compare the high word */
+        sub1 = gen_highpart (SImode, dest);
+        sub2 = gen_highpart (SImode, oldval);
+        x = gen_rtx_COMPARE (CCmode, sub1, sub2);
+        emit_insn (gen_rtx_SET (VOIDmode, cond, x));
+        x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
+        x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label2, pc_rtx);
+        x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
+        /* compare the low word */
+        sub1 = gen_lowpart (SImode, dest);
+        sub2 = gen_lowpart (SImode, oldval);
+        x = gen_rtx_COMPARE (CCmode, sub1, sub2);
+        emit_insn (gen_rtx_SET (VOIDmode, cond, x));
+        x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
+        x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label2, pc_rtx);
+        x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
+        break;
+      }
+    default:
+      /* nothing else should get here. */
+      abort();
+    }
+
+  emit_store_conditional (mode, scratch, mem, newval);
+  x = gen_rtx_COMPARE (CCmode, scratch, const0_rtx);
+  emit_insn (gen_rtx_SET (VOIDmode, cond, x));
+
+  x = gen_rtx_NE (VOIDmode, cond, const0_rtx);
+  x = gen_rtx_IF_THEN_ELSE (VOIDmode, x, label1, pc_rtx);
+  x = emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, x));
+
+  emit_insn (gen_memory_sync ());
+  emit_label (XEXP (label2, 0));
+}
+/* APPLE LOCAL end 6258536 atomic builtins */
+
 /* APPLE LOCAL begin v7 support. Merge from mainline */
 /* Return the number of ARM instructions required to synthesize the given
    constant.  */
@@ -4725,11 +4849,13 @@
   /* ??? Combine arm and thumb2 coprocessor addressing modes.  */
   /* Standard coprocessor addressing modes.  */
   if (TARGET_HARD_FLOAT
-      && (TARGET_FPA || TARGET_MAVERICK)
+      /* APPLE LOCAL 7109945 floating point stores should use vstr */
+      && (TARGET_FPA || TARGET_MAVERICK || TARGET_VFP)
       && (GET_MODE_CLASS (mode) == MODE_FLOAT
 	  || (TARGET_MAVERICK && mode == DImode)))
     return (code == CONST_INT && INTVAL (index) < 1024
-	    && INTVAL (index) > -1024
+            /* APPLE LOCAL 7198870 STR only allows down to -255 offset */
+	    && INTVAL (index) > -256
 	    && (INTVAL (index) & 3) == 0);
 
   if (TARGET_REALLY_IWMMXT && VALID_IWMMXT_REG_MODE (mode))
@@ -8607,6 +8733,13 @@
       cond2 = temp;
     }
 
+  /* APPLE LOCAL begin 7174451 */
+  /* Punt for the unordered floating point comparisons */
+  if (cond1 == UNGT || cond1 == UNGE || cond1 == UNLT || cond1 == UNLE
+      || cond1 == UNEQ || cond1 == LTGT)
+    return CCmode;
+  /* APPLE LOCAL end 7174451 */
+
   switch (cond1)
     {
     case EQ:
@@ -19653,6 +19786,11 @@
           arg[argc] = TREE_VALUE (arglist);
           op[argc] = expand_expr (arg[argc], NULL_RTX, VOIDmode, 0);
           mode[argc] = insn_data[icode].operand[argc + have_retval].mode;
+          /* APPLE LOCAL 6574544 begin NEON builtin argument types */
+          /* Make sure the modes match. */
+          op[argc] = convert_to_mode (mode[argc], op[argc],
+                                      TYPE_UNSIGNED(TREE_TYPE(arg[argc])));
+          /* APPLE LOCAL 6574544 end NEON builtin argument types */
 
           arglist = TREE_CHAIN (arglist);
 

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm.h
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm.h?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm.h (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm.h Fri Sep 18 13:14:39 2009
@@ -425,6 +425,11 @@
 /* LLVM LOCAL Declare arm_arch7a for use when setting the target triple.  */
 extern int arm_arch7a;
 
+/* APPLE LOCAL begin 6258536 Atomic builtins */
+/* Nonzero if this chip supports the ARM Architecture 7a extensions.  */
+extern int arm_arch7a;
+/* APPLE LOCAL end 6258536 Atomic builtins */
+
 /* APPLE LOCAL begin v7 support. Merge from mainline */
 /* Nonzero if instructions not present in the 'M' profile can be used.  */
 extern int arm_arch_notm;
@@ -2733,7 +2738,10 @@
           if (is_called_in_ARM_mode (DECL)		\
 	      || (TARGET_THUMB1 && !TARGET_THUMB1_ONLY	\
 		  && current_function_is_thunk))	\
-            fprintf (STREAM, "\t.code 32\n") ;		\
+            {						\
+              fprintf (STREAM, "\t.align 2\n") ;	\
+              fprintf (STREAM, "\t.code 32\n") ;	\
+            }						\
           else						\
 /* APPLE LOCAL begin ARM thumb_func <symbol_name> */	\
 	    {						\
@@ -2828,7 +2836,8 @@
     int is_minus = GET_CODE (X) == MINUS;				\
 									\
     if (GET_CODE (X) == REG)						\
-      asm_fprintf (STREAM, "[%r, #0]", REGNO (X));			\
+      /* APPLE LOCAL 6258536 Atomic builtins */				\
+      asm_fprintf (STREAM, "[%r]", REGNO (X));				\
     else if (GET_CODE (X) == PLUS || is_minus)				\
       {									\
 	rtx base = XEXP (X, 0);						\

Modified: llvm-gcc-4.2/trunk/gcc/config/arm/arm.md
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/arm.md?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/arm.md (original)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/arm.md Fri Sep 18 13:14:39 2009
@@ -103,6 +103,11 @@
 ;; APPLE LOCAL end v7 support. Merge from Codesourcery
    ; APPLE LOCAL ARM UXTB support
    (UNSPEC_UXTB16   27) ; The UXTB16 instruction (ARM only)
+;; APPLE LOCAL begin 6258536 atomic builtins
+   (UNSPEC_CMPXCHG  28) ; Atomic compare and swap operations
+   (UNSPEC_BARRIER  29) ; memory barrier
+   (UNSPEC_SYNC     30) ; memory sync
+;; APPLE LOCAL end 6258536 atomic builtins
   ]
 )
 
@@ -143,6 +148,10 @@
    (VUNSPEC_POOL_STRING 21) ; `pool-entry(string)'.  An entry in the constant
 			    ;   pool for a string.
 			    ; APPLE LOCAL end ARM strings in code
+;; APPLE LOCAL begin 6258536 atomic builtins
+   (VUNSPEC_LL 22)          ; Load locked (ldrex)
+   (VUNSPEC_SC 22)          ; Store conditional (strex)
+;; APPLE LOCAL end 6258536 atomic builtins
   ]
 )
 
@@ -11957,4 +11966,6 @@
 ;; Neon patterns
 (include "neon.md")
 ;; APPLE LOCAL end v7 support. Merge from Codesourcery
+;; APPLE LOCAL 6258536 atomic builtins
+(include "sync.md")
 

Added: llvm-gcc-4.2/trunk/gcc/config/arm/sync.md
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/config/arm/sync.md?rev=82237&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/config/arm/sync.md (added)
+++ llvm-gcc-4.2/trunk/gcc/config/arm/sync.md Fri Sep 18 13:14:39 2009
@@ -0,0 +1,162 @@
+;; APPLE LOCAL file 6258536 atomic builtins
+;; Machine description for ARM synchronization instructions.
+;; Copyright (C) 2009 Free Software Foundation, Inc.
+;; Contributed by Apple, Inc.
+
+;; This file is part of GCC.
+
+;; GCC is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published
+;; by the Free Software Foundation; either version 2, or (at your
+;; option) any later version.
+
+;; GCC is distributed in the hope that it will be useful, but WITHOUT
+;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+;; License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GCC; see the file COPYING.  If not, write to the
+;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
+;; MA 02110-1301, USA.
+
+
+(define_mode_macro IMODE [QI HI SI DI])
+(define_mode_attr ldrex [(QI "ldrexb") (HI "ldrexh")
+                         (SI "ldrex") (DI "ldrexd")])
+(define_mode_attr strex [(QI "strexb") (HI "strexh")
+                         (SI "strex") (DI "strexd")])
+
+(define_expand "memory_barrier"
+  [(set (mem:BLK (match_dup 0))
+        (unspec:BLK [(mem:BLK (match_dup 0))] UNSPEC_BARRIER))]
+  "TARGET_32BIT && arm_arch6"
+{
+  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+  MEM_VOLATILE_P (operands[0]) = 1;
+  if (arm_arch6 && !arm_arch7a)
+    {
+      rtx par;
+      par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc(2));
+      /* v6 needs a scratch register */
+      XVECEXP (par, 0, 0) =
+        gen_rtx_SET (VOIDmode, gen_rtx_MEM (BLKmode, operands[0]),
+                     gen_rtx_UNSPEC (BLKmode,
+                                     gen_rtvec (1, gen_rtx_MEM (BLKmode,
+                                                                operands[0])),
+                                     UNSPEC_BARRIER));
+      XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG(SImode,
+                                                                   IP_REGNUM));
+      emit_insn (par);
+      DONE;
+    }
+})
+
+(define_insn "arm_memory_barrier_v7"
+  [(set (match_operand:BLK 0 "" "")
+        (unspec:BLK [(match_operand:BLK 1 "" "")] UNSPEC_BARRIER))]
+  "TARGET_32BIT && arm_arch7a"
+  "dmb"
+  [(set_attr "length" "4")]
+)
+
+(define_insn "arm_memory_barrier_v6"
+  [(set (match_operand:BLK 0 "" "")
+        (unspec:BLK [(match_operand:BLK 1 "" "")] UNSPEC_BARRIER))
+   (clobber (reg:SI IP_REGNUM))]
+  "TARGET_32BIT && arm_arch6 && !arm_arch7a"
+  "mov\tip, #0\n\tmcr\tp15, 0, ip, c7, c10, 5"
+  [(set (attr "length")
+	(if_then_else (eq_attr "is_thumb" "yes")
+		      (const_int 6)
+		      (const_int 8)))]
+)
+
+(define_expand "memory_sync"
+  [(set (mem:BLK (match_dup 0))
+        (unspec_volatile:BLK [(mem:BLK (match_dup 0))] UNSPEC_SYNC))]
+  "TARGET_32BIT && arm_arch6"
+{
+  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+  MEM_VOLATILE_P (operands[0]) = 1;
+  operands[0] = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (Pmode));
+  MEM_VOLATILE_P (operands[0]) = 1;
+  if (arm_arch6 && !arm_arch7a)
+    {
+      rtx par;
+      par = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc(2));
+      /* v6 needs a scratch register */
+      XVECEXP (par, 0, 0) =
+        gen_rtx_SET (BLKmode, operands[0],
+                     gen_rtx_UNSPEC_VOLATILE (BLKmode,
+                                              gen_rtvec (1, operands[0]),
+                                              UNSPEC_SYNC));
+      XVECEXP (par, 0, 1) = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG(SImode,
+                                                                   IP_REGNUM));
+      emit_insn (par);
+      DONE;
+    }
+})
+
+(define_insn "arm_memory_sync_v7"
+  [(set (match_operand:BLK 0 "" "")
+        (unspec_volatile:BLK [(mem:BLK (match_operand 1))] UNSPEC_SYNC))]
+  "TARGET_32BIT && arm_arch7a"
+  "dsb"
+  [(set_attr "length" "4")]
+)
+
+(define_insn "arm_memory_sync_v6"
+  [(set (match_operand:BLK 0 "" "")
+        (unspec_volatile:BLK [(mem:BLK (match_operand 1))] UNSPEC_SYNC))
+   (clobber (reg:SI IP_REGNUM))]
+  "TARGET_32BIT && arm_arch6 && !arm_arch7a"
+  "mov\tip, #0\n\tmcr\tp15, 0, ip, c7, c10, 4"
+  [(set (attr "length")
+	(if_then_else (eq_attr "is_thumb" "yes")
+		      (const_int 6)
+		      (const_int 8)))]
+)
+
+(define_insn "load_locked_<mode>"
+  [(set (match_operand:IMODE 0 "register_operand" "=r")
+        (unspec_volatile:IMODE
+          [(match_operand:IMODE 1 "memory_operand" "Q")] VUNSPEC_LL))]
+  "TARGET_32BIT && arm_arch6"
+  "<ldrex>\t%0, %1"
+  [(set_attr "length" "4")]
+)
+
+(define_insn "store_conditional_<mode>"
+  [(set (match_operand:SI 0 "register_operand" "=r")
+        (unspec_volatile:SI [(const_int 0)] VUNSPEC_SC))
+   (set (match_operand:IMODE 1 "memory_operand" "=Q")
+        (match_operand:IMODE 2 "register_operand" "r"))]
+  "TARGET_32BIT && arm_arch6"
+  "<strex>\t%0, %2, %1"
+  [(set_attr "length" "4")]
+)
+
+(define_insn_and_split "sync_compare_and_swap<mode>"
+  [(set (match_operand:IMODE 0 "register_operand" "=&r")
+	(match_operand:IMODE 1 "memory_operand" "+Q"))
+   (set (match_dup 1)
+	(unspec_volatile:IMODE
+	  [(match_dup 1)
+	   (match_operand:IMODE 2 "register_operand" "r")
+	   (match_operand:IMODE 3 "register_operand" "r")]
+	  UNSPEC_CMPXCHG))
+   (clobber (match_scratch:SI 4 "=&r"))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_32BIT && arm_arch6"
+  "#"
+  "&& reload_completed"
+  [(const_int 0)]
+{
+  arm_split_compare_and_swap(operands[0], operands[1], operands[2],
+                             operands[3], operands[4]);
+  DONE;
+}
+  [(set_attr "length" "48")]
+)
+

Modified: llvm-gcc-4.2/trunk/gcc/cp/decl.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/decl.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/decl.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/decl.c Fri Sep 18 13:14:39 2009
@@ -5309,8 +5309,9 @@
 }
 
 /* APPLE LOCAL begin blocks 6040305 (cr) */
-static tree block_byref_id_object_copy;
-static tree block_byref_id_object_dispose;
+#define BLOCK_ALIGN_MAX 18
+static tree block_byref_id_object_copy[BLOCK_BYREF_CURRENT_MAX*(BLOCK_ALIGN_MAX+1)];
+static tree block_byref_id_object_dispose[BLOCK_BYREF_CURRENT_MAX*(BLOCK_ALIGN_MAX+1)];
 
 /**
  This routine builds:
@@ -5321,14 +5322,14 @@
    _Block_object_assign(&_dest->object, _src->object, BLOCK_FIELD_IS_BLOCK[|BLOCK_FIELD_IS_WEAK])  //  blocks
  }  */
 static void
-synth_block_byref_id_object_copy_func (int flag)
+synth_block_byref_id_object_copy_func (int flag, int kind)
 {
   tree stmt;
   tree dst_arg, src_arg;
   tree dst_obj, src_obj;
   tree call_exp;
 
-  gcc_assert (block_byref_id_object_copy);
+  gcc_assert (block_byref_id_object_copy[kind]);
   /* Set up: (void* _dest, void*_src) parameters. */
   dst_arg = build_decl (PARM_DECL, get_identifier ("_dst"),
                         ptr_type_node);
@@ -5345,12 +5346,12 @@
                                tree_cons (NULL_TREE,
                                           ptr_type_node,
                                           NULL_TREE)); */
-  DECL_ARGUMENTS (block_byref_id_object_copy) = dst_arg;
+  DECL_ARGUMENTS (block_byref_id_object_copy[kind]) = dst_arg;
   /* function header synthesis. */
   push_function_context ();
-  /* start_block_helper_function (block_byref_id_object_copy, true); */
+  /* start_block_helper_function (block_byref_id_object_copy[kind], true); */
   /* store_parm_decls_from (arg_info); */
-  start_preparsed_function (block_byref_id_object_copy,
+  start_preparsed_function (block_byref_id_object_copy[kind],
                             /*attrs*/NULL_TREE,
                             SF_PRE_PARSED);
 
@@ -5387,12 +5388,12 @@
     _Block_object_dispose(_src->object, BLOCK_FIELD_IS_OBJECT[|BLOCK_FIELD_IS_WEAK]) // objects
     _Block_object_dispose(_src->object, BLOCK_FIELD_IS_BLOCK[|BLOCK_FIELD_IS_WEAK]) // blocks
   }  */
-static void synth_block_byref_id_object_dispose_func (int flag)
+static void synth_block_byref_id_object_dispose_func (int flag, int kind)
 {
   tree stmt;
   tree src_arg, src_obj, rel_exp;
 
-  gcc_assert (block_byref_id_object_dispose);
+  gcc_assert (block_byref_id_object_dispose[kind]);
   /* Set up: (void *_src) parameter. */
   src_arg = build_decl (PARM_DECL, get_identifier ("_src"),
                         ptr_type_node);
@@ -5402,12 +5403,12 @@
      arg_info->parms = src_arg;
      arg_info->types = tree_cons (NULL_TREE, ptr_type_node,
                                   NULL_TREE); */
-  DECL_ARGUMENTS (block_byref_id_object_dispose) = src_arg;
+  DECL_ARGUMENTS (block_byref_id_object_dispose[kind]) = src_arg;
   /* function header synthesis. */
   push_function_context ();
-  /* start_block_helper_function (block_byref_id_object_dispose, true); */
+  /* start_block_helper_function (block_byref_id_object_dispose[kind], true); */
   /* store_parm_decls_from (arg_info); */
-  start_preparsed_function (block_byref_id_object_dispose,
+  start_preparsed_function (block_byref_id_object_dispose[kind],
                             /*attrs*/NULL_TREE,
                             SF_PRE_PARSED);
 
@@ -5602,10 +5603,17 @@
 
   if (COPYABLE_BYREF_LOCAL_NONPOD (decl))
     {
-      char name [64];
+      char name[64];
+      int align = exact_log2 ((DECL_ALIGN (decl)+TYPE_ALIGN (ptr_type_node)-1) / TYPE_ALIGN (ptr_type_node));
+      int kind;
+      if (align == -1 || align > BLOCK_ALIGN_MAX) {
+	error ("invalid alignment for __block variable");
+	kind = 0;
+      } else
+	kind = align*BLOCK_BYREF_CURRENT_MAX + flag;
       /* Add &__Block_byref_id_object_copy, &__Block_byref_id_object_dispose
 	 initializers. */
-      if (!block_byref_id_object_copy)
+      if (!block_byref_id_object_copy[kind])
 	{
 	  tree func_type;
 	  push_lang_context (lang_name_c);
@@ -5616,19 +5624,19 @@
 					    tree_cons (NULL_TREE, ptr_type_node,
 						       void_list_node)));
 	  strcpy (name, "__Block_byref_id_object_copy");
-	  block_byref_id_object_copy = build_helper_func_decl (get_identifier (name),
-							       func_type);
-	  DECL_CONTEXT (block_byref_id_object_copy) = current_function_decl;
+	  block_byref_id_object_copy[kind] = build_helper_func_decl (get_identifier (name),
+								     func_type);
+	  DECL_CONTEXT (block_byref_id_object_copy[kind]) = current_function_decl;
 	  /* Synthesize function definition. */
-	  synth_block_byref_id_object_copy_func (flag);
+	  synth_block_byref_id_object_copy_func (flag, kind);
 	  pop_lang_context ();
 	}
       initlist = tree_cons (fields,
-			    build_fold_addr_expr (block_byref_id_object_copy),
+			    build_fold_addr_expr (block_byref_id_object_copy[kind]),
 			    initlist);
       fields = TREE_CHAIN (fields);
 
-      if (!block_byref_id_object_dispose)
+      if (!block_byref_id_object_dispose[kind])
 	{
 	  tree func_type;
 	  push_lang_context (lang_name_c);
@@ -5638,15 +5646,15 @@
 	    build_function_type (void_type_node,
 				 tree_cons (NULL_TREE, ptr_type_node, void_list_node));
 	  strcpy (name, "__Block_byref_id_object_dispose");
-	  block_byref_id_object_dispose = build_helper_func_decl (get_identifier (name),
-								  func_type);
-	  DECL_CONTEXT (block_byref_id_object_dispose) = current_function_decl;
+	  block_byref_id_object_dispose[kind] = build_helper_func_decl (get_identifier (name),
+									func_type);
+	  DECL_CONTEXT (block_byref_id_object_dispose[kind]) = current_function_decl;
 	  /* Synthesize function definition. */
-	  synth_block_byref_id_object_dispose_func (flag);
+	  synth_block_byref_id_object_dispose_func (flag, kind);
 	  pop_lang_context ();
 	}
       initlist = tree_cons (fields,
-			    build_fold_addr_expr (block_byref_id_object_dispose),
+			    build_fold_addr_expr (block_byref_id_object_dispose[kind]),
 			    initlist);
       fields = TREE_CHAIN (fields);
     }

Modified: llvm-gcc-4.2/trunk/gcc/doc/extend.texi
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/doc/extend.texi?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/doc/extend.texi (original)
+++ llvm-gcc-4.2/trunk/gcc/doc/extend.texi Fri Sep 18 13:14:39 2009
@@ -90,6 +90,8 @@
 * Pragmas::             Pragmas accepted by GCC.
 * Unnamed Fields::      Unnamed struct/union fields within structs/unions.
 * Thread-Local::        Per-thread variables.
+ at c APPLE LOCAL blocks 7205047 5811887
+* Blocks::              Anonymous functions (closures).
 @end menu
 
 @node Statement Exprs
@@ -10907,6 +10909,18 @@
 @end quotation
 @end itemize
 
+ at c APPLE LOCAL begin blocks 7205047 5811887
+ at node Blocks
+ at section Blocks
+ at cindex Blocks
+ at cindex __block
+
+Blocks is a language feature that allows one to create anonymous
+functions.  The feature is also known as lambdas or closures in other
+languages.  The feature is controlled by @option{-fblocks}.
+See @uref{http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html} for additional details.
+ at c APPLE LOCAL end blocks 7205047 5811887
+
 @node C++ Extensions
 @chapter Extensions to the C++ Language
 @cindex extensions, C++ language

Modified: llvm-gcc-4.2/trunk/gcc/doc/invoke.texi
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/doc/invoke.texi?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/doc/invoke.texi (original)
+++ llvm-gcc-4.2/trunk/gcc/doc/invoke.texi Fri Sep 18 13:14:39 2009
@@ -195,7 +195,8 @@
 -faltivec (APPLE ONLY) @gol
 @c APPLE LOCAL CW asm blocks
 -fasm-blocks (APPLE ONLY) @gol
--fno-asm  -fno-builtin  -fno-builtin- at var{function} @gol
+ at c APPLE LOCAL blocks 7205047 5811887
+-fno-asm -fno-blocks -fno-builtin  -fno-builtin- at var{function} @gol
 -fhosted  -ffreestanding -fopenmp -fms-extensions @gol
 -trigraphs  -no-integrated-cpp  -traditional  -traditional-cpp @gol
 @c APPLE LOCAL 5612787 sse4
@@ -1455,6 +1456,16 @@
 switch only affects the @code{asm} and @code{typeof} keywords, since
 @code{inline} is a standard keyword in ISO C99.
 
+ at c APPLE LOCAL begin blocks 7205047 5811887
+ at item -fno-blocks
+ at opindex fno-blocks
+Disable the use of blocks.  In @option{-std=c99} mode, blocks are
+turned off by default.  @option{-fblocks} can be used to re-enable the
+feature, if off.  Runtime support for blocks first appeared in Mac OS
+X 10.6.  When targeting 10.6 (see @option{-mmacosx-version-min}) and
+later, the extension is on by default.
+ at c APPLE LOCAL end blocks 7205047 5811887
+
 @item -fno-builtin
 @itemx -fno-builtin- at var{function}
 @opindex fno-builtin

Added: llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-weak.C
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/g%2B%2B.apple/block-weak.C?rev=82237&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-weak.C (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/g++.apple/block-weak.C Fri Sep 18 13:14:39 2009
@@ -0,0 +1,16 @@
+/* APPLE LOCAL file blocks 7184496 */
+/* Test __weak attribute on __block objects. */
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-fblocks -ObjC++ -fobjc-gc" { target *-*-darwin* } } */
+/* Radar 7184496 */
+
+void nonweakfofo() {
+  __block void (^weakSelf)();
+}
+
+void weakfofo() {
+  __block __weak void (^weakSelf)();
+}
+
+/* { dg-final { scan-assembler "151" } } */
+/* { dg-final { scan-assembler "135" } } */

Added: llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-weak.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-weak.c?rev=82237&view=auto

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-weak.c (added)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/gcc.apple/block-weak.c Fri Sep 18 13:14:39 2009
@@ -0,0 +1,16 @@
+/* APPLE LOCAL file blocks 7184496 */
+/* Test __weak attribute on __block objects. */
+/* { dg-do compile { target *-*-darwin* } } */
+/* { dg-options "-fblocks -ObjC -fobjc-gc" { target *-*-darwin* } } */
+/* Radar 7184496 */
+
+void nonweakfofo(void) {
+  __block (^weakSelf)();
+}
+
+void weakfofo(void) {
+  __block __weak (^weakSelf)();
+}
+
+/* { dg-final { scan-assembler "151" } } */
+/* { dg-final { scan-assembler "135" } } */

Modified: llvm-gcc-4.2/trunk/gcc/testsuite/lib/target-supports.exp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/testsuite/lib/target-supports.exp?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/testsuite/lib/target-supports.exp (original)
+++ llvm-gcc-4.2/trunk/gcc/testsuite/lib/target-supports.exp Fri Sep 18 13:14:39 2009
@@ -1952,14 +1952,17 @@
         set et_sync_int_long_saved 0
 # This is intentionally powerpc but not rs6000, rs6000 doesn't have the
 # load-reserved/store-conditional instructions.
+# APPLE LOCAL begin 6258536 atomic builtins
         if { [istarget ia64-*-*]
 	     || [istarget i?86-*-*]
+	     || [istarget arm*-*-darwin*]
 	     || [istarget x86_64-*-*]
 	     || [istarget alpha*-*-*] 
 	     || [istarget s390*-*-*] 
 	     || [istarget powerpc*-*-*]
 	     || [istarget sparc64-*-*]
 	     || [istarget sparcv9-*-*] } {
+# APPLE LOCAL end 6258536 atomic builtins
            set et_sync_int_long_saved 1
         }
     }

Modified: llvm-gcc-4.2/trunk/gcc/version.c
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/version.c?rev=82237&r1=82236&r2=82237&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/version.c (original)
+++ llvm-gcc-4.2/trunk/gcc/version.c Fri Sep 18 13:14:39 2009
@@ -11,12 +11,12 @@
 /* APPLE LOCAL begin Apple version */
 #ifdef ENABLE_LLVM
 #ifdef LLVM_VERSION_INFO
-#define VERSUFFIX " (Based on Apple Inc. build 5649) (LLVM build " LLVM_VERSION_INFO ")"
+#define VERSUFFIX " (Based on Apple Inc. build 5653) (LLVM build " LLVM_VERSION_INFO ")"
 #else
-#define VERSUFFIX " (Based on Apple Inc. build 5649) (LLVM build)"
+#define VERSUFFIX " (Based on Apple Inc. build 5653) (LLVM build)"
 #endif
 #else
-#define VERSUFFIX " (Based on Apple Inc. build 5649)"
+#define VERSUFFIX " (Based on Apple Inc. build 5653)"
 #endif
 /* APPLE LOCAL end Apple version */
 





More information about the llvm-commits mailing list