This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Stopping GAS from resolving IFUNC symbols itself
- From: Richard Sandiford <richard dot sandiford at linaro dot org>
- To: binutils at sourceware dot org
- Date: Tue, 30 Nov 2010 10:51:21 +0000
- Subject: Stopping GAS from resolving IFUNC symbols itself
One problem I've hit while working on the ARM STT_GNU_IFUNC support is
that things like:
.type foo,%gnu_indirect_function
foo:
...
.size foo,.-foo
...
.4byte foo-. # still in same section as foo
get resolved at assembly time, and don't produce a relocation.
This situtation probably doesn't occur in practice for x86 and x86_64.
The reloc would generally be in a read-only data section rather than in
.text itself, and in that situation, gas does of course produce a
relocation. References from the same section could reasonably be used
in ARM constant tables though.
I think this points to a more general bug: we're treating references to
indirect function symbols in the same way that we treat references to
weak and (on ELF targets) global symbols. They seem fundamentally
different though. If the assembler sees something like:
.globl foo
foo:
then it has no idea whether the user wants to be able to override
foo or not. The final link might not even be dynamic. So if the
code also contains:
.globl bar
bar:
.4byte bar - foo
then the assembler should resolve foo locally rather than emit
a fatal error.
The weak case is less obvious, but there are cases where it's the same.
A program might optionally link in a file foo.o that defines F. Other
objects might then treat F as weak so that they don't need to be
recompiled depending on the presence of foo.o. But the user might know
that foo.o's F is the only real definition that will ever be used, and a
header file might nevertheless cause foo.o to define F as weak. It would
then be wrong for the assembler to reject "foo - F" in foo.o.
In short, the definition that gas sees for ordinary weak and global
symbols _could_ also be the definition that the linker uses to resolve
relocations. That's never true for ifunc symbols though, because the
linker will use a PLT instead. Gas should never resolve ifunc symbols
itself.
I think this means that S_FORCE_RELOC is wrong: the check for indirect
functions shouldn't be restricted to strict mode. Also, various parts
of GAS assume that locally-defined symbols can always be used. Now that
we have a case where that isn't true, those pieces of code should check
S_FORCE_RELOC as well.
One decision was whether to push these S_FORCE_RELOC checks into
the TC_FORCE_RELOCATION_*s that are missing them (particularly
the SUB ones), or whether to check them in fixup_segment itself.
I went for the latter because I can't see any situation in which
a target would want to override this behaviour.
Patch tested on x86_64-linux-gnu. Since the patch touches only
target-independent code, I intend to commit it in a couple of days
unless there are objections.
Richard
gas/
* symbols.c (S_FORCE_RELOC): Return true for indirect functions
even if !strict.
* expr.c (operand): Don't convert absolute symbols to constants
if S_FORCE_RELOC is true.
(expr): Only reduce subtractions between different symbols if
S_FORCE_RELOC is false for both of them.
* write.c (fixup_segment): Don't remove symbols if S_FORCE_RELOC
is true for them, regardless of their segment.
gas/testsuite/
* gas/i386/ifunc-2.s, gas/i386/ifunc-2.l: New test.
* gas/i386/ifunc-3.s, gas/i386/ifunc-3.d: Likeise.
* gas/i386/i386.exp: Run them.
Index: gas/symbols.c
===================================================================
--- gas/symbols.c 2010-11-29 14:40:49.000000000 +0000
+++ gas/symbols.c 2010-11-29 14:42:36.000000000 +0000
@@ -2052,9 +2052,9 @@ S_FORCE_RELOC (symbolS *s, int strict)
return ((strict
&& ((s->bsym->flags & BSF_WEAK) != 0
- || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
|| (EXTERN_FORCE_RELOC
&& (s->bsym->flags & BSF_GLOBAL) != 0)))
+ || (s->bsym->flags & BSF_GNU_INDIRECT_FUNCTION) != 0
|| s->bsym->section == undefined_section
|| bfd_is_com_section (s->bsym->section));
}
Index: gas/expr.c
===================================================================
--- gas/expr.c 2010-11-29 14:40:49.000000000 +0000
+++ gas/expr.c 2010-11-29 14:42:36.000000000 +0000
@@ -1325,7 +1325,9 @@ operand (expressionS *expressionP, enum
/* If we have an absolute symbol or a reg, then we know its
value now. */
segment = S_GET_SEGMENT (symbolP);
- if (mode != expr_defer && segment == absolute_section)
+ if (mode != expr_defer
+ && segment == absolute_section
+ && !S_FORCE_RELOC (symbolP, 0))
{
expressionP->X_op = O_constant;
expressionP->X_add_number = S_GET_VALUE (symbolP);
@@ -1835,7 +1837,9 @@ expr (int rankarg, /* Larger # is highe
#ifdef md_allow_local_subtract
&& md_allow_local_subtract (resultP, & right, rightseg)
#endif
- && (SEG_NORMAL (rightseg)
+ && ((SEG_NORMAL (rightseg)
+ && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
+ && !S_FORCE_RELOC (right.X_add_symbol, 0))
|| right.X_add_symbol == resultP->X_add_symbol)
&& frag_offset_fixed_p (symbol_get_frag (resultP->X_add_symbol),
symbol_get_frag (right.X_add_symbol),
@@ -1949,7 +1953,10 @@ expr (int rankarg, /* Larger # is highe
else if (op_left == O_subtract)
{
resultP->X_add_number -= right.X_add_number;
- if (retval == rightseg && SEG_NORMAL (retval))
+ if (retval == rightseg
+ && SEG_NORMAL (retval)
+ && !S_FORCE_RELOC (resultP->X_add_symbol, 0)
+ && !S_FORCE_RELOC (right.X_add_symbol, 0))
{
retval = absolute_section;
rightseg = absolute_section;
Index: gas/write.c
===================================================================
--- gas/write.c 2010-11-29 14:40:49.000000000 +0000
+++ gas/write.c 2010-11-29 14:57:53.000000000 +0000
@@ -932,6 +932,8 @@ fixup_segment (fixS *fixP, segT this_seg
sub_symbol_segment = S_GET_SEGMENT (fixP->fx_subsy);
if (fixP->fx_addsy != NULL
&& sub_symbol_segment == add_symbol_segment
+ && !S_FORCE_RELOC (fixP->fx_addsy, 0)
+ && !S_FORCE_RELOC (fixP->fx_subsy, 0)
&& !TC_FORCE_RELOCATION_SUB_SAME (fixP, add_symbol_segment))
{
add_number += S_GET_VALUE (fixP->fx_addsy);
@@ -945,6 +947,7 @@ fixup_segment (fixS *fixP, segT this_seg
#endif
}
else if (sub_symbol_segment == absolute_section
+ && !S_FORCE_RELOC (fixP->fx_subsy, 0)
&& !TC_FORCE_RELOCATION_SUB_ABS (fixP, add_symbol_segment))
{
add_number -= S_GET_VALUE (fixP->fx_subsy);
@@ -952,6 +955,7 @@ fixup_segment (fixS *fixP, segT this_seg
fixP->fx_subsy = NULL;
}
else if (sub_symbol_segment == this_segment
+ && !S_FORCE_RELOC (fixP->fx_subsy, 0)
&& !TC_FORCE_RELOCATION_SUB_LOCAL (fixP, add_symbol_segment))
{
add_number -= S_GET_VALUE (fixP->fx_subsy);
@@ -994,6 +998,7 @@ fixup_segment (fixS *fixP, segT this_seg
if (fixP->fx_addsy)
{
if (add_symbol_segment == this_segment
+ && !S_FORCE_RELOC (fixP->fx_addsy, 0)
&& !TC_FORCE_RELOCATION_LOCAL (fixP))
{
/* This fixup was made when the symbol's segment was
@@ -1007,6 +1012,7 @@ fixup_segment (fixS *fixP, segT this_seg
fixP->fx_pcrel = 0;
}
else if (add_symbol_segment == absolute_section
+ && !S_FORCE_RELOC (fixP->fx_addsy, 0)
&& !TC_FORCE_RELOCATION_ABS (fixP))
{
add_number += S_GET_VALUE (fixP->fx_addsy);
Index: gas/testsuite/gas/i386/ifunc-2.s
===================================================================
--- /dev/null 2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-2.s 2010-11-29 14:50:24.000000000 +0000
@@ -0,0 +1,100 @@
+ .section .text.1,"ax",@progbits
+
+start1:
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start1-bar1
+ .long start1-bar2
+ .long bar1-abs1
+ .long abs1-bar1
+ .long .-bar1
+
+ .type foo1,%gnu_indirect_function
+foo1:
+ ret
+ .size foo1,.-foo1
+
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start1-bar1
+ .long start1-bar2
+ .long bar1-abs1
+ .long abs1-bar1
+ .long .-bar1
+
+ .type bar1,%gnu_indirect_function
+bar1:
+ ret
+ .size bar1,.-bar1
+
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start1-bar1
+ .long start1-bar2
+ .long bar1-abs1
+ .long abs1-bar1
+ .long .-bar1
+
+ .long abs1-abs2
+ .long abs2-abs1
+
+ .equ abs1,0x11223300
+ .type abs1,%gnu_indirect_function
+
+ .long abs1-abs2
+ .long abs2-abs1
+
+ .equ abs2,0x11223380
+ .type abs2,%gnu_indirect_function
+
+ .long abs1-abs2
+ .long abs2-abs1
+
+ .section .text.2,"ax",@progbits
+
+start2:
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start2-bar1
+ .long start2-bar2
+ .long bar2-abs1
+ .long abs1-bar2
+ .long .-bar2
+
+ .type foo2,%gnu_indirect_function
+foo2:
+ ret
+ .size foo2,.-foo2
+
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start2-bar1
+ .long start2-bar2
+ .long bar2-abs1
+ .long abs1-bar2
+ .long .-bar2
+
+ .type bar2,%gnu_indirect_function
+bar2:
+ ret
+ .size bar2,.-bar2
+
+ .long bar1-foo1
+ .long bar2-foo2
+ .long bar1-bar2
+ .long bar2-bar1
+ .long start2-bar1
+ .long start2-bar2
+ .long bar2-abs1
+ .long abs1-bar2
+ .long .-bar2
Index: gas/testsuite/gas/i386/ifunc-2.l
===================================================================
--- /dev/null 2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-2.l 2010-11-29 14:48:20.000000000 +0000
@@ -0,0 +1,61 @@
+.*/ifunc-2\.s: Assembler messages:
+.*/ifunc-2\.s:4: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:5: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:6: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:7: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:8: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:9: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:10: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:11: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:12: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:19: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:20: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:21: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:22: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:23: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:24: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:25: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:26: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:27: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:34: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:35: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:36: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:37: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:38: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:39: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:40: Error: can't resolve `bar1' {\.text\.1 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:41: Error: can't resolve `abs1' {\*ABS\* section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:42: Error: can't resolve `\.text\.1' {\.text\.1 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:44: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:45: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:50: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:51: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:56: Error: can't resolve `abs1' {\*ABS\* section} - `abs2' {\*ABS\* section}
+.*/ifunc-2\.s:57: Error: can't resolve `abs2' {\*ABS\* section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:62: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:63: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:64: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:65: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:66: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:67: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:68: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:69: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:70: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:77: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:78: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:79: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:80: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:81: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:82: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:83: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:84: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:85: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:92: Error: can't resolve `bar1' {\.text\.1 section} - `foo1' {\.text\.1 section}
+.*/ifunc-2\.s:93: Error: can't resolve `bar2' {\.text\.2 section} - `foo2' {\.text\.2 section}
+.*/ifunc-2\.s:94: Error: can't resolve `bar1' {\.text\.1 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:95: Error: can't resolve `bar2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:96: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar1' {\.text\.1 section}
+.*/ifunc-2\.s:97: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:98: Error: can't resolve `bar2' {\.text\.2 section} - `abs1' {\*ABS\* section}
+.*/ifunc-2\.s:99: Error: can't resolve `abs1' {\*ABS\* section} - `bar2' {\.text\.2 section}
+.*/ifunc-2\.s:100: Error: can't resolve `\.text\.2' {\.text\.2 section} - `bar2' {\.text\.2 section}
Index: gas/testsuite/gas/i386/ifunc-3.s
===================================================================
--- /dev/null 2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-3.s 2010-11-29 15:03:48.000000000 +0000
@@ -0,0 +1,54 @@
+ .section .text.1,"ax",@progbits
+
+start1:
+ .long bar1-.
+ .long bar2-.
+ .long bar1-start1
+ .long bar2-start1
+ .long bar1-base
+
+ .type bar1,%gnu_indirect_function
+bar1:
+ ret
+ .size bar1,.-bar1
+ .align 4
+
+ .long bar1-.
+ .long bar2-.
+ .long bar1-start1
+ .long bar2-start1
+ .long bar1-base
+
+ .long abs1-.
+ .long abs1-start1
+ .long abs1-base
+
+ .equ abs1,0x11223300
+ .type abs1,%gnu_indirect_function
+
+ .long abs1-.
+ .long abs1-start1
+ .long abs1-base
+
+ .section .text.2,"ax",@progbits
+
+start2:
+ .long bar1-.
+ .long bar2-.
+ .long bar1-start2
+ .long bar2-start2
+ .long bar2-base
+
+ .type bar2,%gnu_indirect_function
+bar2:
+ ret
+ .size bar2,.-bar2
+ .align 4
+
+ .long bar1-.
+ .long bar2-.
+ .long bar1-start2
+ .long bar2-start2
+ .long bar2-base
+
+ .equ base,0xabc0
Index: gas/testsuite/gas/i386/ifunc-3.d
===================================================================
--- /dev/null 2010-11-23 09:11:06.403484413 +0000
+++ gas/testsuite/gas/i386/ifunc-3.d 2010-11-29 15:27:21.000000000 +0000
@@ -0,0 +1,57 @@
+#readelf: --relocs --syms -x .text.1 -x .text.2
+#name: i386 ifunc 3
+
+Relocation section '\.rel\.text\.1' at offset .* contains .* entries:
+ Offset Info Type Sym.Value Sym. Name
+00000000 ........ R_386_PC32 bar1\(\) bar1
+00000004 ........ R_386_PC32 bar2\(\) bar2
+00000008 ........ R_386_PC32 bar1\(\) bar1
+0000000c ........ R_386_PC32 bar2\(\) bar2
+00000010 ........ R_386_32 bar1\(\) bar1
+00000018 ........ R_386_PC32 bar1\(\) bar1
+0000001c ........ R_386_PC32 bar2\(\) bar2
+00000020 ........ R_386_PC32 bar1\(\) bar1
+00000024 ........ R_386_PC32 bar2\(\) bar2
+00000028 ........ R_386_32 bar1\(\) bar1
+0000002c ........ R_386_PC32 abs1\(\) abs1
+00000030 ........ R_386_PC32 abs1\(\) abs1
+00000034 ........ R_386_32 abs1\(\) abs1
+00000038 ........ R_386_PC32 abs1\(\) abs1
+0000003c ........ R_386_PC32 abs1\(\) abs1
+00000040 ........ R_386_32 abs1\(\) abs1
+
+Relocation section '\.rel\.text\.2' at offset .* contains .* entries:
+ Offset Info Type Sym.Value Sym. Name
+00000000 ........ R_386_PC32 bar1\(\) bar1
+00000004 ........ R_386_PC32 bar2\(\) bar2
+00000008 ........ R_386_PC32 bar1\(\) bar1
+0000000c ........ R_386_PC32 bar2\(\) bar2
+00000010 ........ R_386_32 bar2\(\) bar2
+00000018 ........ R_386_PC32 bar1\(\) bar1
+0000001c ........ R_386_PC32 bar2\(\) bar2
+00000020 ........ R_386_PC32 bar1\(\) bar1
+00000024 ........ R_386_PC32 bar2\(\) bar2
+00000028 ........ R_386_32 bar2\(\) bar2
+
+Symbol table '.symtab' contains .* entries:
+ Num: Value Size Type Bind Vis Ndx Name
+#...
+.*: 00000014 1 IFUNC LOCAL DEFAULT .* bar1
+.*: 00000014 1 IFUNC LOCAL DEFAULT .* bar2
+#...
+.*: 11223300 0 IFUNC LOCAL DEFAULT ABS abs1
+#...
+
+Hex dump of section '\.text\.1':
+ NOTE: This section has relocations against it, but these have NOT been applied to this dump\.
+ 0x00000000 00000000 00000000 08000000 0c000000 .*
+ 0x00000010 4054ffff c38d7600 00000000 00000000 .*
+ 0x00000020 20000000 24000000 4054ffff 00000000 .*
+ 0x00000030 30000000 4054ffff 00000000 3c000000 .*
+ 0x00000040 4054ffff .*
+
+Hex dump of section '\.text\.2':
+ NOTE: This section has relocations against it, but these have NOT been applied to this dump\.
+ 0x00000000 00000000 00000000 08000000 0c000000 .*
+ 0x00000010 4054ffff c38d7600 00000000 00000000 .*
+ 0x00000020 20000000 24000000 4054ffff .*
Index: gas/testsuite/gas/i386/i386.exp
===================================================================
--- gas/testsuite/gas/i386/i386.exp 2010-11-05 17:12:13.000000000 +0000
+++ gas/testsuite/gas/i386/i386.exp 2010-11-29 14:44:35.000000000 +0000
@@ -215,6 +215,8 @@ if [expr ([istarget "i*86-*-*"] || [ist
run_list_test "inval-equ-1" "-al"
run_list_test "inval-equ-2" "-al"
run_dump_test "ifunc"
+ run_list_test "ifunc-2"
+ run_dump_test "ifunc-3"
run_list_test "l1om-inval" "-march=l1om --32"
run_dump_test "localpic"
run_dump_test "debug1"