blob: e6aefc2ba43e900fae86a678bf63258c946d877e [file]
//===-- WebAssembly.h - Top-level interface for WebAssembly ----*- 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 entry points for global functions defined in
/// the LLVM WebAssembly back-end.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
#include "GISel/WebAssemblyRegisterBankInfo.h"
#include "WebAssemblySubtarget.h"
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/CodeGen/SelectionDAGISel.h"
#include "llvm/IR/Analysis.h"
#include "llvm/IR/PassManager.h"
#include "llvm/PassRegistry.h"
#include "llvm/Support/CodeGen.h"
namespace llvm {
class WebAssemblyTargetMachine;
class ModulePass;
class FunctionPass;
// LLVM IR passes.
class WebAssemblyLowerEmscriptenEHSjLjPass
: public RequiredPassInfoMixin<WebAssemblyLowerEmscriptenEHSjLjPass> {
bool EnableEmEH;
public:
WebAssemblyLowerEmscriptenEHSjLjPass(bool EnableEmEH = false)
: EnableEmEH(EnableEmEH) {}
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
};
ModulePass *createWebAssemblyLowerEmscriptenEHSjLjLegacyPass(bool EnableEmEH);
class WebAssemblyAddMissingPrototypesPass
: public RequiredPassInfoMixin<WebAssemblyAddMissingPrototypesPass> {
public:
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
};
ModulePass *createWebAssemblyAddMissingPrototypesLegacyPass();
class WebAssemblyFixFunctionBitcastsPass
: public RequiredPassInfoMixin<WebAssemblyFixFunctionBitcastsPass> {
public:
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
};
ModulePass *createWebAssemblyFixFunctionBitcastsLegacyPass();
class WebAssemblyOptimizeReturnedPass
: public OptionalPassInfoMixin<WebAssemblyOptimizeReturnedPass> {
public:
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};
FunctionPass *createWebAssemblyOptimizeReturnedLegacyPass();
class WebAssemblyRefTypeMem2LocalPass
: public RequiredPassInfoMixin<WebAssemblyRefTypeMem2LocalPass> {
public:
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};
FunctionPass *createWebAssemblyRefTypeMem2LocalLegacyPass();
class WebAssemblyReduceToAnyAllTruePass
: public RequiredPassInfoMixin<WebAssemblyReduceToAnyAllTruePass> {
private:
Module *CachedModule = nullptr;
bool ModuleHasInterestingIntrinsics = false;
WebAssemblyTargetMachine &TM;
public:
WebAssemblyReduceToAnyAllTruePass(WebAssemblyTargetMachine &TM) : TM(TM) {}
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
};
FunctionPass *
createWebAssemblyReduceToAnyAllTrueLegacyPass(WebAssemblyTargetMachine &TM);
class WebAssemblyCoalesceFeaturesAndStripAtomicsPass
: public RequiredPassInfoMixin<
WebAssemblyCoalesceFeaturesAndStripAtomicsPass> {
WebAssemblyTargetMachine &TM;
public:
WebAssemblyCoalesceFeaturesAndStripAtomicsPass(WebAssemblyTargetMachine &TM)
: TM(TM) {}
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
};
ModulePass *createWebAssemblyCoalesceFeaturesAndStripAtomicsLegacyPass(
WebAssemblyTargetMachine &TM);
// GlobalISel
InstructionSelector *
createWebAssemblyInstructionSelector(const WebAssemblyTargetMachine &,
const WebAssemblySubtarget &,
const WebAssemblyRegisterBankInfo &);
class WebAssemblyPostLegalizerCombinerPass
: public RequiredPassInfoMixin<WebAssemblyPostLegalizerCombinerPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyPostLegalizerCombinerLegacyPass();
class WebAssemblyPreLegalizerCombinerPass
: public RequiredPassInfoMixin<WebAssemblyPreLegalizerCombinerPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyPreLegalizerCombinerLegacyPass();
// ISel and immediate followup passes.
class WebAssemblyISelDAGToDAGPass : public SelectionDAGISelPass {
public:
WebAssemblyISelDAGToDAGPass(WebAssemblyTargetMachine &TM,
CodeGenOptLevel OptLevel);
};
FunctionPass *createWebAssemblyISelDagLegacyPass(WebAssemblyTargetMachine &TM,
CodeGenOptLevel OptLevel);
class WebAssemblyArgumentMovePass
: public RequiredPassInfoMixin<WebAssemblyArgumentMovePass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyArgumentMoveLegacyPass();
class WebAssemblySetP2AlignOperandsPass
: public RequiredPassInfoMixin<WebAssemblySetP2AlignOperandsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblySetP2AlignOperandsLegacyPass();
class WebAssemblyCleanCodeAfterTrapPass
: public RequiredPassInfoMixin<WebAssemblyCleanCodeAfterTrapPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyCleanCodeAfterTrapLegacyPass();
// Late passes.
class WebAssemblyReplacePhysRegsPass
: public RequiredPassInfoMixin<WebAssemblyReplacePhysRegsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyReplacePhysRegsLegacyPass();
class WebAssemblyNullifyDebugValueListsPass
: public RequiredPassInfoMixin<WebAssemblyNullifyDebugValueListsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyNullifyDebugValueListsLegacyPass();
class WebAssemblyOptimizeLiveIntervalsPass
: public RequiredPassInfoMixin<WebAssemblyOptimizeLiveIntervalsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyOptimizeLiveIntervalsLegacyPass();
class WebAssemblyMemIntrinsicResultsPass
: public RequiredPassInfoMixin<WebAssemblyMemIntrinsicResultsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyMemIntrinsicResultsLegacyPass();
class WebAssemblyRegStackifyPass
: public RequiredPassInfoMixin<WebAssemblyRegStackifyPass> {
private:
bool Optimize = false;
public:
WebAssemblyRegStackifyPass(CodeGenOptLevel OptLevel)
: Optimize(OptLevel != CodeGenOptLevel::None) {}
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyRegStackifyLegacyPass(CodeGenOptLevel OptLevel);
class WebAssemblyRegColoringPass
: public RequiredPassInfoMixin<WebAssemblyRegColoringPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyRegColoringLegacyPass();
class WebAssemblyFixBrTableDefaultsPass
: public RequiredPassInfoMixin<WebAssemblyFixBrTableDefaultsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyFixBrTableDefaultsLegacyPass();
class WebAssemblyFixIrreducibleControlFlowPass
: public RequiredPassInfoMixin<WebAssemblyFixIrreducibleControlFlowPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyFixIrreducibleControlFlowLegacyPass();
class WebAssemblyLateEHPreparePass
: public RequiredPassInfoMixin<WebAssemblyLateEHPreparePass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyLateEHPrepareLegacyPass();
class WebAssemblyCFGSortPass
: public RequiredPassInfoMixin<WebAssemblyCFGSortPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyCFGSortLegacyPass();
class WebAssemblyCFGStackifyPass
: public RequiredPassInfoMixin<WebAssemblyCFGStackifyPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyCFGStackifyLegacyPass();
class WebAssemblyExplicitLocalsPass
: public RequiredPassInfoMixin<WebAssemblyExplicitLocalsPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyExplicitLocalsLegacyPass();
class WebAssemblyLowerBrUnlessPass
: public RequiredPassInfoMixin<WebAssemblyLowerBrUnlessPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyLowerBrUnlessLegacyPass();
class WebAssemblyRegNumberingPass
: public RequiredPassInfoMixin<WebAssemblyRegNumberingPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyRegNumberingLegacyPass();
class WebAssemblyDebugFixupPass
: public RequiredPassInfoMixin<WebAssemblyDebugFixupPass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyDebugFixupLegacyPass();
class WebAssemblyPeepholePass
: public RequiredPassInfoMixin<WebAssemblyPeepholePass> {
public:
PreservedAnalyses run(MachineFunction &MF,
MachineFunctionAnalysisManager &MFAM);
};
FunctionPass *createWebAssemblyPeepholeLegacyPass();
class WebAssemblyMCLowerPrePass
: public RequiredPassInfoMixin<WebAssemblyMCLowerPrePass> {
public:
PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
};
ModulePass *createWebAssemblyMCLowerPreLegacyPass();
// PassRegistry initialization declarations.
void initializeWebAssemblyOptimizeReturnedLegacyPass(PassRegistry &);
void initializeWebAssemblyRefTypeMem2LocalLegacyPass(PassRegistry &);
void initializeWebAssemblyAddMissingPrototypesLegacyPass(PassRegistry &);
void initializeWebAssemblyArgumentMoveLegacyPass(PassRegistry &);
void initializeWebAssemblyAsmPrinterPass(PassRegistry &);
void initializeWebAssemblyCleanCodeAfterTrapLegacyPass(PassRegistry &);
void initializeWebAssemblyCFGSortLegacyPass(PassRegistry &);
void initializeWebAssemblyCFGStackifyLegacyPass(PassRegistry &);
void initializeWebAssemblyDAGToDAGISelLegacyPass(PassRegistry &);
void initializeWebAssemblyDebugFixupLegacyPass(PassRegistry &);
void initializeWebAssemblyExceptionInfoWrapperPassPass(PassRegistry &);
void initializeWebAssemblyExplicitLocalsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixBrTableDefaultsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixFunctionBitcastsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixIrreducibleControlFlowLegacyPass(PassRegistry &);
void initializeWebAssemblyLateEHPrepareLegacyPass(PassRegistry &);
void initializeWebAssemblyLowerBrUnlessLegacyPass(PassRegistry &);
void initializeWebAssemblyLowerEmscriptenEHSjLjLegacyPass(PassRegistry &);
void initializeWebAssemblyMCLowerPreLegacyPass(PassRegistry &);
void initializeWebAssemblyMemIntrinsicResultsLegacyPass(PassRegistry &);
void initializeWebAssemblyNullifyDebugValueListsLegacyPass(PassRegistry &);
void initializeWebAssemblyOptimizeLiveIntervalsLegacyPass(PassRegistry &);
void initializeWebAssemblyPeepholeLegacyPass(PassRegistry &);
void initializeWebAssemblyPostLegalizerCombinerLegacyPass(PassRegistry &);
void initializeWebAssemblyPreLegalizerCombinerLegacyPass(PassRegistry &);
void initializeWebAssemblyRegColoringLegacyPass(PassRegistry &);
void initializeWebAssemblyRegNumberingLegacyPass(PassRegistry &);
void initializeWebAssemblyRegStackifyLegacyPass(PassRegistry &);
void initializeWebAssemblyReplacePhysRegsLegacyPass(PassRegistry &);
void initializeWebAssemblySetP2AlignOperandsLegacyPass(PassRegistry &);
void initializeWebAssemblyCoalesceFeaturesAndStripAtomicsLegacyPass(
PassRegistry &);
namespace WebAssembly {
enum TargetIndex {
// Followed by a local index (ULEB).
TI_LOCAL,
// Followed by an absolute global index (ULEB). DEPRECATED.
TI_GLOBAL_FIXED,
// Followed by the index from the bottom of the Wasm stack.
TI_OPERAND_STACK,
// Followed by a compilation unit relative global index (uint32_t)
// that will have an associated relocation.
TI_GLOBAL_RELOC,
// Like TI_LOCAL, but indicates an indirect value (e.g. byval arg
// passed by pointer).
TI_LOCAL_INDIRECT
};
} // end namespace WebAssembly
} // end namespace llvm
#endif