[lld] r356805 - [WebAssembly] Add linker options to control feature checking
Thomas Lively via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 25 11:01:53 PDT 2019
Thanks for the heads up. I'll revert for now and investigate further.
On Mon, Mar 25, 2019 at 10:58 AM Galina Kistanova <gkistanova at gmail.com>
wrote:
> 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/77a97af8/attachment.html>
More information about the llvm-commits
mailing list