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