
Multivalue feature of WebAssembly has been standardized for several years now. I think it makes sense to be able to enable it in the feature section by default for our clang/llvm-produced binaries so that the multivalue feature can be used as necessary when necessary within our toolchain and also when running other optimizers (e.g. wasm-opt) after the LLVM code generation. But some WebAssembly toolchains, such as Emscripten, do not provide both mulvalue-returning and not-multivalue-returning versions of libraries. Also allowing the uses of multivalue in the features section does not necessarily mean we generate them whenever we can to the fullest, which is a different code generation / optimization option. So this makes the lowering of multivalue returns conditional on the use of 'experimental-mv' target ABI. This ABI is turned off by default and turned on by passing `-Xclang -target-abi -Xclang experimental-mv` to `clang`, or `-target-abi experimental-mv` to `clang -cc1` or `llc`. But the purpose of this PR is not tying the multivalue lowering to this specific 'experimental-mv'. 'experimental-mv' is just one multivalue ABI we currently have, and it is still experimental, meaning it is not very well optimized or tuned for performance. (e.g. it does not have the limitation of the max number of multivalue-lowered values, which can be detrimental to performance.) We may change the name of this ABI, or improve it, or add a new multivalue ABI in the future. Also I heard that WASI is planning to add their multivalue ABI soon. So the plan is, whenever any one of multivalue ABIs is enabled, we enable the lowering of multivalue returns in the backend. We currently have only 'experimental-mv' in the repo so we only check for that in this PR. Related past discussions: #82714 https://github.com/WebAssembly/tool-conventions/pull/223#issuecomment-2008298652
81 lines
2.8 KiB
C++
81 lines
2.8 KiB
C++
//===-- WebAssemblyUtilities - WebAssembly Utility Functions ---*- C++ -*-====//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
///
|
|
/// \file
|
|
/// This file contains the declaration of the WebAssembly-specific
|
|
/// utility functions.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_UTILS_WEBASSEMBLYUTILITIES_H
|
|
#define LLVM_LIB_TARGET_WEBASSEMBLY_UTILS_WEBASSEMBLYUTILITIES_H
|
|
|
|
#include "llvm/Support/CommandLine.h"
|
|
|
|
namespace llvm {
|
|
|
|
class MachineBasicBlock;
|
|
class MachineInstr;
|
|
class MachineOperand;
|
|
class MCContext;
|
|
class MCSymbolWasm;
|
|
class TargetRegisterClass;
|
|
class WebAssemblyFunctionInfo;
|
|
class WebAssemblySubtarget;
|
|
|
|
namespace WebAssembly {
|
|
|
|
bool isChild(const MachineInstr &MI, const WebAssemblyFunctionInfo &MFI);
|
|
bool mayThrow(const MachineInstr &MI);
|
|
|
|
// Exception-related function names
|
|
extern const char *const ClangCallTerminateFn;
|
|
extern const char *const CxaBeginCatchFn;
|
|
extern const char *const CxaRethrowFn;
|
|
extern const char *const StdTerminateFn;
|
|
extern const char *const PersonalityWrapperFn;
|
|
|
|
/// Returns the operand number of a callee, assuming the argument is a call
|
|
/// instruction.
|
|
const MachineOperand &getCalleeOp(const MachineInstr &MI);
|
|
|
|
/// Returns the __indirect_function_table, for use in call_indirect and in
|
|
/// function bitcasts.
|
|
MCSymbolWasm *
|
|
getOrCreateFunctionTableSymbol(MCContext &Ctx,
|
|
const WebAssemblySubtarget *Subtarget);
|
|
|
|
/// Returns the __funcref_call_table, for use in funcref calls when lowered to
|
|
/// table.set + call_indirect.
|
|
MCSymbolWasm *
|
|
getOrCreateFuncrefCallTableSymbol(MCContext &Ctx,
|
|
const WebAssemblySubtarget *Subtarget);
|
|
|
|
/// Find a catch instruction from an EH pad. Returns null if no catch
|
|
/// instruction found or the catch is in an invalid location.
|
|
MachineInstr *findCatch(MachineBasicBlock *EHPad);
|
|
|
|
/// Returns the appropriate copy opcode for the given register class.
|
|
unsigned getCopyOpcodeForRegClass(const TargetRegisterClass *RC);
|
|
|
|
/// Returns true if multivalue returns of a function can be lowered directly,
|
|
/// i.e., not indirectly via a pointer parameter that points to the value in
|
|
/// memory.
|
|
bool canLowerMultivalueReturn(const WebAssemblySubtarget *Subtarget);
|
|
|
|
/// Returns true if the function's return value(s) can be lowered directly,
|
|
/// i.e., not indirectly via a pointer parameter that points to the value in
|
|
/// memory.
|
|
bool canLowerReturn(size_t ResultSize, const WebAssemblySubtarget *Subtarget);
|
|
|
|
} // end namespace WebAssembly
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif
|