https://github.com/sunfishcode updated https://github.com/llvm/llvm-project/pull/117087
>From 48808d43f41b61a419790fd25f99b5e897e5a419 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Fri, 11 Oct 2024 04:30:32 -0700 Subject: [PATCH 01/11] [WebAssembly] Define call-indirect-overlong and bulk-memory-opt features This defines some new target features. These are subsets of existing features that reflect implementation concerns: - "call-indirect-overlong" - implied by "reference-types"; just the overlong encoding for the `call_indirect` immediate, and not the actual reference types. - "bulk-memory-opt" - implied by "bulk-memory": just `memory.copy` and `memory.fill`, and not the other instructions in the bulk-memory proposal. --- clang/lib/Basic/Targets/WebAssembly.cpp | 34 +++++++++++++++++++ clang/lib/Basic/Targets/WebAssembly.h | 2 ++ lld/test/wasm/compress-relocs.ll | 2 +- lld/test/wasm/import-table-explicit.s | 2 +- lld/test/wasm/invalid-mvp-table-use.s | 2 +- lld/test/wasm/lto/Inputs/libcall-archive.ll | 2 +- lld/test/wasm/lto/libcall-archive.ll | 2 +- lld/test/wasm/lto/stub-library-libcall.s | 4 +-- lld/test/wasm/multi-table.s | 2 +- lld/wasm/InputFiles.cpp | 11 +++--- lld/wasm/SyntheticSections.cpp | 2 +- .../AsmParser/WebAssemblyAsmParser.cpp | 28 +++++++++++---- llvm/lib/Target/WebAssembly/WebAssembly.td | 21 ++++++++---- .../WebAssembly/WebAssemblyFastISel.cpp | 2 +- .../WebAssembly/WebAssemblyISelLowering.cpp | 2 +- .../WebAssembly/WebAssemblyInstrBulkMemory.td | 8 ++--- .../WebAssembly/WebAssemblyInstrInfo.td | 8 +++++ .../WebAssemblySelectionDAGInfo.cpp | 4 +-- .../WebAssembly/WebAssemblySubtarget.cpp | 9 +++++ .../Target/WebAssembly/WebAssemblySubtarget.h | 4 +++ .../WebAssembly/WebAssemblyUtilities.cpp | 4 +-- llvm/test/CodeGen/WebAssembly/bulk-memory.ll | 6 ++-- .../test/CodeGen/WebAssembly/bulk-memory64.ll | 6 ++-- .../test/CodeGen/WebAssembly/call-indirect.ll | 4 +-- .../WebAssembly/cfg-stackify-eh-legacy.ll | 6 ++-- .../CodeGen/WebAssembly/disable-feature.ll | 4 +-- .../CodeGen/WebAssembly/function-pointer64.ll | 4 +-- .../WebAssembly/target-features-cpus.ll | 27 +++++++++++---- .../WebAssembly/extern-functype-intrinsic.ll | 4 +-- llvm/test/MC/WebAssembly/function-alias.ll | 4 +-- llvm/test/MC/WebAssembly/libcall.ll | 2 +- 31 files changed, 158 insertions(+), 64 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 0b380bdf835ffb..ba323940a8a86c 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -47,6 +47,8 @@ bool WebAssemblyTargetInfo::hasFeature(StringRef Feature) const { return llvm::StringSwitch<bool>(Feature) .Case("atomics", HasAtomics) .Case("bulk-memory", HasBulkMemory) + .Case("bulk-memory-opt", HasBulkMemoryOpt) + .Case("call-indirect-overlong", HasCallIndirectOverlong) .Case("exception-handling", HasExceptionHandling) .Case("extended-const", HasExtendedConst) .Case("fp16", HasFP16) @@ -79,6 +81,8 @@ void WebAssemblyTargetInfo::getTargetDefines(const LangOptions &Opts, Builder.defineMacro("__wasm_atomics__"); if (HasBulkMemory) Builder.defineMacro("__wasm_bulk_memory__"); + if (HasBulkMemoryOpt) + Builder.defineMacro("__wasm_bulk_memory_opt__"); if (HasExceptionHandling) Builder.defineMacro("__wasm_exception_handling__"); if (HasExtendedConst) @@ -155,6 +159,8 @@ bool WebAssemblyTargetInfo::initFeatureMap( const std::vector<std::string> &FeaturesVec) const { auto addGenericFeatures = [&]() { Features["bulk-memory"] = true; + Features["bulk-memory-opt"] = true; + Features["call-indirect-overlong"] = true; Features["multivalue"] = true; Features["mutable-globals"] = true; Features["nontrapping-fptoint"] = true; @@ -200,6 +206,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasBulkMemory = false; continue; } + if (Feature == "+bulk-memory-opt") { + HasBulkMemoryOpt = true; + continue; + } + if (Feature == "-bulk-memory-opt") { + HasBulkMemoryOpt = false; + continue; + } if (Feature == "+exception-handling") { HasExceptionHandling = true; continue; @@ -265,6 +279,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasReferenceTypes = false; continue; } + if (Feature == "+call-indirect-overlong") { + HasCallIndirectOverlong = true; + continue; + } + if (Feature == "-call-indirect-overlong") { + HasCallIndirectOverlong = false; + continue; + } if (Feature == "+relaxed-simd") { SIMDLevel = std::max(SIMDLevel, RelaxedSIMD); continue; @@ -310,6 +332,18 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( << Feature << "-target-feature"; return false; } + + // The reference-types feature included the change to `call_indirect` + // encodings to support overlong immediates. + if (HasReferenceTypes) { + HasCallIndirectOverlong = true; + } + + // bulk-memory-opt is a subset of bulk-memory. + if (HasBulkMemory) { + HasBulkMemoryOpt = true; + } + return true; } diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 6c2fe8049ff47a..09da9d60dc5a34 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -55,6 +55,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; + bool HasBulkMemoryOpt = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -63,6 +64,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; + bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; diff --git a/lld/test/wasm/compress-relocs.ll b/lld/test/wasm/compress-relocs.ll index f1faab754cb765..cea9f3476e996a 100644 --- a/lld/test/wasm/compress-relocs.ll +++ b/lld/test/wasm/compress-relocs.ll @@ -1,5 +1,5 @@ ; RUN: llc -filetype=obj %s -o %t.o -; RUN: llvm-mc -mattr=+reference-types -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/call-indirect.s -o %t2.o +; RUN: llvm-mc -mattr=+call-indirect-overlong -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/call-indirect.s -o %t2.o ; RUN: wasm-ld --export-dynamic -o %t.wasm %t2.o %t.o ; RUN: obj2yaml %t.wasm | FileCheck %s ; RUN: wasm-ld --export-dynamic -O2 -o %t-opt.wasm %t2.o %t.o diff --git a/lld/test/wasm/import-table-explicit.s b/lld/test/wasm/import-table-explicit.s index 1dc21beba06294..701b7a1dc3e165 100644 --- a/lld/test/wasm/import-table-explicit.s +++ b/lld/test/wasm/import-table-explicit.s @@ -1,4 +1,4 @@ -# RUN: llvm-mc -mattr=+reference-types -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o +# RUN: llvm-mc -mattr=+call-indirect-overlong -filetype=obj -triple=wasm32-unknown-unknown %s -o %t.o # RUN: wasm-ld --import-table -o %t.wasm %t.o # RUN: obj2yaml %t.wasm | FileCheck %s diff --git a/lld/test/wasm/invalid-mvp-table-use.s b/lld/test/wasm/invalid-mvp-table-use.s index b4f12a7eeb9a48..58c472e29d1ad4 100644 --- a/lld/test/wasm/invalid-mvp-table-use.s +++ b/lld/test/wasm/invalid-mvp-table-use.s @@ -1,7 +1,7 @@ # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s # # If any table is defined or declared besides the __indirect_function_table, -# the compilation unit should be compiled with -mattr=+reference-types, +# the compilation unit should be compiled with -mattr=+call-indirect-overlong, # causing symbol table entries to be emitted for all tables. # RUN: not wasm-ld --no-entry %t.o -o %t.wasm 2>&1 | FileCheck -check-prefix=CHECK-ERR %s diff --git a/lld/test/wasm/lto/Inputs/libcall-archive.ll b/lld/test/wasm/lto/Inputs/libcall-archive.ll index 7d8c34196dfe49..30764af83e6739 100644 --- a/lld/test/wasm/lto/Inputs/libcall-archive.ll +++ b/lld/test/wasm/lto/Inputs/libcall-archive.ll @@ -5,4 +5,4 @@ define void @memcpy() #0 { ret void } -attributes #0 = { "target-features"="-bulk-memory" } +attributes #0 = { "target-features"="-bulk-memory,-bulk-memory-opt" } diff --git a/lld/test/wasm/lto/libcall-archive.ll b/lld/test/wasm/lto/libcall-archive.ll index 5c46d2f7ed7838..0cee9a5de29f61 100644 --- a/lld/test/wasm/lto/libcall-archive.ll +++ b/lld/test/wasm/lto/libcall-archive.ll @@ -16,7 +16,7 @@ entry: declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) -attributes #0 = { "target-features"="-bulk-memory" } +attributes #0 = { "target-features"="-bulk-memory,-bulk-memory-opt" } ; CHECK: - Type: CUSTOM ; CHECK-NEXT: Name: name diff --git a/lld/test/wasm/lto/stub-library-libcall.s b/lld/test/wasm/lto/stub-library-libcall.s index d65983c0cf5bf5..40e15933f7bc39 100644 --- a/lld/test/wasm/lto/stub-library-libcall.s +++ b/lld/test/wasm/lto/stub-library-libcall.s @@ -2,7 +2,7 @@ # RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t_main.o %t/main.s # RUN: llvm-as %S/Inputs/foo.ll -o %t_foo.o # RUN: llvm-as %S/Inputs/libcall.ll -o %t_libcall.o -# RUN: wasm-ld -mllvm -mattr=-bulk-memory %t_main.o %t_libcall.o %t_foo.o %p/Inputs/stub.so -o %t.wasm +# RUN: wasm-ld -mllvm -mattr=-bulk-memory,-bulk-memory-opt %t_main.o %t_libcall.o %t_foo.o %p/Inputs/stub.so -o %t.wasm # RUN: obj2yaml %t.wasm | FileCheck %s # The function `func_with_libcall` will generate an undefined reference to @@ -12,7 +12,7 @@ # If %t_foo.o is not included in the link we get an undefined symbol reported # to the dependency of memcpy on the foo export: -# RUN: not wasm-ld -mllvm -mattr=-bulk-memory %t_main.o %t_libcall.o %p/Inputs/stub.so -o %t.wasm 2>&1 | FileCheck --check-prefix=MISSING %s +# RUN: not wasm-ld -mllvm -mattr=-bulk-memory,-bulk-memory-opt %t_main.o %t_libcall.o %p/Inputs/stub.so -o %t.wasm 2>&1 | FileCheck --check-prefix=MISSING %s # MISSING: stub.so: undefined symbol: foo. Required by memcpy #--- main.s diff --git a/lld/test/wasm/multi-table.s b/lld/test/wasm/multi-table.s index bf905ac748f9fb..3129093a25c7fb 100644 --- a/lld/test/wasm/multi-table.s +++ b/lld/test/wasm/multi-table.s @@ -26,7 +26,7 @@ call_indirect_explicit_tables: call_indirect table_b, () -> () end_function -# RT-MVP: wasm-ld: error: object file not built with 'reference-types' feature conflicts with import of table table_a by file +# RT-MVP: wasm-ld: error: object file not built with 'call-indirect-overlong' feature conflicts with import of table table_a by file # CHECK: --- !WASM # CHECK-NEXT: FileHeader: diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index fd06788457966a..53331aa58d2d37 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -255,10 +255,11 @@ static void setRelocs(const std::vector<T *> &chunks, } } -// An object file can have two approaches to tables. With the reference-types -// feature enabled, input files that define or use tables declare the tables -// using symbols, and record each use with a relocation. This way when the -// linker combines inputs, it can collate the tables used by the inputs, +// An object file can have two approaches to tables. With the +// call-indirect-overlong feature enabled (explicitly, or implied by the +// reference-types feature), input files that define or use tables declare the +// tables using symbols, and record each use with a relocation. This way when +// the linker combines inputs, it can collate the tables used by the inputs, // assigning them distinct table numbers, and renumber all the uses as // appropriate. At the same time, the linker has special logic to build the // indirect function table if it is needed. @@ -284,7 +285,7 @@ void ObjFile::addLegacyIndirectFunctionTableIfNeeded( return; // It's possible for an input to define tables and also use the indirect - // function table, but forget to compile with -mattr=+reference-types. + // function table, but forget to compile with -mattr=+call-indirect-overlong. // For these newer files, we require symbols for all tables, and // relocations for all of their uses. if (tableSymbolCount != 0) { diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index 1454c3324af989..747c203b996674 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -326,7 +326,7 @@ void TableSection::addTable(InputTable *table) { // to assign table number 0 to the indirect function table. for (const auto *culprit : out.importSec->importedSymbols) { if (isa<UndefinedTable>(culprit)) { - error("object file not built with 'reference-types' feature " + error("object file not built with 'call-indirect-overlong' feature " "conflicts with import of table " + culprit->getName() + " by file " + toString(culprit->getFile())); diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 10451600050ca7..f693ef3dbf962b 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -276,7 +276,18 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { : MCTargetAsmParser(Options, STI, MII), Parser(Parser), Lexer(Parser.getLexer()), Is64(STI.getTargetTriple().isArch64Bit()), TC(Parser, MII, Is64), SkipTypeCheck(Options.MCNoTypeCheck) { - setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); + FeatureBitset FBS = ComputeAvailableFeatures(STI.getFeatureBits()); + + // bulk-memory implies bulk-memory-opt + if (FBS.test(WebAssembly::FeatureBulkMemory)) { + FBS.set(WebAssembly::FeatureBulkMemoryOpt); + } + // reference-types implies call-indirect-overlong + if (FBS.test(WebAssembly::FeatureReferenceTypes)) { + FBS.set(WebAssembly::FeatureCallIndirectOverlong); + } + + setAvailableFeatures(FBS); // Don't type check if this is inline asm, since that is a naked sequence of // instructions without a function/locals decl. auto &SM = Parser.getSourceManager(); @@ -291,7 +302,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { DefaultFunctionTable = getOrCreateFunctionTableSymbol( getContext(), "__indirect_function_table", Is64); - if (!STI->checkFeatures("+reference-types")) + if (!STI->checkFeatures("+call-indirect-overlong") && + !STI->checkFeatures("+reference-types")) DefaultFunctionTable->setOmitFromLinkingSection(); } @@ -531,11 +543,13 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { } bool parseFunctionTableOperand(std::unique_ptr<WebAssemblyOperand> *Op) { - if (STI->checkFeatures("+reference-types")) { - // If the reference-types feature is enabled, there is an explicit table - // operand. To allow the same assembly to be compiled with or without - // reference types, we allow the operand to be omitted, in which case we - // default to __indirect_function_table. + if (STI->checkFeatures("+call-indirect-overlong") || + STI->checkFeatures("+reference-types")) { + // If the call-indirect-overlong feature is enabled, or implied by the + // reference-types feature, there is an explicit table operand. To allow + // the same assembly to be compiled with or without + // call-indirect-overlong, we allow the operand to be omitted, in which + // case we default to __indirect_function_table. auto &Tok = Lexer.getTok(); if (Tok.is(AsmToken::Identifier)) { auto *Sym = diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index 88628f2a793545..d393e3e00309f3 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -29,6 +29,10 @@ def FeatureBulkMemory : SubtargetFeature<"bulk-memory", "HasBulkMemory", "true", "Enable bulk memory operations">; +def FeatureBulkMemoryOpt : + SubtargetFeature<"bulk-memory-opt", "HasBulkMemoryOpt", "true", + "Enable bulk memory optimization operations">; + def FeatureExceptionHandling : SubtargetFeature<"exception-handling", "HasExceptionHandling", "true", "Enable Wasm exception handling">; @@ -63,6 +67,10 @@ def FeatureReferenceTypes : SubtargetFeature<"reference-types", "HasReferenceTypes", "true", "Enable reference types">; +def FeatureCallIndirectOverlong : + SubtargetFeature<"call-indirect-overlong", "HasCallIndirectOverlong", "true", + "Enable overlong encoding for call_indirect immediates">; + def FeatureRelaxedSIMD : SubtargetFeature<"relaxed-simd", "SIMDLevel", "RelaxedSIMD", "Enable relaxed-simd instructions">; @@ -114,19 +122,20 @@ def : ProcessorModel<"mvp", NoSchedModel, []>; // consideration given to available support in relevant engines and tools, and // the importance of the features. def : ProcessorModel<"generic", NoSchedModel, - [FeatureBulkMemory, FeatureMultivalue, - FeatureMutableGlobals, FeatureNontrappingFPToInt, - FeatureReferenceTypes, FeatureSignExt]>; + [FeatureBulkMemory, FeatureBulkMemoryOpt, + FeatureMultivalue, FeatureMutableGlobals, + FeatureNontrappingFPToInt, FeatureReferenceTypes, + FeatureCallIndirectOverlong, FeatureSignExt]>; // Latest and greatest experimental version of WebAssembly. Bugs included! def : ProcessorModel<"bleeding-edge", NoSchedModel, - [FeatureAtomics, FeatureBulkMemory, + [FeatureAtomics, FeatureBulkMemory, FeatureBulkMemoryOpt, FeatureExceptionHandling, FeatureExtendedConst, FeatureFP16, FeatureMultiMemory, FeatureMultivalue, FeatureMutableGlobals, FeatureNontrappingFPToInt, FeatureRelaxedSIMD, - FeatureReferenceTypes, FeatureSIMD128, FeatureSignExt, - FeatureTailCall]>; + FeatureReferenceTypes, FeatureCallIndirectOverlong, + FeatureSIMD128, FeatureSignExt, FeatureTailCall]>; //===----------------------------------------------------------------------===// // Target Declaration diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp index 558aaa38096f7e..210a35e1462aca 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp @@ -895,7 +895,7 @@ bool WebAssemblyFastISel::selectCall(const Instruction *I) { // The table into which this call_indirect indexes. MCSymbolWasm *Table = WebAssembly::getOrCreateFunctionTableSymbol( MF->getContext(), Subtarget); - if (Subtarget->hasReferenceTypes()) { + if (Subtarget->hasCallIndirectOverlong()) { MIB.addSym(Table); } else { // Otherwise for the MVP there is at most one table whose number is 0, but diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 2d00889407ff48..1fcbbcd523da52 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -768,7 +768,7 @@ LowerCallResults(MachineInstr &CallResults, DebugLoc DL, MachineBasicBlock *BB, MF.getContext(), Subtarget) : WebAssembly::getOrCreateFunctionTableSymbol( MF.getContext(), Subtarget); - if (Subtarget->hasReferenceTypes()) { + if (Subtarget->hasCallIndirectOverlong()) { MIB.addSym(Table); } else { // For the MVP there is at most one table whose number is 0, but we can't diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td index 0772afb039f820..79d6f21517e5d4 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrBulkMemory.td @@ -11,13 +11,13 @@ /// //===----------------------------------------------------------------------===// -// Instruction requiring HasBulkMemory and the bulk memory prefix byte +// Instruction requiring HasBulkMemoryOpt and the bulk memory prefix byte multiclass BULK_I<dag oops_r, dag iops_r, dag oops_s, dag iops_s, list<dag> pattern_r, string asmstr_r = "", string asmstr_s = "", bits<32> simdop = -1> { defm "" : I<oops_r, iops_r, oops_s, iops_s, pattern_r, asmstr_r, asmstr_s, !or(0xfc00, !and(0xff, simdop))>, - Requires<[HasBulkMemory]>; + Requires<[HasBulkMemoryOpt]>; } // Bespoke types and nodes for bulk memory ops @@ -89,14 +89,14 @@ defm CPY_A#B : I<(outs), (ins i32imm_op:$src_idx, i32imm_op:$dst_idx, rc:$dst, rc:$src, rc:$len )], "", "", 0>, - Requires<[HasBulkMemory]>; + Requires<[HasBulkMemoryOpt]>; let usesCustomInserter = 1, isCodeGenOnly = 1, mayStore = 1 in defm SET_A#B : I<(outs), (ins i32imm_op:$idx, rc:$dst, I32:$value, rc:$size), (outs), (ins i32imm_op:$idx), [(wasm_memset (i32 imm:$idx), rc:$dst, I32:$value, rc:$size)], "", "", 0>, - Requires<[HasBulkMemory]>; + Requires<[HasBulkMemoryOpt]>; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index b3ea499c4f915e..bd587d8897d86c 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -30,6 +30,10 @@ def HasBulkMemory : Predicate<"Subtarget->hasBulkMemory()">, AssemblerPredicate<(all_of FeatureBulkMemory), "bulk-memory">; +def HasBulkMemoryOpt : + Predicate<"Subtarget->hasBulkMemoryOpt()">, + AssemblerPredicate<(all_of FeatureBulkMemoryOpt), "bulk-memory-opt">; + def HasExceptionHandling : Predicate<"Subtarget->hasExceptionHandling()">, AssemblerPredicate<(all_of FeatureExceptionHandling), "exception-handling">; @@ -68,6 +72,10 @@ def HasReferenceTypes : Predicate<"Subtarget->hasReferenceTypes()">, AssemblerPredicate<(all_of FeatureReferenceTypes), "reference-types">; +def HasCallIndirectOverlong : + Predicate<"Subtarget->hasCallIndirectOverlong()">, + AssemblerPredicate<(all_of FeatureCallIndirectOverlong), "call-indirect-overlong">; + def HasRelaxedSIMD : Predicate<"Subtarget->hasRelaxedSIMD()">, AssemblerPredicate<(all_of FeatureRelaxedSIMD), "relaxed-simd">; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp index d51bfeb6d8592c..6f37dab4095349 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySelectionDAGInfo.cpp @@ -23,7 +23,7 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemcpy( SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo, MachinePointerInfo SrcPtrInfo) const { auto &ST = DAG.getMachineFunction().getSubtarget<WebAssemblySubtarget>(); - if (!ST.hasBulkMemory()) + if (!ST.hasBulkMemoryOpt()) return SDValue(); SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32); @@ -51,7 +51,7 @@ SDValue WebAssemblySelectionDAGInfo::EmitTargetCodeForMemset( SDValue Size, Align Alignment, bool IsVolatile, bool AlwaysInline, MachinePointerInfo DstPtrInfo) const { auto &ST = DAG.getMachineFunction().getSubtarget<WebAssemblySubtarget>(); - if (!ST.hasBulkMemory()) + if (!ST.hasBulkMemoryOpt()) return SDValue(); SDValue MemIdx = DAG.getConstant(0, DL, MVT::i32); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp index 912f61765579f8..7df15eb767093e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -34,6 +34,15 @@ WebAssemblySubtarget::initializeSubtargetDependencies(StringRef CPU, CPU = "generic"; ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS); + + // reference-types implies call-indirect-overlong + if (HasReferenceTypes) + HasCallIndirectOverlong = true; + + // bulk-memory implies bulk-memory-opt + if (HasBulkMemory) + HasBulkMemoryOpt = true; + return *this; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index f2bf2902f775b6..731919e5edb047 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -41,6 +41,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; + bool HasBulkMemoryOpt = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -49,6 +50,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; + bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; @@ -95,6 +97,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasAddr64() const { return TargetTriple.isArch64Bit(); } bool hasAtomics() const { return HasAtomics; } bool hasBulkMemory() const { return HasBulkMemory; } + bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasExtendedConst() const { return HasExtendedConst; } bool hasFP16() const { return HasFP16; } @@ -103,6 +106,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasMutableGlobals() const { return HasMutableGlobals; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } + bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasSignExt() const { return HasSignExt; } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp index f950a915db96f4..6cfc93ef1faae4 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyUtilities.cpp @@ -116,7 +116,7 @@ MCSymbolWasm *WebAssembly::getOrCreateFunctionTableSymbol( Sym->setUndefined(); } // MVP object files can't have symtab entries for tables. - if (!(Subtarget && Subtarget->hasReferenceTypes())) + if (!(Subtarget && Subtarget->hasCallIndirectOverlong())) Sym->setOmitFromLinkingSection(); return Sym; } @@ -141,7 +141,7 @@ MCSymbolWasm *WebAssembly::getOrCreateFuncrefCallTableSymbol( Sym->setTableType(TableType); } // MVP object files can't have symtab entries for tables. - if (!(Subtarget && Subtarget->hasReferenceTypes())) + if (!(Subtarget && Subtarget->hasCallIndirectOverlong())) Sym->setOmitFromLinkingSection(); return Sym; } diff --git a/llvm/test/CodeGen/WebAssembly/bulk-memory.ll b/llvm/test/CodeGen/WebAssembly/bulk-memory.ll index ae170d757a305a..f7c3dfe5ccad7e 100644 --- a/llvm/test/CodeGen/WebAssembly/bulk-memory.ll +++ b/llvm/test/CodeGen/WebAssembly/bulk-memory.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory | FileCheck %s --check-prefixes CHECK,BULK-MEM -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory-opt | FileCheck %s --check-prefixes CHECK,BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory-opt | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM -; Test that basic bulk memory codegen works correctly +; Test that basic bulk-memory-opt codegen works correctly target triple = "wasm32-unknown-unknown" diff --git a/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll b/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll index 0cf8493a995f96..eb39c2634497c0 100644 --- a/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll +++ b/llvm/test/CodeGen/WebAssembly/bulk-memory64.ll @@ -1,7 +1,7 @@ -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory | FileCheck %s --check-prefixes CHECK,BULK-MEM -; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=+bulk-memory-opt | FileCheck %s --check-prefixes CHECK,BULK-MEM +; RUN: llc < %s -asm-verbose=false -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mcpu=mvp -mattr=-bulk-memory-opt | FileCheck %s --check-prefixes CHECK,NO-BULK-MEM -; Test that basic bulk memory codegen works correctly +; Test that basic bulk memory opt codegen works correctly target triple = "wasm64-unknown-unknown" diff --git a/llvm/test/CodeGen/WebAssembly/call-indirect.ll b/llvm/test/CodeGen/WebAssembly/call-indirect.ll index 55a654f358490b..e0a0d14deacba0 100644 --- a/llvm/test/CodeGen/WebAssembly/call-indirect.ll +++ b/llvm/test/CodeGen/WebAssembly/call-indirect.ll @@ -1,5 +1,5 @@ -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 | FileCheck --check-prefixes=CHECK,NOREF %s -; RUN: llc < %s -asm-verbose=false -mattr=+reference-types -O2 | FileCheck --check-prefixes=CHECK,REF %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,NOREF %s +; RUN: llc < %s -asm-verbose=false -mattr=+call-indirect-overlong -O2 | FileCheck --check-prefixes=CHECK,REF %s ; RUN: llc < %s -asm-verbose=false -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=OBJ %s ; Test that compilation units with call_indirect but without any diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh-legacy.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh-legacy.ll index 3b312dabcd84d6..ab9023cbac6041 100644 --- a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh-legacy.ll +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh-legacy.ll @@ -1,9 +1,9 @@ ; REQUIRES: asserts ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,bulk-memory | FileCheck %s ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,bulk-memory -; RUN: llc < %s -O0 -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -verify-machineinstrs -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory | FileCheck %s --check-prefix=NOOPT -; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory -wasm-disable-ehpad-sort -stats 2>&1 | FileCheck %s --check-prefix=NOSORT -; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory -wasm-disable-ehpad-sort | FileCheck %s --check-prefix=NOSORT-LOCALS +; RUN: llc < %s -O0 -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -verify-machineinstrs -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt | FileCheck %s --check-prefix=NOOPT +; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt -wasm-disable-ehpad-sort -stats 2>&1 | FileCheck %s --check-prefix=NOSORT +; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt -wasm-disable-ehpad-sort | FileCheck %s --check-prefix=NOSORT-LOCALS target triple = "wasm32-unknown-unknown" diff --git a/llvm/test/CodeGen/WebAssembly/disable-feature.ll b/llvm/test/CodeGen/WebAssembly/disable-feature.ll index 0684432a114dfc..5f7275f3699ede 100644 --- a/llvm/test/CodeGen/WebAssembly/disable-feature.ll +++ b/llvm/test/CodeGen/WebAssembly/disable-feature.ll @@ -1,5 +1,5 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py -; RUN: llc < %s -mattr=-sign-ext,-bulk-memory | FileCheck %s +; RUN: llc < %s -mattr=-sign-ext,-bulk-memory,-bulk-memory-opt | FileCheck %s target triple = "wasm32-unknown-unknown" @@ -21,7 +21,7 @@ define i8 @not_use_extend8_s(i8 %v, i8 %x) { ret i8 %a } -attributes #0 = { "target-features"="+bulk-memory," } +attributes #0 = { "target-features"="+bulk-memory-opt" } declare void @llvm.memset.p0.i32(ptr, i8, i32, i1) diff --git a/llvm/test/CodeGen/WebAssembly/function-pointer64.ll b/llvm/test/CodeGen/WebAssembly/function-pointer64.ll index d5d10b00824fe0..2accd4151767f0 100644 --- a/llvm/test/CodeGen/WebAssembly/function-pointer64.ll +++ b/llvm/test/CodeGen/WebAssembly/function-pointer64.ll @@ -1,6 +1,6 @@ -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 | FileCheck %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 | FileCheck %s ; RUN: llc < %s -asm-verbose=false -mattr=+reference-types -O2 | FileCheck --check-prefix=REF %s -; RUN: llc < %s -asm-verbose=false -mattr=-reference-types -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s +; RUN: llc < %s -asm-verbose=false -mattr=-reference-types,-call-indirect-overlong -O2 --filetype=obj | obj2yaml | FileCheck --check-prefix=YAML %s ; This tests pointer features that may codegen differently in wasm64. diff --git a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll index ba10dd94a9838d..661f5d8463928d 100644 --- a/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll +++ b/llvm/test/CodeGen/WebAssembly/target-features-cpus.ll @@ -11,13 +11,19 @@ target triple = "wasm32-unknown-unknown" ; mvp: should not contain the target features section ; MVP-NOT: .custom_section.target_features,"",@ -; generic: +multivalue, +mutable-globals, +reference-types, +sign-ext +; generic: +call-indirect-overlong, +multivalue, +mutable-globals, +reference-types, +sign-ext ; GENERIC-LABEL: .custom_section.target_features,"",@ -; GENERIC-NEXT: .int8 6 +; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 11 ; GENERIC-NEXT: .ascii "bulk-memory" ; GENERIC-NEXT: .int8 43 +; GENERIC-NEXT: .int8 15 +; GENERIC-NEXT: .ascii "bulk-memory-opt" +; GENERIC-NEXT: .int8 43 +; GENERIC-NEXT: .int8 22 +; GENERIC-NEXT: .ascii "call-indirect-overlong" +; GENERIC-NEXT: .int8 43 ; GENERIC-NEXT: .int8 10 ; GENERIC-NEXT: .ascii "multivalue" ; GENERIC-NEXT: .int8 43 @@ -33,12 +39,13 @@ target triple = "wasm32-unknown-unknown" ; GENERIC-NEXT: .int8 8 ; GENERIC-NEXT: .ascii "sign-ext" -; bleeding-edge: +atomics, +bulk-memory, +exception-handling, +extended-const, -; +fp16, +multimemory, +multivalue, +mutable-globals, -; +nontrapping-fptoint, +relaxed-simd, +reference-types, -; +simd128, +sign-ext, +tail-call +; bleeding-edge: +atomics, +bulk-memory, +bulk-memory-opt, +; +call-indirect-overlong, +exception-handling, +; +extended-const, +fp16, +multimemory, +multivalue, +; +mutable-globals, +nontrapping-fptoint, +relaxed-simd, +; +reference-types, +simd128, +sign-ext, +tail-call ; BLEEDING-EDGE-LABEL: .section .custom_section.target_features,"",@ -; BLEEDING-EDGE-NEXT: .int8 14 +; BLEEDING-EDGE-NEXT: .int8 16 ; BLEEDING-EDGE-NEXT: .int8 43 ; BLEEDING-EDGE-NEXT: .int8 7 ; BLEEDING-EDGE-NEXT: .ascii "atomics" @@ -46,6 +53,12 @@ target triple = "wasm32-unknown-unknown" ; BLEEDING-EDGE-NEXT: .int8 11 ; BLEEDING-EDGE-NEXT: .ascii "bulk-memory" ; BLEEDING-EDGE-NEXT: .int8 43 +; BLEEDING-EDGE-NEXT: .int8 15 +; BLEEDING-EDGE-NEXT: .ascii "bulk-memory-opt" +; BLEEDING-EDGE-NEXT: .int8 43 +; BLEEDING-EDGE-NEXT: .int8 22 +; BLEEDING-EDGE-NEXT: .ascii "call-indirect-overlong" +; BLEEDING-EDGE-NEXT: .int8 43 ; BLEEDING-EDGE-NEXT: .int8 18 ; BLEEDING-EDGE-NEXT: .ascii "exception-handling" ; BLEEDING-EDGE-NEXT: .int8 43 diff --git a/llvm/test/MC/WebAssembly/extern-functype-intrinsic.ll b/llvm/test/MC/WebAssembly/extern-functype-intrinsic.ll index b321c0c82ad4d3..6e9c64604e99d1 100644 --- a/llvm/test/MC/WebAssembly/extern-functype-intrinsic.ll +++ b/llvm/test/MC/WebAssembly/extern-functype-intrinsic.ll @@ -1,5 +1,5 @@ -; RUN: llc %s -mattr=-bulk-memory -o - | FileCheck %s -; RUN: llc %s -mattr=-bulk-memory -o - | llvm-mc -triple=wasm32-unknown-unknown | FileCheck %s +; RUN: llc %s -mattr=-bulk-memory,-bulk-memory-opt -o - | FileCheck %s +; RUN: llc %s -mattr=-bulk-memory,-bulk-memory-opt -o - | llvm-mc -triple=wasm32-unknown-unknown | FileCheck %s ; ModuleID = 'test.c' source_filename = "test.c" diff --git a/llvm/test/MC/WebAssembly/function-alias.ll b/llvm/test/MC/WebAssembly/function-alias.ll index 036cd7d06e063a..3f76516a9bcc89 100644 --- a/llvm/test/MC/WebAssembly/function-alias.ll +++ b/llvm/test/MC/WebAssembly/function-alias.ll @@ -1,5 +1,5 @@ -; RUN: llc -filetype=obj %s -mattr=-reference-types -o - | llvm-readobj --symbols - | FileCheck %s -; RUN: llc -filetype=obj %s -mattr=+reference-types -o - | llvm-readobj --symbols - | FileCheck --check-prefix=REF %s +; RUN: llc -filetype=obj %s -mattr=-reference-types,-call-indirect-overlong -o - | llvm-readobj --symbols - | FileCheck %s +; RUN: llc -filetype=obj %s -mattr=+reference-types,-call-indirect-overlong -o - | llvm-readobj --symbols - | FileCheck --check-prefix=REF %s target triple = "wasm32-unknown-unknown-wasm" diff --git a/llvm/test/MC/WebAssembly/libcall.ll b/llvm/test/MC/WebAssembly/libcall.ll index ffd32abe2345bc..6f36ab7ad317f5 100644 --- a/llvm/test/MC/WebAssembly/libcall.ll +++ b/llvm/test/MC/WebAssembly/libcall.ll @@ -1,4 +1,4 @@ -; RUN: llc -filetype=obj -mattr=-bulk-memory %s -o - | obj2yaml | FileCheck %s +; RUN: llc -filetype=obj -mattr=-bulk-memory,-bulk-memory-opt %s -o - | obj2yaml | FileCheck %s target triple = "wasm32-unknown-unknown" >From 6b628ab5bd72b2c05bb02b99e53159112532e259 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Wed, 20 Nov 2024 18:09:08 -0800 Subject: [PATCH 02/11] Disable bulk-memory-opt in one more test. --- llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll index 6df626df08883f..22fda36c25bfde 100644 --- a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll @@ -1,9 +1,9 @@ ; REQUIRES: asserts ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,bulk-memory | FileCheck %s ; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,bulk-memory -; RUN: llc < %s -O0 -disable-wasm-fallthrough-return-opt -verify-machineinstrs -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory | FileCheck %s --check-prefix=NOOPT -; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory -wasm-disable-ehpad-sort -stats 2>&1 | FileCheck %s --check-prefix=NOSORT -; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory -wasm-disable-ehpad-sort | FileCheck %s --check-prefix=NOSORT-LOCALS +; RUN: llc < %s -O0 -disable-wasm-fallthrough-return-opt -verify-machineinstrs -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt | FileCheck %s --check-prefix=NOOPT +; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt -wasm-disable-ehpad-sort -stats 2>&1 | FileCheck %s --check-prefix=NOSORT +; RUN: llc < %s -disable-wasm-fallthrough-return-opt -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -wasm-enable-eh -wasm-enable-exnref -exception-model=wasm -mattr=+exception-handling,-bulk-memory,-bulk-memory-opt -wasm-disable-ehpad-sort | FileCheck %s --check-prefix=NOSORT-LOCALS target triple = "wasm32-unknown-unknown" >From 2c26e661654f9f19906362d096b0630666d2c0cd Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Wed, 20 Nov 2024 18:22:02 -0800 Subject: [PATCH 03/11] Add clang options for the new features. --- clang/include/clang/Driver/Options.td | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 5167c3c39e315a..c806349519dff5 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -5092,6 +5092,10 @@ def matomics : Flag<["-"], "matomics">, Group<m_wasm_Features_Group>; def mno_atomics : Flag<["-"], "mno-atomics">, Group<m_wasm_Features_Group>; def mbulk_memory : Flag<["-"], "mbulk-memory">, Group<m_wasm_Features_Group>; def mno_bulk_memory : Flag<["-"], "mno-bulk-memory">, Group<m_wasm_Features_Group>; +def mbulk_memory_opt : Flag<["-"], "mbulk-memory-opt">, Group<m_wasm_Features_Group>; +def mno_bulk_memory_opt : Flag<["-"], "mno-bulk-memory-opt">, Group<m_wasm_Features_Group>; +def mcall_indirect_overlong : Flag<["-"], "mcall-indirect-overlong">, Group<m_wasm_Features_Group>; +def mno_call_indirect_overlong : Flag<["-"], "mno-call-indirect-overlong">, Group<m_wasm_Features_Group>; def mexception_handing : Flag<["-"], "mexception-handling">, Group<m_wasm_Features_Group>; def mno_exception_handing : Flag<["-"], "mno-exception-handling">, Group<m_wasm_Features_Group>; def mextended_const : Flag<["-"], "mextended-const">, Group<m_wasm_Features_Group>; >From 2423264970431230d5057de41f4bc2285613fd80 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 17:36:04 -0800 Subject: [PATCH 04/11] Update clang/lib/Basic/Targets/WebAssembly.cpp Co-authored-by: Heejin Ahn <ahee...@gmail.com> --- clang/lib/Basic/Targets/WebAssembly.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index ba323940a8a86c..8147fcc45c98bd 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -333,17 +333,17 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( return false; } + // bulk-memory-opt is a subset of bulk-memory. + if (HasBulkMemory) { + HasBulkMemoryOpt = true; + } + // The reference-types feature included the change to `call_indirect` // encodings to support overlong immediates. if (HasReferenceTypes) { HasCallIndirectOverlong = true; } - // bulk-memory-opt is a subset of bulk-memory. - if (HasBulkMemory) { - HasBulkMemoryOpt = true; - } - return true; } >From a6b2d814da4038cd01a2d9278a0939bdd960759d Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 17:55:39 -0800 Subject: [PATCH 05/11] Update llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp Co-authored-by: Heejin Ahn <ahee...@gmail.com> --- llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp index 7df15eb767093e..4ad619afb5a982 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -35,13 +35,13 @@ WebAssemblySubtarget::initializeSubtargetDependencies(StringRef CPU, ParseSubtargetFeatures(CPU, /*TuneCPU*/ CPU, FS); - // reference-types implies call-indirect-overlong - if (HasReferenceTypes) - HasCallIndirectOverlong = true; - // bulk-memory implies bulk-memory-opt if (HasBulkMemory) HasBulkMemoryOpt = true; + + // reference-types implies call-indirect-overlong + if (HasReferenceTypes) + HasCallIndirectOverlong = true; return *this; } >From 416ec108e0d89aee07905c6495ead5eba46db2fa Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 17:55:09 -0800 Subject: [PATCH 06/11] Fix trailing whitespace. --- clang/lib/Basic/Targets/WebAssembly.cpp | 2 +- llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 8147fcc45c98bd..2d140d078eee13 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -337,7 +337,7 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( if (HasBulkMemory) { HasBulkMemoryOpt = true; } - + // The reference-types feature included the change to `call_indirect` // encodings to support overlong immediates. if (HasReferenceTypes) { diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp index 4ad619afb5a982..e7773b3d41085f 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.cpp @@ -38,7 +38,7 @@ WebAssemblySubtarget::initializeSubtargetDependencies(StringRef CPU, // bulk-memory implies bulk-memory-opt if (HasBulkMemory) HasBulkMemoryOpt = true; - + // reference-types implies call-indirect-overlong if (HasReferenceTypes) HasCallIndirectOverlong = true; >From b41b4523df5c81fd471679bb94ad6e55c8d4a010 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 18:15:33 -0800 Subject: [PATCH 07/11] Alphabetize. --- clang/lib/Basic/Targets/WebAssembly.cpp | 16 ++++++++-------- llvm/lib/Target/WebAssembly/WebAssembly.td | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.cpp b/clang/lib/Basic/Targets/WebAssembly.cpp index 2d140d078eee13..d9d01bceb433a2 100644 --- a/clang/lib/Basic/Targets/WebAssembly.cpp +++ b/clang/lib/Basic/Targets/WebAssembly.cpp @@ -214,6 +214,14 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasBulkMemoryOpt = false; continue; } + if (Feature == "+call-indirect-overlong") { + HasCallIndirectOverlong = true; + continue; + } + if (Feature == "-call-indirect-overlong") { + HasCallIndirectOverlong = false; + continue; + } if (Feature == "+exception-handling") { HasExceptionHandling = true; continue; @@ -279,14 +287,6 @@ bool WebAssemblyTargetInfo::handleTargetFeatures( HasReferenceTypes = false; continue; } - if (Feature == "+call-indirect-overlong") { - HasCallIndirectOverlong = true; - continue; - } - if (Feature == "-call-indirect-overlong") { - HasCallIndirectOverlong = false; - continue; - } if (Feature == "+relaxed-simd") { SIMDLevel = std::max(SIMDLevel, RelaxedSIMD); continue; diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index d393e3e00309f3..9ce247c78c6e7d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -123,19 +123,19 @@ def : ProcessorModel<"mvp", NoSchedModel, []>; // the importance of the features. def : ProcessorModel<"generic", NoSchedModel, [FeatureBulkMemory, FeatureBulkMemoryOpt, - FeatureMultivalue, FeatureMutableGlobals, - FeatureNontrappingFPToInt, FeatureReferenceTypes, - FeatureCallIndirectOverlong, FeatureSignExt]>; + FeatureCallIndirectOverlong, FeatureMultivalue, + FeatureMutableGlobals, FeatureNontrappingFPToInt, + FeatureReferenceTypes, FeatureSignExt]>; // Latest and greatest experimental version of WebAssembly. Bugs included! def : ProcessorModel<"bleeding-edge", NoSchedModel, [FeatureAtomics, FeatureBulkMemory, FeatureBulkMemoryOpt, - FeatureExceptionHandling, FeatureExtendedConst, - FeatureFP16, FeatureMultiMemory, + FeatureCallIndirectOverlong, FeatureExceptionHandling, + FeatureExtendedConst, FeatureFP16, FeatureMultiMemory, FeatureMultivalue, FeatureMutableGlobals, FeatureNontrappingFPToInt, FeatureRelaxedSIMD, - FeatureReferenceTypes, FeatureCallIndirectOverlong, - FeatureSIMD128, FeatureSignExt, FeatureTailCall]>; + FeatureReferenceTypes, FeatureSIMD128, FeatureSignExt, + FeatureTailCall]>; //===----------------------------------------------------------------------===// // Target Declaration >From a8c1193b9f6d345242495577ca8b04543cfc2e31 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 20:22:41 -0800 Subject: [PATCH 08/11] Update lld/wasm/InputFiles.cpp Co-authored-by: Heejin Ahn <ahee...@gmail.com> --- lld/wasm/InputFiles.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 53331aa58d2d37..8b02e15fcf431f 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -285,9 +285,9 @@ void ObjFile::addLegacyIndirectFunctionTableIfNeeded( return; // It's possible for an input to define tables and also use the indirect - // function table, but forget to compile with -mattr=+call-indirect-overlong. - // For these newer files, we require symbols for all tables, and - // relocations for all of their uses. + // function table, but forget to compile with -mattr=+call-indirect-overlong + // or -mattr=+reference-types. For these newer files, we require symbols for + // all tables, and relocations for all of their uses. if (tableSymbolCount != 0) { error(toString(this) + ": expected one symbol table entry for each of the " + >From ab657c8833bc3be88cf3c31895af041b84b3371d Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 20:24:44 -0800 Subject: [PATCH 09/11] Update lld/wasm/SyntheticSections.cpp Co-authored-by: Heejin Ahn <ahee...@gmail.com> --- lld/wasm/SyntheticSections.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lld/wasm/SyntheticSections.cpp b/lld/wasm/SyntheticSections.cpp index 747c203b996674..6b32d12ebeb455 100644 --- a/lld/wasm/SyntheticSections.cpp +++ b/lld/wasm/SyntheticSections.cpp @@ -326,8 +326,9 @@ void TableSection::addTable(InputTable *table) { // to assign table number 0 to the indirect function table. for (const auto *culprit : out.importSec->importedSymbols) { if (isa<UndefinedTable>(culprit)) { - error("object file not built with 'call-indirect-overlong' feature " - "conflicts with import of table " + + error("object file not built with 'reference-types' or " + "'call-indirect-overlong' feature conflicts with import of " + "table " + culprit->getName() + " by file " + toString(culprit->getFile())); return; >From 4321caa4fc33a7abc31bd885f0ae0a724d1036a4 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 20:27:40 -0800 Subject: [PATCH 10/11] Update lld/wasm/InputFiles.cpp Co-authored-by: Heejin Ahn <ahee...@gmail.com> --- lld/wasm/InputFiles.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lld/wasm/InputFiles.cpp b/lld/wasm/InputFiles.cpp index 8b02e15fcf431f..221f02aa1c1571 100644 --- a/lld/wasm/InputFiles.cpp +++ b/lld/wasm/InputFiles.cpp @@ -256,13 +256,13 @@ static void setRelocs(const std::vector<T *> &chunks, } // An object file can have two approaches to tables. With the -// call-indirect-overlong feature enabled (explicitly, or implied by the -// reference-types feature), input files that define or use tables declare the -// tables using symbols, and record each use with a relocation. This way when -// the linker combines inputs, it can collate the tables used by the inputs, -// assigning them distinct table numbers, and renumber all the uses as -// appropriate. At the same time, the linker has special logic to build the -// indirect function table if it is needed. +// reference-types feature or call-indirect-overlong feature enabled +// (explicitly, or implied by the reference-types feature), input files that +// define or use tables declare the tables using symbols, and record each use +// with a relocation. This way when the linker combines inputs, it can collate +// the tables used by the inputs, assigning them distinct table numbers, and +// renumber all the uses as appropriate. At the same time, the linker has +// special logic to build the indirect function table if it is needed. // // However, MVP object files (those that target WebAssembly 1.0, the "minimum // viable product" version of WebAssembly) neither write table symbols nor >From a55a1eebcd7ff8df00ed72f7b6603c7f0d954f17 Mon Sep 17 00:00:00 2001 From: Dan Gohman <dev@sunfishcode.online> Date: Thu, 21 Nov 2024 20:28:53 -0800 Subject: [PATCH 11/11] Alphabetize. --- clang/lib/Basic/Targets/WebAssembly.h | 2 +- llvm/lib/Target/WebAssembly/WebAssembly.td | 8 ++++---- llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td | 8 ++++---- llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h | 4 ++-- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h index 09da9d60dc5a34..3a56704248b655 100644 --- a/clang/lib/Basic/Targets/WebAssembly.h +++ b/clang/lib/Basic/Targets/WebAssembly.h @@ -56,6 +56,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; bool HasBulkMemoryOpt = false; + bool HasCallIndirectOverlong = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -64,7 +65,6 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; - bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.td b/llvm/lib/Target/WebAssembly/WebAssembly.td index 9ce247c78c6e7d..3b9254b3a7cee2 100644 --- a/llvm/lib/Target/WebAssembly/WebAssembly.td +++ b/llvm/lib/Target/WebAssembly/WebAssembly.td @@ -33,6 +33,10 @@ def FeatureBulkMemoryOpt : SubtargetFeature<"bulk-memory-opt", "HasBulkMemoryOpt", "true", "Enable bulk memory optimization operations">; +def FeatureCallIndirectOverlong : + SubtargetFeature<"call-indirect-overlong", "HasCallIndirectOverlong", "true", + "Enable overlong encoding for call_indirect immediates">; + def FeatureExceptionHandling : SubtargetFeature<"exception-handling", "HasExceptionHandling", "true", "Enable Wasm exception handling">; @@ -67,10 +71,6 @@ def FeatureReferenceTypes : SubtargetFeature<"reference-types", "HasReferenceTypes", "true", "Enable reference types">; -def FeatureCallIndirectOverlong : - SubtargetFeature<"call-indirect-overlong", "HasCallIndirectOverlong", "true", - "Enable overlong encoding for call_indirect immediates">; - def FeatureRelaxedSIMD : SubtargetFeature<"relaxed-simd", "SIMDLevel", "RelaxedSIMD", "Enable relaxed-simd instructions">; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td index bd587d8897d86c..415e802951a94d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrInfo.td @@ -34,6 +34,10 @@ def HasBulkMemoryOpt : Predicate<"Subtarget->hasBulkMemoryOpt()">, AssemblerPredicate<(all_of FeatureBulkMemoryOpt), "bulk-memory-opt">; +def HasCallIndirectOverlong : + Predicate<"Subtarget->hasCallIndirectOverlong()">, + AssemblerPredicate<(all_of FeatureCallIndirectOverlong), "call-indirect-overlong">; + def HasExceptionHandling : Predicate<"Subtarget->hasExceptionHandling()">, AssemblerPredicate<(all_of FeatureExceptionHandling), "exception-handling">; @@ -72,10 +76,6 @@ def HasReferenceTypes : Predicate<"Subtarget->hasReferenceTypes()">, AssemblerPredicate<(all_of FeatureReferenceTypes), "reference-types">; -def HasCallIndirectOverlong : - Predicate<"Subtarget->hasCallIndirectOverlong()">, - AssemblerPredicate<(all_of FeatureCallIndirectOverlong), "call-indirect-overlong">; - def HasRelaxedSIMD : Predicate<"Subtarget->hasRelaxedSIMD()">, AssemblerPredicate<(all_of FeatureRelaxedSIMD), "relaxed-simd">; diff --git a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h index 731919e5edb047..591ce25611e3e8 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h +++ b/llvm/lib/Target/WebAssembly/WebAssemblySubtarget.h @@ -42,6 +42,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasAtomics = false; bool HasBulkMemory = false; bool HasBulkMemoryOpt = false; + bool HasCallIndirectOverlong = false; bool HasExceptionHandling = false; bool HasExtendedConst = false; bool HasFP16 = false; @@ -50,7 +51,6 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool HasMutableGlobals = false; bool HasNontrappingFPToInt = false; bool HasReferenceTypes = false; - bool HasCallIndirectOverlong = false; bool HasSignExt = false; bool HasTailCall = false; bool HasWideArithmetic = false; @@ -98,6 +98,7 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasAtomics() const { return HasAtomics; } bool hasBulkMemory() const { return HasBulkMemory; } bool hasBulkMemoryOpt() const { return HasBulkMemoryOpt; } + bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } bool hasExceptionHandling() const { return HasExceptionHandling; } bool hasExtendedConst() const { return HasExtendedConst; } bool hasFP16() const { return HasFP16; } @@ -106,7 +107,6 @@ class WebAssemblySubtarget final : public WebAssemblyGenSubtargetInfo { bool hasMutableGlobals() const { return HasMutableGlobals; } bool hasNontrappingFPToInt() const { return HasNontrappingFPToInt; } bool hasReferenceTypes() const { return HasReferenceTypes; } - bool hasCallIndirectOverlong() const { return HasCallIndirectOverlong; } bool hasRelaxedSIMD() const { return SIMDLevel >= RelaxedSIMD; } bool hasSignExt() const { return HasSignExt; } bool hasSIMD128() const { return SIMDLevel >= SIMD128; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits