[lld] r356805 - [WebAssembly] Add linker options to control feature checking

Galina Kistanova via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 25 10:58:28 PDT 2019


Hello Thomas,

This commit broke tests on the next builder:
http://lab.llvm.org:8011/builders/lld-x86_64-win7/builds/33870
. . .
Failing Tests (4):
    lld :: wasm/target-feature-disallowed.yaml
    lld :: wasm/target-feature-none.yaml
    lld :: wasm/target-feature-required.yaml
    lld :: wasm/target-feature-used.yaml

Please have a look ASAP?

Thanks

Galina


On Fri, Mar 22, 2019 at 1:41 PM Thomas Lively via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: tlively
> Date: Fri Mar 22 13:43:06 2019
> New Revision: 356805
>
> URL: http://llvm.org/viewvc/llvm-project?rev=356805&view=rev
> Log:
> [WebAssembly] Add linker options to control feature checking
>
> Summary:
> Adds --check-features and --no-check-features. The default for now is
> to enable the checking, but this might change in the future.
>
> Also adds --features=foo,bar for precisely controlling the features
> used in the output binary.
>
> Depends on D59173.
>
> Reviewers: sbc100, aheejin
>
> Subscribers: dschuff, jgravelle-google, sunfish, jdoerfert, llvm-commits
>
> Tags: #llvm
>
> Differential Revision: https://reviews.llvm.org/D59274
>
> Added:
>     lld/trunk/test/wasm/target-feature-none.yaml
> Modified:
>     lld/trunk/test/wasm/target-feature-disallowed.yaml
>     lld/trunk/test/wasm/target-feature-required.yaml
>     lld/trunk/test/wasm/target-feature-used.yaml
>     lld/trunk/wasm/Config.h
>     lld/trunk/wasm/Driver.cpp
>     lld/trunk/wasm/Options.td
>     lld/trunk/wasm/Writer.cpp
>
> Modified: lld/trunk/test/wasm/target-feature-disallowed.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/target-feature-disallowed.yaml?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/test/wasm/target-feature-disallowed.yaml (original)
> +++ lld/trunk/test/wasm/target-feature-disallowed.yaml Fri Mar 22 13:43:06
> 2019
> @@ -1,5 +1,9 @@
>  # RUN: yaml2obj %s -o %t1.o
>
> +# RUN: wasm-ld --no-entry --features=foo,bar,baz -o - %t1.o | obj2yaml |
> FileCheck %s --check-prefix SPECIFIED
> +
> +# RUN: wasm-ld --no-entry --features=bar,baz,quux -o - %t1.o | obj2yaml |
> FileCheck %s --check-prefix UNSPECIFIED
> +
>  # RUN: yaml2obj %S/Inputs/disallow-feature-foo.yaml -o %t.disallowed.o
>  # RUN: wasm-ld --no-entry -o %t.disallowed.exe %t1.o %t.disallowed.o
>  # RUN: obj2yaml < %t.disallowed.exe | FileCheck %s --check-prefix
> DISALLOWED
> @@ -31,6 +35,28 @@ Sections:
>          Name:          "bar"
>  ...
>
> +# SPECIFIED:        - Type:            CUSTOM
> +# SPECIFIED-NEXT:     Name:            target_features
> +# SPECIFIED-NEXT:     Features:
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            bar
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            baz
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            foo
> +# SPECIFIED-NEXT: ...
> +
> +# UNSPECIFIED:        - Type:            CUSTOM
> +# UNSPECIFIED-NEXT:     Name:            target_features
> +# UNSPECIFIED-NEXT:     Features:
> +# UNSPECIFIED-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NEXT:         Name:            bar
> +# UNSPECIFIED-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NEXT:         Name:            baz
> +# UNSPECIFIED-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NEXT:         Name:            quux
> +# UNSPECIFIED-NEXT: ...
> +
>  # DISALLOWED:        - Type:            CUSTOM
>  # DISALLOWED-NEXT:     Name:            target_features
>  # DISALLOWED-NEXT:     Features:
>
> Added: lld/trunk/test/wasm/target-feature-none.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/target-feature-none.yaml?rev=356805&view=auto
>
> ==============================================================================
> --- lld/trunk/test/wasm/target-feature-none.yaml (added)
> +++ lld/trunk/test/wasm/target-feature-none.yaml Fri Mar 22 13:43:06 2019
> @@ -0,0 +1,33 @@
> +# RUN: yaml2obj %s -o %t1.o
> +
> +# RUN: wasm-ld --no-entry -o - %t1.o | obj2yaml | FileCheck %s
> --check-prefix EMPTY
> +
> +# RUN: wasm-ld --no-entry --features= -o - %t1.o | obj2yaml | FileCheck
> %s --check-prefix EMPTY
> +
> +# RUN: wasm-ld --no-entry --features=foo,bar,baz -o - %t1.o | obj2yaml |
> FileCheck %s --check-prefix SPECIFIED
> +
> +--- !WASM
> +FileHeader:
> +  Version:         0x00000001
> +Sections:
> +  - Type:            CUSTOM
> +    Name:            linking
> +    Version:         2
> +  - Type:            CUSTOM
> +    Name:            target_features
> +    Features:        [ ]
> +...
> +
> +# section is not emitted if it would be empty
> +# EMPTY-NOT: target_features
> +
> +# SPECIFIED:        - Type:            CUSTOM
> +# SPECIFIED-NEXT:     Name:            target_features
> +# SPECIFIED-NEXT:     Features:
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            bar
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            baz
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            foo
> +# SPECIFIED-NEXT: ...
>
> Modified: lld/trunk/test/wasm/target-feature-required.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/target-feature-required.yaml?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/test/wasm/target-feature-required.yaml (original)
> +++ lld/trunk/test/wasm/target-feature-required.yaml Fri Mar 22 13:43:06
> 2019
> @@ -1,5 +1,11 @@
>  # RUN: yaml2obj %s -o %t1.o
>
> +# RUN: wasm-ld --no-entry --features=foo,bar,baz -o - %t1.o | obj2yaml |
> FileCheck %s --check-prefix SPECIFIED
> +
> +# RUN: not wasm-ld --no-entry --features=bar,baz,quux -o - %t1.o 2>&1 |
> FileCheck %s --check-prefix UNSPECIFIED
> +
> +# RUN: wasm-ld --no-entry --no-check-features --features=bar,baz,quux -o
> - %t1.o | obj2yaml | FileCheck %s --check-prefix UNSPECIFIED-NOCHECK
> +
>  # RUN: yaml2obj %S/Inputs/require-feature-foo.yaml -o %t.required.o
>  # RUN: wasm-ld --no-entry -o %t.required.exe %t1.o %t.required.o
>  # RUN: obj2yaml < %t.required.exe | FileCheck %s --check-prefix REQUIRED
> @@ -7,9 +13,13 @@
>  # RUN: yaml2obj %S/Inputs/disallow-feature-foo.yaml -o %t.disallowed.o
>  # RUN: not wasm-ld --no-entry -o /dev/null %t1.o %t.disallowed.o 2>&1 |
> FileCheck %s --check-prefix DISALLOWED
>
> +# RUN: wasm-ld --no-entry --no-check-features -o - %t1.o %t.disallowed.o
> | obj2yaml | FileCheck %s --check-prefix DISALLOWED-NOCHECK
> +
>  # RUN: yaml2obj %S/Inputs/no-feature-foo.yaml -o %t.none.o
>  # RUN: not wasm-ld --no-entry -o /dev/null %t1.o %t.none.o 2>&1 |
> FileCheck %s --check-prefix NONE
>
> +# RUN: wasm-ld --no-entry --no-check-features -o - %t1.o %t.none.o |
> obj2yaml | FileCheck %s --check-prefix NONE-NOCHECK
> +
>  # Check that the following combinations of feature linkage policies
>  # give the expected results:
>  #
> @@ -31,6 +41,30 @@ Sections:
>          Name:          "foo"
>  ...
>
> +# SPECIFIED:        - Type:            CUSTOM
> +# SPECIFIED-NEXT:     Name:            target_features
> +# SPECIFIED-NEXT:     Features:
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            bar
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            baz
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            foo
> +# SPECIFIED-NEXT: ...
> +
> +# UNSPECIFIED: Target feature 'foo' is not allowed.{{$}}
> +
> +# UNSPECIFIED-NOCHECK:        - Type:            CUSTOM
> +# UNSPECIFIED-NOCHECK-NEXT:     Name:            target_features
> +# UNSPECIFIED-NOCHECK-NEXT:     Features:
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            bar
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            baz
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            quux
> +# UNSPECIFIED-NOCHECK-NEXT: ...
> +
>  # REQUIRED:        - Type:            CUSTOM
>  # REQUIRED-NEXT:     Name:            target_features
>  # REQUIRED-NEXT:     Features:
> @@ -38,6 +72,20 @@ Sections:
>  # REQUIRED-NEXT:         Name:            foo
>  # REQUIRED-NEXT: ...
>
> -# DISALLOWED: Target feature "foo" is disallowed
> +# DISALLOWED: Target feature 'foo' is disallowed. Use --no-check-features
> to suppress.{{$}}
>
> -# NONE: Missing required target feature "foo"
> +# DISALLOWED-NOCHECK:        - Type:            CUSTOM
> +# DISALLOWED-NOCHECK-NEXT:     Name:            target_features
> +# DISALLOWED-NOCHECK-NEXT:     Features:
> +# DISALLOWED-NOCHECK-NEXT:       - Prefix:          USED
> +# DISALLOWED-NOCHECK-NEXT:         Name:            foo
> +# DISALLOWED-NOCHECK-NEXT: ...
> +
> +# NONE: Missing required target feature 'foo'. Use --no-check-features to
> suppress.{{$}}
> +
> +# NONE-NOCHECK:        - Type:            CUSTOM
> +# NONE-NOCHECK-NEXT:     Name:            target_features
> +# NONE-NOCHECK-NEXT:     Features:
> +# NONE-NOCHECK-NEXT:       - Prefix:          USED
> +# NONE-NOCHECK-NEXT:         Name:            foo
> +# NONE-NOCHECK-NEXT: ...
>
> Modified: lld/trunk/test/wasm/target-feature-used.yaml
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/target-feature-used.yaml?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/test/wasm/target-feature-used.yaml (original)
> +++ lld/trunk/test/wasm/target-feature-used.yaml Fri Mar 22 13:43:06 2019
> @@ -1,5 +1,11 @@
>  # RUN: yaml2obj %s -o %t1.o
>
> +# RUN: wasm-ld --no-entry --features=foo,bar,baz -o - %t1.o | obj2yaml |
> FileCheck %s --check-prefix SPECIFIED
> +
> +# RUN: not wasm-ld --no-entry --features=bar,baz,quux -o - %t1.o 2>&1 |
> FileCheck %s --check-prefix UNSPECIFIED
> +
> +# RUN: wasm-ld --no-entry --no-check-features --features=bar,baz,quux -o
> - %t1.o | obj2yaml | FileCheck %s --check-prefix UNSPECIFIED-NOCHECK
> +
>  # RUN: yaml2obj %S/Inputs/use-feature-foo.yaml -o %t.used.o
>  # RUN: wasm-ld --no-entry -o %t.used.exe %t1.o %t.used.o
>  # RUN: obj2yaml < %t.used.exe | FileCheck %s --check-prefix USED
> @@ -11,6 +17,8 @@
>  # RUN: yaml2obj %S/Inputs/disallow-feature-foo.yaml -o %t.disallowed.o
>  # RUN: not wasm-ld --no-entry -o /dev/null %t1.o %t.disallowed.o 2>&1 |
> FileCheck %s --check-prefix DISALLOWED
>
> +# RUN: wasm-ld --no-entry --no-check-features -o - %t1.o %t.disallowed.o
> | obj2yaml | FileCheck %s --check-prefix DISALLOWED-NOCHECK
> +
>  # RUN: yaml2obj %S/Inputs/no-feature-foo.yaml -o %t.none.o
>  # RUN: wasm-ld --no-entry -o %t.none.exe %t1.o %t.none.o
>  # RUN: obj2yaml %t.none.exe | FileCheck %s --check-prefix NONE
> @@ -37,6 +45,30 @@ Sections:
>          Name:          "foo"
>  ...
>
> +# SPECIFIED:        - Type:            CUSTOM
> +# SPECIFIED-NEXT:     Name:            target_features
> +# SPECIFIED-NEXT:     Features:
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            bar
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            baz
> +# SPECIFIED-NEXT:       - Prefix:          USED
> +# SPECIFIED-NEXT:         Name:            foo
> +# SPECIFIED-NEXT: ...
> +
> +# UNSPECIFIED: Target feature 'foo' is not allowed.{{$}}
> +
> +# UNSPECIFIED-NOCHECK:        - Type:            CUSTOM
> +# UNSPECIFIED-NOCHECK-NEXT:     Name:            target_features
> +# UNSPECIFIED-NOCHECK-NEXT:     Features:
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            bar
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            baz
> +# UNSPECIFIED-NOCHECK-NEXT:       - Prefix:          USED
> +# UNSPECIFIED-NOCHECK-NEXT:         Name:            quux
> +# UNSPECIFIED-NOCHECK-NEXT: ...
> +
>  # USED:        - Type:            CUSTOM
>  # USED-NEXT:     Name:            target_features
>  # USED-NEXT:     Features:
> @@ -51,7 +83,14 @@ Sections:
>  # REQUIRED-NEXT:         Name:            foo
>  # REQUIRED-NEXT: ...
>
> -# DISALLOWED: Target feature "foo" is disallowed
> +# DISALLOWED: Target feature 'foo' is disallowed. Use --no-check-features
> to suppress.{{$}}
> +
> +# DISALLOWED-NOCHECK:        - Type:            CUSTOM
> +# DISALLOWED-NOCHECK-NEXT:     Name:            target_features
> +# DISALLOWED-NOCHECK-NEXT:     Features:
> +# DISALLOWED-NOCHECK-NEXT:       - Prefix:          USED
> +# DISALLOWED-NOCHECK-NEXT:         Name:            foo
> +# DISALLOWED-NOCHECK-NEXT: ...
>
>  # NONE:        - Type:            CUSTOM
>  # NONE-NEXT:     Name:            target_features
>
> Modified: lld/trunk/wasm/Config.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Config.h?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/wasm/Config.h (original)
> +++ lld/trunk/wasm/Config.h Fri Mar 22 13:43:06 2019
> @@ -19,6 +19,7 @@ namespace wasm {
>
>  struct Configuration {
>    bool AllowUndefined;
> +  bool CheckFeatures;
>    bool CompressRelocations;
>    bool Demangle;
>    bool DisableVerify;
> @@ -54,6 +55,7 @@ struct Configuration {
>    llvm::StringSet<> AllowUndefinedSymbols;
>    std::vector<llvm::StringRef> SearchPaths;
>    llvm::CachePruningPolicy ThinLTOCachePolicy;
> +  llvm::Optional<std::vector<std::string>> Features;
>
>    // True if we are creating position-independent code.
>    bool Pic;
>
> Modified: lld/trunk/wasm/Driver.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/wasm/Driver.cpp (original)
> +++ lld/trunk/wasm/Driver.cpp Fri Mar 22 13:43:06 2019
> @@ -21,6 +21,7 @@
>  #include "lld/Common/Version.h"
>  #include "llvm/ADT/Twine.h"
>  #include "llvm/Object/Wasm.h"
> +#include "llvm/Option/Arg.h"
>  #include "llvm/Option/ArgList.h"
>  #include "llvm/Support/CommandLine.h"
>  #include "llvm/Support/Path.h"
> @@ -292,6 +293,8 @@ static StringRef getEntry(opt::InputArgL
>  // of these values.
>  static void setConfigs(opt::InputArgList &Args) {
>    Config->AllowUndefined = Args.hasArg(OPT_allow_undefined);
> +  Config->CheckFeatures =
> +      Args.hasFlag(OPT_check_features, OPT_no_check_features, true);
>    Config->CompressRelocations = Args.hasArg(OPT_compress_relocations);
>    Config->Demangle = Args.hasFlag(OPT_demangle, OPT_no_demangle, true);
>    Config->DisableVerify = Args.hasArg(OPT_disable_verify);
> @@ -339,6 +342,13 @@ static void setConfigs(opt::InputArgList
>    Config->MaxMemory = args::getInteger(Args, OPT_max_memory, 0);
>    Config->ZStackSize =
>        args::getZOptionValue(Args, OPT_z, "stack-size", WasmPageSize);
> +
> +  if (auto *Arg = Args.getLastArg(OPT_features)) {
> +    Config->Features =
> +
> llvm::Optional<std::vector<std::string>>(std::vector<std::string>());
> +    for (StringRef S : Arg->getValues())
> +      Config->Features->push_back(S);
> +  }
>  }
>
>  // Some command line options or some combinations of them are not allowed.
>
> Modified: lld/trunk/wasm/Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Options.td?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/wasm/Options.td (original)
> +++ lld/trunk/wasm/Options.td Fri Mar 22 13:43:06 2019
> @@ -155,6 +155,13 @@ defm whole_archive: B<"whole-archive",
>      "Force load of all members in a static library",
>      "Do not force load of all members in a static library (default)">;
>
> +defm check_features: B<"check-features",
> +    "Check feature compatibility of linked objects (default)",
> +    "Ignore feature compatibility of linked objects">;
> +
> +def features: CommaJoined<["--", "-"], "features=">,
> +  HelpText<"Comma-separated used features, inferred from input objects by
> default.">;
> +
>  // Aliases
>  def: JoinedOrSeparate<["-"], "e">, Alias<entry>;
>  def: J<"entry=">, Alias<entry>;
>
> Modified: lld/trunk/wasm/Writer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Writer.cpp?rev=356805&r1=356804&r2=356805&view=diff
>
> ==============================================================================
> --- lld/trunk/wasm/Writer.cpp (original)
> +++ lld/trunk/wasm/Writer.cpp Fri Mar 22 13:43:06 2019
> @@ -878,18 +878,30 @@ void Writer::createSections() {
>  }
>
>  void Writer::calculateTargetFeatures() {
> +  SmallSet<std::string, 8> Used;
>    SmallSet<std::string, 8> Required;
>    SmallSet<std::string, 8> Disallowed;
>
> +  // Only infer used features if user did not specify features
> +  bool InferFeatures = !Config->Features.hasValue();
> +
> +  if (!InferFeatures) {
> +    for (auto &Feature : Config->Features.getValue())
> +      TargetFeatures.insert(Feature);
> +    // No need to read or check features
> +    if (!Config->CheckFeatures)
> +      return;
> +  }
> +
>    // Find the sets of used, required, and disallowed features
>    for (ObjFile *File : Symtab->ObjectFiles) {
>      for (auto &Feature : File->getWasmObj()->getTargetFeatures()) {
>        switch (Feature.Prefix) {
>        case WASM_FEATURE_PREFIX_USED:
> -        TargetFeatures.insert(Feature.Name);
> +        Used.insert(Feature.Name);
>          break;
>        case WASM_FEATURE_PREFIX_REQUIRED:
> -        TargetFeatures.insert(Feature.Name);
> +        Used.insert(Feature.Name);
>          Required.insert(Feature.Name);
>          break;
>        case WASM_FEATURE_PREFIX_DISALLOWED:
> @@ -902,6 +914,20 @@ void Writer::calculateTargetFeatures() {
>      }
>    }
>
> +  if (InferFeatures)
> +    TargetFeatures.insert(Used.begin(), Used.end());
> +
> +  if (!Config->CheckFeatures)
> +    return;
> +
> +  // Validate that used features are allowed in output
> +  if (!InferFeatures) {
> +    for (auto &Feature : Used) {
> +      if (!TargetFeatures.count(Feature))
> +        error(Twine("Target feature '") + Feature + "' is not allowed.");
> +    }
> +  }
> +
>    // Validate the required and disallowed constraints for each file
>    for (ObjFile *File : Symtab->ObjectFiles) {
>      SmallSet<std::string, 8> ObjectFeatures;
> @@ -910,11 +936,13 @@ void Writer::calculateTargetFeatures() {
>          continue;
>        ObjectFeatures.insert(Feature.Name);
>        if (Disallowed.count(Feature.Name))
> -        error("Target feature \"" + Feature.Name + "\" is disallowed");
> +        error(Twine("Target feature '") + Feature.Name +
> +              "' is disallowed. Use --no-check-features to suppress.");
>      }
>      for (auto &Feature : Required) {
>        if (!ObjectFeatures.count(Feature))
> -        error(Twine("Missing required target feature \"") + Feature +
> "\"");
> +        error(Twine("Missing required target feature '") + Feature +
> +              "'. Use --no-check-features to suppress.");
>      }
>    }
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190325/64100852/attachment-0001.html>


More information about the llvm-commits mailing list