
Summary: Extends the multivalue call infrastructure to tail calls, removes all legacy calls specialized for particular result types, and removes the CallIndirectFixup pass, since all indirect call arguments are now fixed up directly in the post-insertion hook. In order to keep supporting pretty-printed defs and uses in test expectations, MCInstLower now inserts an immediate containing the number of defs for each call and call_indirect. The InstPrinter is updated to query this immediate if it is present and determine which MCOperands are defs and uses accordingly. Depends on D72902. Reviewers: aheejin Subscribers: dschuff, mgorny, sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D74192
79 lines
3.2 KiB
TableGen
79 lines
3.2 KiB
TableGen
//===- WebAssemblyInstrCall.td-WebAssembly Call codegen support -*- tablegen -*-
|
|
//
|
|
// 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
|
|
/// WebAssembly Call operand code-gen constructs.
|
|
///
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// TODO: addr64: These currently assume the callee address is 32-bit.
|
|
// FIXME: add $type to first call_indirect asmstr (and maybe $flags)
|
|
|
|
// Call sequence markers. These have an immediate which represents the amount of
|
|
// stack space to allocate or free, which is used for varargs lowering.
|
|
let Uses = [SP32, SP64], Defs = [SP32, SP64], isCodeGenOnly = 1 in {
|
|
defm ADJCALLSTACKDOWN : NRI<(outs), (ins i32imm:$amt, i32imm:$amt2),
|
|
[(WebAssemblycallseq_start timm:$amt, timm:$amt2)]>;
|
|
defm ADJCALLSTACKUP : NRI<(outs), (ins i32imm:$amt, i32imm:$amt2),
|
|
[(WebAssemblycallseq_end timm:$amt, timm:$amt2)]>;
|
|
} // Uses = [SP32, SP64], Defs = [SP32, SP64], isCodeGenOnly = 1
|
|
|
|
|
|
let Uses = [SP32, SP64], isCall = 1 in {
|
|
|
|
// CALL should take both variadic arguments and produce variadic results, but
|
|
// this is not possible to model directly. Instead, we select calls to a
|
|
// CALL_PARAMS taking variadic aguments linked with a CALL_RESULTS that handles
|
|
// producing the call's variadic results. We recombine the two in a custom
|
|
// inserter hook after DAG ISel, so passes over MachineInstrs will only ever
|
|
// observe CALL nodes with all of the expected variadic uses and defs.
|
|
let isPseudo = 1 in
|
|
defm CALL_PARAMS :
|
|
I<(outs), (ins function32_op:$callee, variable_ops),
|
|
(outs), (ins function32_op:$callee), [],
|
|
"call_params\t$callee", "call_params\t$callee", -1>;
|
|
|
|
let variadicOpsAreDefs = 1, usesCustomInserter = 1, isPseudo = 1 in
|
|
defm CALL_RESULTS :
|
|
I<(outs), (ins variable_ops), (outs), (ins), [],
|
|
"call_results", "call_results", -1>;
|
|
|
|
let variadicOpsAreDefs = 1, usesCustomInserter = 1, isPseudo = 1 in
|
|
defm RET_CALL_RESULTS :
|
|
I<(outs), (ins variable_ops), (outs), (ins), [],
|
|
"return_call_results", "return_call_results", -1>;
|
|
|
|
let variadicOpsAreDefs = 1 in
|
|
defm CALL :
|
|
I<(outs), (ins function32_op:$callee, variable_ops),
|
|
(outs), (ins function32_op:$callee), [],
|
|
"call", "call\t$callee", 0x10>;
|
|
|
|
let variadicOpsAreDefs = 1 in
|
|
defm CALL_INDIRECT :
|
|
I<(outs), (ins TypeIndex:$type, i32imm:$flags, variable_ops),
|
|
(outs), (ins TypeIndex:$type, i32imm:$flags), [],
|
|
"call_indirect", "call_indirect\t$type", 0x11>;
|
|
|
|
let isReturn = 1, isTerminator = 1, hasCtrlDep = 1, isBarrier = 1 in
|
|
defm RET_CALL :
|
|
I<(outs), (ins function32_op:$callee, variable_ops),
|
|
(outs), (ins function32_op:$callee), [],
|
|
"return_call \t$callee", "return_call\t$callee", 0x12>,
|
|
Requires<[HasTailCall]>;
|
|
|
|
let isReturn = 1 in
|
|
defm RET_CALL_INDIRECT :
|
|
I<(outs), (ins TypeIndex:$type, i32imm:$flags, variable_ops),
|
|
(outs), (ins TypeIndex:$type, i32imm:$flags), [],
|
|
"return_call_indirect\t", "return_call_indirect\t$type",
|
|
0x13>,
|
|
Requires<[HasTailCall]>;
|
|
|
|
} // Uses = [SP32,SP64], isCall = 1
|