generic-poky/openembedded/packages/gcc/gcc-3.3.4/arm-gotoff.dpatch

136 lines
4.1 KiB
Plaintext

#! /bin/sh -e
src=gcc
if [ $# -eq 3 -a "$2" = '-d' ]; then
pdir="-d $3"
src=$3/gcc
elif [ $# -ne 1 ]; then
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
fi
case "$1" in
-patch)
patch $pdir -f --no-backup-if-mismatch -p0 --fuzz 10 < $0
;;
-unpatch)
patch $pdir -f --no-backup-if-mismatch -R -p0 --fuzz 10 < $0
;;
*)
echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
exit 1
esac
exit 0
# DP: use GOTOFF not GOT relocs for .LCn and other local symbols;
# DP: don't use gotoff for non-static functions, even if defined locally
--- gcc/config/arm/arm.c 2003-06-14 15:20:53.000000000 +0100
+++ gcc/config/arm/arm.c 2004-03-06 15:15:32.000000000 +0000
@@ -2364,6 +2394,40 @@
return 1;
}
+/* Return true if OP is a symbolic operand that resolves locally. */
+
+static int
+local_symbolic_operand (op, mode)
+ rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ if (GET_CODE (op) == CONST
+ && GET_CODE (XEXP (op, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
+ op = XEXP (XEXP (op, 0), 0);
+
+ if (GET_CODE (op) == LABEL_REF)
+ return 1;
+
+ if (GET_CODE (op) != SYMBOL_REF)
+ return 0;
+
+ /* These we've been told are local by varasm and encode_section_info
+ respectively. */
+ if (CONSTANT_POOL_ADDRESS_P (op) || ENCODED_LOCAL_BINDING_ATTR_P (XSTR (op, 0)))
+ return 1;
+
+ /* There is, however, a not insubstantial body of code in the rest of
+ the compiler that assumes it can just stick the results of
+ ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */
+ /* ??? This is a hack. Should update the body of the compiler to
+ always create a DECL an invoke targetm.encode_section_info. */
+ if (strncmp (arm_strip_name_encoding (XSTR (op, 0)), ".L", 2) == 0)
+ return 1;
+
+ return 0;
+}
+
rtx
legitimize_pic_address (orig, mode, reg)
rtx orig;
@@ -2404,10 +2468,7 @@
else
emit_insn (gen_pic_load_addr_thumb (address, orig));
- if ((GET_CODE (orig) == LABEL_REF
- || (GET_CODE (orig) == SYMBOL_REF &&
- ENCODED_SHORT_CALL_ATTR_P (XSTR (orig, 0))))
- && NEED_GOT_RELOC)
+ if (local_symbolic_operand (orig, Pmode) && NEED_GOT_RELOC)
pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, address);
else
{
@@ -8804,11 +8911,7 @@
if (NEED_GOT_RELOC && flag_pic && making_const_table &&
(GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF))
{
- if (GET_CODE (x) == SYMBOL_REF
- && (CONSTANT_POOL_ADDRESS_P (x)
- || ENCODED_SHORT_CALL_ATTR_P (XSTR (x, 0))))
- fputs ("(GOTOFF)", asm_out_file);
- else if (GET_CODE (x) == LABEL_REF)
+ if (local_symbolic_operand (x, Pmode))
fputs ("(GOTOFF)", asm_out_file);
else
fputs ("(GOT)", asm_out_file);
@@ -11335,6 +11418,11 @@
else if (! TREE_PUBLIC (decl))
arm_encode_call_attribute (decl, SHORT_CALL_FLAG_CHAR);
}
+
+ if (TREE_CODE_CLASS (TREE_CODE (decl)) == 'd'
+ && flag_pic
+ && (*targetm.binds_local_p) (decl))
+ arm_encode_call_attribute (decl, LOCAL_BINDING_FLAG_CHAR);
}
#endif /* !ARM_PE */
--- gcc/config/arm/arm.h Fri Mar 5 18:49:44 2004
+++ gcc/config/arm/arm.h Fri Mar 5 15:04:31 2004
@@ -1870,6 +1870,7 @@
Note, '@' and '*' have already been taken. */
#define SHORT_CALL_FLAG_CHAR '^'
#define LONG_CALL_FLAG_CHAR '#'
+#define LOCAL_BINDING_FLAG_CHAR '%'
#define ENCODED_SHORT_CALL_ATTR_P(SYMBOL_NAME) \
(*(SYMBOL_NAME) == SHORT_CALL_FLAG_CHAR)
@@ -1877,6 +1878,9 @@
#define ENCODED_LONG_CALL_ATTR_P(SYMBOL_NAME) \
(*(SYMBOL_NAME) == LONG_CALL_FLAG_CHAR)
+#define ENCODED_LOCAL_BINDING_ATTR_P(SYMBOL_NAME) \
+ (*(SYMBOL_NAME) == LOCAL_BINDING_FLAG_CHAR)
+
#ifndef SUBTARGET_NAME_ENCODING_LENGTHS
#define SUBTARGET_NAME_ENCODING_LENGTHS
#endif
@@ -1888,6 +1892,7 @@
#define ARM_NAME_ENCODING_LENGTHS \
case SHORT_CALL_FLAG_CHAR: return 1; \
case LONG_CALL_FLAG_CHAR: return 1; \
+ case LOCAL_BINDING_FLAG_CHAR: return 1; \
case '*': return 1; \
SUBTARGET_NAME_ENCODING_LENGTHS