[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