aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@acm.org>2007-12-13 19:03:45 +0000
committerBob Wilson <bob.wilson@acm.org>2007-12-13 19:03:45 +0000
commit38f9cb7fe14013c49fff2ed04c3cf6406e7077e6 (patch)
tree3440ff2ed546b7d34ed84afeff334123e8b0f51d /gas
parent3690dd376bc19907f4c229fc3471b9898386d32c (diff)
downloadgdb-38f9cb7fe14013c49fff2ed04c3cf6406e7077e6.zip
gdb-38f9cb7fe14013c49fff2ed04c3cf6406e7077e6.tar.gz
gdb-38f9cb7fe14013c49fff2ed04c3cf6406e7077e6.tar.bz2
gas/
* config/tc-xtensa.c (xg_symbolic_immeds_fit): Relax for weak references but not weak definitions. gas/testsuite/ * gas/xtensa/all.exp: Run new weak-call test. * gas/xtensa/weak-call.d: New. * gas/xtensa/weak-call.s: New.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-xtensa.c10
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/xtensa/all.exp1
-rw-r--r--gas/testsuite/gas/xtensa/weak-call.d11
-rw-r--r--gas/testsuite/gas/xtensa/weak-call.s8
6 files changed, 39 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5748053..a68a38f 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2007-12-13 Bob Wilson <bob.wilson@acm.org>
+
+ * config/tc-xtensa.c (xg_symbolic_immeds_fit): Relax for weak
+ references but not weak definitions.
+
2007-12-12 Bob Wilson <bob.wilson@acm.org>
* config/tc-xtensa.c (xg_symbolic_immeds_fit): Do not relax calls to
diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c
index 051f79f..e632ef3 100644
--- a/gas/config/tc-xtensa.c
+++ b/gas/config/tc-xtensa.c
@@ -3241,9 +3241,15 @@ xg_symbolic_immeds_fit (const TInsn *insn,
|| S_GET_SEGMENT (expr->X_add_symbol) != pc_seg)
{
/* For a direct call with --no-longcalls, be optimistic and
- assume it will be in range. */
+ assume it will be in range. If the symbol is weak and
+ undefined, it may remain undefined at link-time, in which
+ case it will have a zero value and almost certainly be out
+ of range for a direct call; thus, relax for undefined weak
+ symbols even if longcalls is not enabled. */
if (is_direct_call_opcode (insn->opcode)
- && ! pc_frag->tc_frag_data.use_longcalls)
+ && ! pc_frag->tc_frag_data.use_longcalls
+ && (! S_IS_WEAK (expr->X_add_symbol)
+ || S_IS_DEFINED (expr->X_add_symbol)))
return TRUE;
return FALSE;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 9de1854..c95d172 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2007-12-13 Bob Wilson <bob.wilson@acm.org>
+
+ * gas/xtensa/all.exp: Run new weak-call test.
+ * gas/xtensa/weak-call.d: New.
+ * gas/xtensa/weak-call.s: New.
+
2007-12-11 Catherine Moore <clm@codesourcery.com>
gas/elf/symtab.s: New test.
diff --git a/gas/testsuite/gas/xtensa/all.exp b/gas/testsuite/gas/xtensa/all.exp
index d4b2493..85c0716 100644
--- a/gas/testsuite/gas/xtensa/all.exp
+++ b/gas/testsuite/gas/xtensa/all.exp
@@ -80,6 +80,7 @@ if [istarget xtensa*-*-*] then {
run_dump_test "short_branch_offset"
run_dump_test "pcrel"
+ run_dump_test "weak-call"
}
if [info exists errorInfo] then {
diff --git a/gas/testsuite/gas/xtensa/weak-call.d b/gas/testsuite/gas/xtensa/weak-call.d
new file mode 100644
index 0000000..0b8d84b
--- /dev/null
+++ b/gas/testsuite/gas/xtensa/weak-call.d
@@ -0,0 +1,11 @@
+#as:
+#objdump: -r -j .text
+#name: relaxing calls to weak symbols
+
+.*: +file format .*xtensa.*
+
+RELOCATION RECORDS FOR \[\.text\]:
+OFFSET TYPE VALUE
+00000000 R_XTENSA_SLOT0_OP weakdef
+00000003 R_XTENSA_SLOT0_OP \.literal
+00000003 R_XTENSA_ASM_EXPAND weakref
diff --git a/gas/testsuite/gas/xtensa/weak-call.s b/gas/testsuite/gas/xtensa/weak-call.s
new file mode 100644
index 0000000..d6800c5
--- /dev/null
+++ b/gas/testsuite/gas/xtensa/weak-call.s
@@ -0,0 +1,8 @@
+ .text
+ .begin no-longcalls
+ .weak weakdef
+ call8 weakdef
+weakdef:
+ .weak weakref
+ call8 weakref
+ .end no-longcalls