LD/testsuite: Fix undefined symbol tests for MIPS and S+core targets
authorMaciej W. Rozycki <macro@imgtec.com>
Tue, 26 Sep 2017 11:09:50 +0000 (12:09 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Tue, 26 Sep 2017 11:09:50 +0000 (12:09 +0100)
Fix commit 647d4de92e06 ("Test undefined symbols in shared libraries")
and remove "undefined symbols in shared lib (dyn reloc)" test failures
for MIPS and S+core targets.

This test assumes 3 dynamic relocation entries, however the respective
psABIs define an extra single dummy *_NONE relocation at the beginning
of the dynamic relocation table, which results in test output like the
following for MIPS:

Relocation section '.rel.dyn' at offset 0x33c contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000000 R_MIPS_NONE
00010364  00000903 R_MIPS_REL32      00000000   undef_pfun
00010360  00000a03 R_MIPS_REL32      00000000   undef_data
00010368  00000b03 R_MIPS_REL32      00000000   undef_notype

and S+core:

Relocation section '.rel.dyn' at offset 0x274 contains 4 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00000000  00000000 R_SCORE_NONE
5ffe0464  00000e12 R_SCORE_REL32     00000000   undef_notype
5ffe045c  00000f12 R_SCORE_REL32     00000000   undef_data
5ffe0460  00001012 R_SCORE_REL32     00000000   undef_pfun

targets respectively, and also n64 MIPS targets pad relocation triplets
they use with extra *_NONE relocations, resulting in output like this:

Relocation section '.rel.dyn' at offset 0x4c0 contains 4 entries:
  Offset          Info           Type           Sym. Value    Sym. Name
000000000000  000000000000 R_MIPS_NONE
                    Type2: R_MIPS_NONE
                    Type3: R_MIPS_NONE
000000010508  000900001203 R_MIPS_REL32      0000000000000000 undef_pfun
                    Type2: R_MIPS_64
                    Type3: R_MIPS_NONE
000000010500  000a00001203 R_MIPS_REL32      0000000000000000 undef_data
                    Type2: R_MIPS_64
                    Type3: R_MIPS_NONE
000000010510  000b00001203 R_MIPS_REL32      0000000000000000 undef_notype
                    Type2: R_MIPS_64
                    Type3: R_MIPS_NONE

Expect the right number of *_NONE relocations then, and adjust the total
number of relocations expected accordingly.

ld/
* testsuite/ld-undefined/undefined.exp: Correct the dyn reloc
test for MIPS and S+core targets.

ld/ChangeLog
ld/testsuite/ld-undefined/undefined.exp

index b15d72613e40e2b2acd3aa35b8af2a95517530d2..0ccc02be6284d8d89b05239d4e13683fdfa1c619 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-26  Maciej W. Rozycki  <macro@imgtec.com>
+
+       * testsuite/ld-undefined/undefined.exp: Correct the dyn reloc
+       test for MIPS and S+core targets.
+
 2017-09-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/22150
index c0c9012e750c238f7639ab8cbce0b459092fc5a8..1421383c5e5252d2e22b3e8bf093d5a1bc834881 100644 (file)
@@ -195,10 +195,30 @@ if { ![is_elf_format] || ![check_shared_lib_support]} then {
        set exec_output [run_host_cmd "$READELF" "-r tmpdir/fundef.so"]
        set exec_output [prune_warnings $exec_output]
 
-       # we ought to get two .rel{a}.plt and three .rel{a}.dyn relocs
+       # We ought to get two .rel{a}.plt and three .rel{a}.dyn relocs,
+       # except for MIPS targets whose psABI mandates an extra
+       # R_MIPS_NONE relocation, also used to pad n64 relocation
+       # triplets, and S+core targets using an extra R_SCORE_NONE
+       # relocation, so adjust for that.
+       switch -glob $target_triplet {
+           "mips64*-*-openbsd*" {
+               set none_count 6
+               set reloc_count 4
+           }
+           "mips*" -
+           "score*" {
+               set none_count 1
+               set reloc_count 4
+           }
+           "*" {
+               set none_count 0
+               set reloc_count 3
+           }
+       }
+
        if { ($asflags == "" || [regexp ".* contains 2 .*" $exec_output])
-            && [regexp ".* contains 3 .*" $exec_output]
-            && ![regexp "_NONE" $exec_output]} then {
+            && [regexp ".* contains $reloc_count .*" $exec_output]
+            && [regexp -all "_NONE" $exec_output] == $none_count } then {
            pass "$testname (dyn reloc)"
        } else {
            fail "$testname (dyn reloc)"