1//===-- WebAssembly.h - Top-level interface for WebAssembly ----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file contains the entry points for global functions defined in
11/// the LLVM WebAssembly back-end.
12///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
16#define LLVM_LIB_TARGET_WEBASSEMBLY_WEBASSEMBLY_H
17
18#include "GISel/WebAssemblyRegisterBankInfo.h"
19#include "WebAssemblySubtarget.h"
20#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
21#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
23#include "llvm/CodeGen/SelectionDAGISel.h"
24#include "llvm/IR/Analysis.h"
25#include "llvm/IR/PassManager.h"
26#include "llvm/PassRegistry.h"
27#include "llvm/Support/CodeGen.h"
28
29namespace llvm {
30
31class WebAssemblyTargetMachine;
32class ModulePass;
33class FunctionPass;
34
35// LLVM IR passes.
36class WebAssemblyLowerEmscriptenEHSjLjPass
37 : public RequiredPassInfoMixin<WebAssemblyLowerEmscriptenEHSjLjPass> {
38public:
39 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
40};
41
42ModulePass *createWebAssemblyLowerEmscriptenEHSjLjLegacyPass();
43
44class WebAssemblyAddMissingPrototypesPass
45 : public RequiredPassInfoMixin<WebAssemblyAddMissingPrototypesPass> {
46public:
47 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
48};
49
50ModulePass *createWebAssemblyAddMissingPrototypesLegacyPass();
51
52class WebAssemblyFixFunctionBitcastsPass
53 : public RequiredPassInfoMixin<WebAssemblyFixFunctionBitcastsPass> {
54public:
55 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
56};
57
58ModulePass *createWebAssemblyFixFunctionBitcastsLegacyPass();
59
60class WebAssemblyOptimizeReturnedPass
61 : public OptionalPassInfoMixin<WebAssemblyOptimizeReturnedPass> {
62public:
63 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
64};
65
66FunctionPass *createWebAssemblyOptimizeReturnedLegacyPass();
67
68class WebAssemblyRefTypeMem2LocalPass
69 : public RequiredPassInfoMixin<WebAssemblyRefTypeMem2LocalPass> {
70public:
71 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
72};
73
74FunctionPass *createWebAssemblyRefTypeMem2LocalLegacyPass();
75
76class WebAssemblyReduceToAnyAllTruePass
77 : public RequiredPassInfoMixin<WebAssemblyReduceToAnyAllTruePass> {
78private:
79 Module *CachedModule = nullptr;
80 bool ModuleHasInterestingIntrinsics = false;
81 WebAssemblyTargetMachine &TM;
82
83public:
84 WebAssemblyReduceToAnyAllTruePass(WebAssemblyTargetMachine &TM) : TM(TM) {}
85 PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
86};
87
88FunctionPass *
89createWebAssemblyReduceToAnyAllTrueLegacyPass(WebAssemblyTargetMachine &TM);
90
91class WebAssemblyCoalesceFeaturesAndStripAtomicsPass
92 : public RequiredPassInfoMixin<
93 WebAssemblyCoalesceFeaturesAndStripAtomicsPass> {
94 WebAssemblyTargetMachine &TM;
95
96public:
97 WebAssemblyCoalesceFeaturesAndStripAtomicsPass(WebAssemblyTargetMachine &TM)
98 : TM(TM) {}
99 PreservedAnalyses run(Module &M, ModuleAnalysisManager &MAM);
100};
101
102ModulePass *createWebAssemblyCoalesceFeaturesAndStripAtomicsLegacyPass(
103 WebAssemblyTargetMachine &TM);
104
105// GlobalISel
106InstructionSelector *
107createWebAssemblyInstructionSelector(const WebAssemblyTargetMachine &,
108 const WebAssemblySubtarget &,
109 const WebAssemblyRegisterBankInfo &);
110
111FunctionPass *createWebAssemblyPostLegalizerCombiner();
112void initializeWebAssemblyPostLegalizerCombinerPass(PassRegistry &);
113
114FunctionPass *createWebAssemblyPreLegalizerCombiner();
115void initializeWebAssemblyPreLegalizerCombinerPass(PassRegistry &);
116
117// ISel and immediate followup passes.
118class WebAssemblyISelDAGToDAGPass : public SelectionDAGISelPass {
119public:
120 WebAssemblyISelDAGToDAGPass(WebAssemblyTargetMachine &TM,
121 CodeGenOptLevel OptLevel);
122};
123
124FunctionPass *createWebAssemblyISelDagLegacyPass(WebAssemblyTargetMachine &TM,
125 CodeGenOptLevel OptLevel);
126
127class WebAssemblyArgumentMovePass
128 : public RequiredPassInfoMixin<WebAssemblyArgumentMovePass> {
129public:
130 PreservedAnalyses run(MachineFunction &MF,
131 MachineFunctionAnalysisManager &MFAM);
132};
133
134FunctionPass *createWebAssemblyArgumentMoveLegacyPass();
135
136class WebAssemblySetP2AlignOperandsPass
137 : public RequiredPassInfoMixin<WebAssemblySetP2AlignOperandsPass> {
138public:
139 PreservedAnalyses run(MachineFunction &MF,
140 MachineFunctionAnalysisManager &MFAM);
141};
142
143FunctionPass *createWebAssemblySetP2AlignOperandsLegacyPass();
144
145class WebAssemblyCleanCodeAfterTrapPass
146 : public RequiredPassInfoMixin<WebAssemblyCleanCodeAfterTrapPass> {
147public:
148 PreservedAnalyses run(MachineFunction &MF,
149 MachineFunctionAnalysisManager &MFAM);
150};
151
152FunctionPass *createWebAssemblyCleanCodeAfterTrapLegacyPass();
153
154// Late passes.
155class WebAssemblyReplacePhysRegsPass
156 : public RequiredPassInfoMixin<WebAssemblyReplacePhysRegsPass> {
157public:
158 PreservedAnalyses run(MachineFunction &MF,
159 MachineFunctionAnalysisManager &MFAM);
160};
161
162FunctionPass *createWebAssemblyReplacePhysRegsLegacyPass();
163
164class WebAssemblyNullifyDebugValueListsPass
165 : public RequiredPassInfoMixin<WebAssemblyNullifyDebugValueListsPass> {
166public:
167 PreservedAnalyses run(MachineFunction &MF,
168 MachineFunctionAnalysisManager &MFAM);
169};
170
171FunctionPass *createWebAssemblyNullifyDebugValueListsLegacyPass();
172FunctionPass *createWebAssemblyOptimizeLiveIntervals();
173FunctionPass *createWebAssemblyMemIntrinsicResults();
174FunctionPass *createWebAssemblyRegStackify(CodeGenOptLevel OptLevel);
175FunctionPass *createWebAssemblyRegColoring();
176
177class WebAssemblyFixBrTableDefaultsPass
178 : public RequiredPassInfoMixin<WebAssemblyFixBrTableDefaultsPass> {
179public:
180 PreservedAnalyses run(MachineFunction &MF,
181 MachineFunctionAnalysisManager &MFAM);
182};
183
184FunctionPass *createWebAssemblyFixBrTableDefaultsLegacyPass();
185
186class WebAssemblyFixIrreducibleControlFlowPass
187 : public RequiredPassInfoMixin<WebAssemblyFixIrreducibleControlFlowPass> {
188public:
189 PreservedAnalyses run(MachineFunction &MF,
190 MachineFunctionAnalysisManager &MFAM);
191};
192
193FunctionPass *createWebAssemblyFixIrreducibleControlFlowLegacyPass();
194
195class WebAssemblyLateEHPreparePass
196 : public RequiredPassInfoMixin<WebAssemblyLateEHPreparePass> {
197public:
198 PreservedAnalyses run(MachineFunction &MF,
199 MachineFunctionAnalysisManager &MFAM);
200};
201
202FunctionPass *createWebAssemblyLateEHPrepareLegacyPass();
203FunctionPass *createWebAssemblyCFGSort();
204FunctionPass *createWebAssemblyCFGStackify();
205FunctionPass *createWebAssemblyExplicitLocals();
206FunctionPass *createWebAssemblyLowerBrUnless();
207FunctionPass *createWebAssemblyRegNumbering();
208FunctionPass *createWebAssemblyVecReduce();
209FunctionPass *createWebAssemblyDebugFixup();
210FunctionPass *createWebAssemblyPeephole();
211ModulePass *createWebAssemblyMCLowerPrePass();
212
213// PassRegistry initialization declarations.
214void initializeWebAssemblyOptimizeReturnedLegacyPass(PassRegistry &);
215void initializeWebAssemblyRefTypeMem2LocalLegacyPass(PassRegistry &);
216void initializeWebAssemblyAddMissingPrototypesLegacyPass(PassRegistry &);
217void initializeWebAssemblyArgumentMoveLegacyPass(PassRegistry &);
218void initializeWebAssemblyAsmPrinterPass(PassRegistry &);
219void initializeWebAssemblyCleanCodeAfterTrapLegacyPass(PassRegistry &);
220void initializeWebAssemblyCFGSortPass(PassRegistry &);
221void initializeWebAssemblyCFGStackifyPass(PassRegistry &);
222void initializeWebAssemblyDAGToDAGISelLegacyPass(PassRegistry &);
223void initializeWebAssemblyDebugFixupPass(PassRegistry &);
224void initializeWebAssemblyExceptionInfoPass(PassRegistry &);
225void initializeWebAssemblyExplicitLocalsPass(PassRegistry &);
226void initializeWebAssemblyFixBrTableDefaultsLegacyPass(PassRegistry &);
227void initializeWebAssemblyFixFunctionBitcastsLegacyPass(PassRegistry &);
228void initializeWebAssemblyFixIrreducibleControlFlowLegacyPass(PassRegistry &);
229void initializeWebAssemblyLateEHPrepareLegacyPass(PassRegistry &);
230void initializeWebAssemblyLowerBrUnlessPass(PassRegistry &);
231void initializeWebAssemblyLowerEmscriptenEHSjLjLegacyPass(PassRegistry &);
232void initializeWebAssemblyMCLowerPrePassPass(PassRegistry &);
233void initializeWebAssemblyMemIntrinsicResultsPass(PassRegistry &);
234void initializeWebAssemblyNullifyDebugValueListsLegacyPass(PassRegistry &);
235void initializeWebAssemblyOptimizeLiveIntervalsPass(PassRegistry &);
236void initializeWebAssemblyPeepholePass(PassRegistry &);
237void initializeWebAssemblyRegColoringPass(PassRegistry &);
238void initializeWebAssemblyRegNumberingPass(PassRegistry &);
239void initializeWebAssemblyRegStackifyPass(PassRegistry &);
240void initializeWebAssemblyReplacePhysRegsLegacyPass(PassRegistry &);
241void initializeWebAssemblySetP2AlignOperandsLegacyPass(PassRegistry &);
242void initializeWebAssemblyCoalesceFeaturesAndStripAtomicsLegacyPass(
243 PassRegistry &);
244
245namespace WebAssembly {
246enum TargetIndex {
247 // Followed by a local index (ULEB).
248 TI_LOCAL,
249 // Followed by an absolute global index (ULEB). DEPRECATED.
250 TI_GLOBAL_FIXED,
251 // Followed by the index from the bottom of the Wasm stack.
252 TI_OPERAND_STACK,
253 // Followed by a compilation unit relative global index (uint32_t)
254 // that will have an associated relocation.
255 TI_GLOBAL_RELOC,
256 // Like TI_LOCAL, but indicates an indirect value (e.g. byval arg
257 // passed by pointer).
258 TI_LOCAL_INDIRECT
259};
260} // end namespace WebAssembly
261
262} // end namespace llvm
263
264#endif
265