136 lines
4.1 KiB
Plaintext
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
|
|
|