+2018-07-09  Maciej W. Rozycki  <macro@mips.com>
+
+       * testsuite/lib/ld-lib.exp (run_dump_test): Call `unsupported'
+       if the target being tested has been excluded by means of one or
+       more of `target', `alltargets' and `notarget' tags.  Add support
+       for `skip', `anyskip' and `noskip' tags.
+
 2018-07-09  Maciej W. Rozycki  <macro@mips.com>
 
        * testsuite/lib/ld-lib.exp (run_dump_test): Move the setting of
 
 #      as a TCL procedure if surrounded by square brackets, or passed
 #      to "istarget" if not.
 #      This may occur more than once; the target being tested must match
-#      at least one.
+#      at least one.  Otherwise the test will be marked unsupported.
 #
 #   alltargets: TARGET
 #      Only run the test for TARGET.
 #      The syntax for TARGET is as with 'target'.
 #      This may occur more than once; the target being tested must match
-#      all of them.
+#      all of them.  Otherwise the test will be marked unsupported.
 #
 #   notarget: TARGET
 #      Do not run the test for TARGET.
 #      The syntax for TARGET is as with 'target'.
 #      This may occur more than once; the target being tested must not
-#      match any of them.
+#      match any of them.  Otherwise the test will be marked unsupported.
+#
+#   skip: TARGET
+#   anyskip: TARGET
+#   noskip: TARGET
+#      These are exactly the same as "notarget", "alltargets" and
+#      "target" respectively, except that they do nothing at all if the
+#      check fails.  They should only be used in groups, to construct a
+#      single test which is run on all targets but with variant options
+#      or expected output on some targets.  (For example, see
+#      gas/arm/inst.d and gas/arm/wince_inst.d.)
 #
 #   error: REGEX
 #      An error with message matching REGEX must be emitted for the test
     set opts(target) {}
     set opts(alltargets) {}
     set opts(notarget) {}
+    set opts(skip) {}
+    set opts(anyskip) {}
+    set opts(noskip) {}
     set opts(objdump) {}
     set opts(nm) {}
     set opts(objcopy) {}
            target {}
            alltargets {}
            notarget {}
+           skip {}
+           anyskip {}
+           noskip {}
            warning {}
            error {}
            source {
     }
 
     # Decide early whether we should run the test for this target.
+    if { [llength $opts(noskip)] > 0 } {
+       set targmatch 0
+       foreach targ $opts(noskip) {
+           if [match_target $targ] {
+               set targmatch 1
+               break
+           }
+       }
+       if { $targmatch == 0 } {
+           return
+       }
+    }
+    foreach targ $opts(anyskip) {
+       if ![match_target $targ] {
+           return
+       }
+    }
+    foreach targ $opts(skip) {
+       if [match_target $targ] {
+           return
+       }
+    }
     if { [llength $opts(target)] > 0 } {
        set targmatch 0
        foreach targ $opts(target) {
            }
        }
        if { $targmatch == 0 } {
+           unsupported $testname
            return
        }
     }
     foreach targ $opts(alltargets) {
        if ![match_target $targ] {
+           unsupported $testname
            return
        }
     }
     foreach targ $opts(notarget) {
        if [match_target $targ] {
+           unsupported $testname
            return
        }
     }