|
LLVM 22.0.0git
|
This file implements a CFG stacking pass. More...
#include "Utils/WebAssemblyTypeUtilities.h"#include "WebAssembly.h"#include "WebAssemblyExceptionInfo.h"#include "WebAssemblyMachineFunctionInfo.h"#include "WebAssemblySortRegion.h"#include "WebAssemblySubtarget.h"#include "WebAssemblyTargetMachine.h"#include "WebAssemblyUtilities.h"#include "llvm/ADT/Statistic.h"#include "llvm/BinaryFormat/Wasm.h"#include "llvm/CodeGen/MachineDominators.h"#include "llvm/CodeGen/MachineInstrBuilder.h"#include "llvm/CodeGen/MachineLoopInfo.h"#include "llvm/CodeGen/WasmEHFuncInfo.h"#include "llvm/MC/MCAsmInfo.h"#include "llvm/Target/TargetMachine.h"Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "wasm-cfg-stackify" |
Functions | |
| STATISTIC (NumCallUnwindMismatches, "Number of call unwind mismatches found") | |
| STATISTIC (NumCatchUnwindMismatches, "Number of catch unwind mismatches found") | |
| INITIALIZE_PASS (WebAssemblyCFGStackify, DEBUG_TYPE, "Insert BLOCK/LOOP/TRY/TRY_TABLE markers for WebAssembly scopes", false, false) FunctionPass *llvm | |
| static bool | explicitlyBranchesTo (MachineBasicBlock *Pred, MachineBasicBlock *MBB) |
| Test whether Pred has any terminators explicitly branching to MBB, as opposed to falling through. | |
| template<typename Container> | |
| static MachineBasicBlock::iterator | getEarliestInsertPos (MachineBasicBlock *MBB, const Container &BeforeSet, const Container &AfterSet) |
| template<typename Container> | |
| static MachineBasicBlock::iterator | getLatestInsertPos (MachineBasicBlock *MBB, const Container &BeforeSet, const Container &AfterSet) |
| static void | unstackifyVRegsUsedInSplitBB (MachineBasicBlock &MBB, MachineBasicBlock &Split) |
| static void | splitEndLoopBB (MachineBasicBlock *EndTryTableBB) |
| static MachineBasicBlock * | getSingleUnwindDest (const MachineInstr *TryTable) |
| static void | appendEndToFunction (MachineFunction &MF, const WebAssemblyInstrInfo &TII) |
| static void | addUnreachableAfterTryTables (MachineFunction &MF, const WebAssemblyInstrInfo &TII) |
This file implements a CFG stacking pass.
This pass inserts BLOCK, LOOP, TRY, and TRY_TABLE markers to mark the start of scopes, since scope boundaries serve as the labels for WebAssembly's control transfers.
This is sufficient to convert arbitrary CFGs into a form that works on WebAssembly, provided that all loops are single-entry.
In case we use exceptions, this pass also fixes mismatches in unwind destinations created during transforming CFG into wasm structured format.
Definition in file WebAssemblyCFGStackify.cpp.
| #define DEBUG_TYPE "wasm-cfg-stackify" |
Definition at line 43 of file WebAssemblyCFGStackify.cpp.
|
static |
Definition at line 2425 of file WebAssemblyCFGStackify.cpp.
References llvm::BuildMI(), llvm::MachineFunction::CreateMachineBasicBlock(), llvm::MachineInstr::getDebugLoc(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineInstr::getParent(), llvm::MachineFunction::insert(), MBB, MI, and TII.
|
static |
Definition at line 2397 of file WebAssemblyCFGStackify.cpp.
References llvm::MachineFunction::back(), llvm::BuildMI(), llvm::MachineBasicBlock::end(), llvm::MachineBasicBlock::findPrevDebugLoc(), and TII.
|
static |
Test whether Pred has any terminators explicitly branching to MBB, as opposed to falling through.
Note that it's possible (eg. in unoptimized code) for a branch instruction to both branch to a block and fallthrough to it, so we check the actual branch operands to see if there are any explicit mentions.
Definition at line 194 of file WebAssemblyCFGStackify.cpp.
|
static |
Definition at line 210 of file WebAssemblyCFGStackify.cpp.
|
static |
Definition at line 234 of file WebAssemblyCFGStackify.cpp.
|
static |
Definition at line 2013 of file WebAssemblyCFGStackify.cpp.
References llvm::MachineOperand::getImm(), llvm::MachineOperand::getMBB(), llvm::MachineInstr::getOperand(), llvm_unreachable, llvm::wasm::WASM_OPCODE_CATCH, llvm::wasm::WASM_OPCODE_CATCH_ALL, llvm::wasm::WASM_OPCODE_CATCH_ALL_REF, and llvm::wasm::WASM_OPCODE_CATCH_REF.
| INITIALIZE_PASS | ( | WebAssemblyCFGStackify | , |
| DEBUG_TYPE | , | ||
| "Insert BLOCK/LOOP/TRY/TRY_TABLE markers for WebAssembly scopes" | , | ||
| false | , | ||
| false | ) |
Definition at line 180 of file WebAssemblyCFGStackify.cpp.
References llvm::createWebAssemblyCFGStackify(), and DEBUG_TYPE.
|
static |
Definition at line 1556 of file WebAssemblyCFGStackify.cpp.
References llvm::MachineBasicBlock::begin(), llvm::MachineFunction::CreateMachineBasicBlock(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::MachineBasicBlock::getParent(), llvm::MachineFunction::insert(), MI, and llvm::reverse().
| STATISTIC | ( | NumCallUnwindMismatches | , |
| "Number of call unwind mismatches found" | ) |
| STATISTIC | ( | NumCatchUnwindMismatches | , |
| "Number of catch unwind mismatches found" | ) |
|
static |
Definition at line 1113 of file WebAssemblyCFGStackify.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::BuildMI(), llvm::WebAssembly::getCopyOpcodeForRegClass(), llvm::MachineFunction::getInfo(), llvm::MachineFunction::getRegInfo(), llvm::MachineFunction::getSubtarget(), llvm::WebAssembly::isTee(), llvm::make_early_inc_range(), MBB, MI, MRI, Reg, and TII.