LLVM 22.0.0git
WebAssemblyTargetMachine.cpp
Go to the documentation of this file.
1//===- WebAssemblyTargetMachine.cpp - Define TargetMachine for WebAssembly -==//
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 defines the WebAssembly-specific subclass of TargetMachine.
11///
12//===----------------------------------------------------------------------===//
13
17#include "WebAssembly.h"
24#include "llvm/CodeGen/Passes.h"
27#include "llvm/IR/Function.h"
35#include <optional>
36using namespace llvm;
37
38#define DEBUG_TYPE "wasm"
39
40// A command-line option to keep implicit locals
41// for the purpose of testing with lit/llc ONLY.
42// This produces output which is not valid WebAssembly, and is not supported
43// by assemblers/disassemblers and other MC based tools.
45 "wasm-disable-explicit-locals", cl::Hidden,
46 cl::desc("WebAssembly: output implicit locals in"
47 " instruction output for test purposes only."),
48 cl::init(false));
49
51 "wasm-disable-fix-irreducible-control-flow-pass", cl::Hidden,
52 cl::desc("webassembly: disables the fix "
53 " irreducible control flow optimization pass"),
54 cl::init(false));
55
56// Exception handling & setjmp-longjmp handling related options.
57
58// Emscripten's asm.js-style exception handling
60 "enable-emscripten-cxx-exceptions",
61 cl::desc("WebAssembly Emscripten-style exception handling"),
62 cl::init(false));
63// Emscripten's asm.js-style setjmp/longjmp handling
65 "enable-emscripten-sjlj",
66 cl::desc("WebAssembly Emscripten-style setjmp/longjmp handling"),
67 cl::init(false));
68// Exception handling using wasm EH instructions
70 WebAssembly::WasmEnableEH("wasm-enable-eh",
71 cl::desc("WebAssembly exception handling"));
72// setjmp/longjmp handling using wasm EH instrutions
74 "wasm-enable-sjlj", cl::desc("WebAssembly setjmp/longjmp handling"));
75// If true, use the legacy Wasm EH proposal:
76// https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/legacy/Exceptions.md
77// And if false, use the standardized Wasm EH proposal:
78// https://github.com/WebAssembly/exception-handling/blob/main/proposals/exception-handling/Exceptions.md
79// Currently set to true by default because not all major web browsers turn on
80// the new standard proposal by default, but will later change to false.
82 "wasm-use-legacy-eh", cl::desc("WebAssembly exception handling (legacy)"),
83 cl::init(true));
84
87 // Register the target.
92
93 // Register backend passes
124}
125
126//===----------------------------------------------------------------------===//
127// WebAssembly Lowering public interface.
128//===----------------------------------------------------------------------===//
129
130static Reloc::Model getEffectiveRelocModel(std::optional<Reloc::Model> RM) {
131 // Default to static relocation model. This should always be more optimial
132 // than PIC since the static linker can determine all global addresses and
133 // assume direct function calls.
134 return RM.value_or(Reloc::Static);
135}
136
141
143
144 // You can't enable two modes of EH at the same time
145 if (WasmEnableEmEH && WasmEnableEH)
147 "-enable-emscripten-cxx-exceptions not allowed with -wasm-enable-eh");
148 // You can't enable two modes of SjLj at the same time
149 if (WasmEnableEmSjLj && WasmEnableSjLj)
151 "-enable-emscripten-sjlj not allowed with -wasm-enable-sjlj");
152 // You can't mix Emscripten EH with Wasm SjLj.
153 if (WasmEnableEmEH && WasmEnableSjLj)
155 "-enable-emscripten-cxx-exceptions not allowed with -wasm-enable-sjlj");
156
157 if (TM->Options.ExceptionModel == ExceptionHandling::None) {
158 // FIXME: These flags should be removed in favor of directly using the
159 // generically configured ExceptionsType
161 TM->Options.ExceptionModel = ExceptionHandling::Wasm;
162 }
163
164 // Basic Correctness checking related to -exception-model
165 if (TM->Options.ExceptionModel != ExceptionHandling::None &&
166 TM->Options.ExceptionModel != ExceptionHandling::Wasm)
167 report_fatal_error("-exception-model should be either 'none' or 'wasm'");
168 if (WasmEnableEmEH && TM->Options.ExceptionModel == ExceptionHandling::Wasm)
169 report_fatal_error("-exception-model=wasm not allowed with "
170 "-enable-emscripten-cxx-exceptions");
171 if (WasmEnableEH && TM->Options.ExceptionModel != ExceptionHandling::Wasm)
173 "-wasm-enable-eh only allowed with -exception-model=wasm");
174 if (WasmEnableSjLj && TM->Options.ExceptionModel != ExceptionHandling::Wasm)
176 "-wasm-enable-sjlj only allowed with -exception-model=wasm");
177 if ((!WasmEnableEH && !WasmEnableSjLj) &&
178 TM->Options.ExceptionModel == ExceptionHandling::Wasm)
180 "-exception-model=wasm only allowed with at least one of "
181 "-wasm-enable-eh or -wasm-enable-sjlj");
182
183 // Currently it is allowed to mix Wasm EH with Emscripten SjLj as an interim
184 // measure, but some code will error out at compile time in this combination.
185 // See WebAssemblyLowerEmscriptenEHSjLj pass for details.
186}
187
188/// Create an WebAssembly architecture model.
189///
191 const Target &T, const Triple &TT, StringRef CPU, StringRef FS,
192 const TargetOptions &Options, std::optional<Reloc::Model> RM,
193 std::optional<CodeModel::Model> CM, CodeGenOptLevel OL, bool JIT)
194 : CodeGenTargetMachineImpl(T, TT.computeDataLayout(), TT, CPU, FS, Options,
196 getEffectiveCodeModel(CM, CodeModel::Large), OL),
197 TLOF(new WebAssemblyTargetObjectFile()),
198 UsesMultivalueABI(Options.MCOptions.getABIName() == "experimental-mv") {
199 // WebAssembly type-checks instructions, but a noreturn function with a return
200 // type that doesn't match the context will cause a check failure. So we lower
201 // LLVM 'unreachable' to ISD::TRAP and then lower that to WebAssembly's
202 // 'unreachable' instructions which is meant for that case. Formerly, we also
203 // needed to add checks to SP failure emission in the instruction selection
204 // backends, but this has since been tied to TrapUnreachable and is no longer
205 // necessary.
206 this->Options.TrapUnreachable = true;
207 this->Options.NoTrapAfterNoreturn = false;
208
209 // WebAssembly treats each function as an independent unit. Force
210 // -ffunction-sections, effectively, so that we can emit them independently.
211 this->Options.FunctionSections = true;
212 this->Options.DataSections = true;
213 this->Options.UniqueSectionNames = true;
214
215 initAsmInfo();
217 // Note that we don't use setRequiresStructuredCFG(true). It disables
218 // optimizations than we're ok with, and want, such as critical edge
219 // splitting and tail merging.
220}
221
223
228
231 std::string FS) const {
232 auto &I = SubtargetMap[CPU + FS];
233 if (!I) {
234 I = std::make_unique<WebAssemblySubtarget>(TargetTriple, CPU, FS, *this);
235 }
236 return I.get();
237}
238
241 Attribute CPUAttr = F.getFnAttribute("target-cpu");
242 Attribute FSAttr = F.getFnAttribute("target-features");
243
244 std::string CPU =
245 CPUAttr.isValid() ? CPUAttr.getValueAsString().str() : TargetCPU;
246 std::string FS =
247 FSAttr.isValid() ? FSAttr.getValueAsString().str() : TargetFS;
248
249 // This needs to be done before we create a new subtarget since any
250 // creation will depend on the TM and the code generation flags on the
251 // function that reside in TargetOptions.
253
254 return getSubtargetImpl(CPU, FS);
255}
256
257namespace {
258
259class CoalesceFeaturesAndStripAtomics final : public ModulePass {
260 // Take the union of all features used in the module and use it for each
261 // function individually, since having multiple feature sets in one module
262 // currently does not make sense for WebAssembly. If atomics are not enabled,
263 // also strip atomic operations and thread local storage.
264 static char ID;
266
267public:
268 CoalesceFeaturesAndStripAtomics(WebAssemblyTargetMachine *WasmTM)
269 : ModulePass(ID), WasmTM(WasmTM) {}
270
271 bool runOnModule(Module &M) override {
272 FeatureBitset Features = coalesceFeatures(M);
273
274 std::string FeatureStr = getFeatureString(Features);
275 WasmTM->setTargetFeatureString(FeatureStr);
276 for (auto &F : M)
277 replaceFeatures(F, FeatureStr);
278
279 bool StrippedAtomics = false;
280 bool StrippedTLS = false;
281
282 if (!Features[WebAssembly::FeatureAtomics]) {
283 StrippedAtomics = stripAtomics(M);
284 StrippedTLS = stripThreadLocals(M);
285 } else if (!Features[WebAssembly::FeatureBulkMemory]) {
286 StrippedTLS |= stripThreadLocals(M);
287 }
288
289 if (StrippedAtomics && !StrippedTLS)
290 stripThreadLocals(M);
291 else if (StrippedTLS && !StrippedAtomics)
292 stripAtomics(M);
293
294 recordFeatures(M, Features, StrippedAtomics || StrippedTLS);
295
296 // Conservatively assume we have made some change
297 return true;
298 }
299
300private:
301 FeatureBitset coalesceFeatures(const Module &M) {
302 // Union the features of all defined functions. Start with an empty set, so
303 // that if a feature is disabled in every function, we'll compute it as
304 // disabled. If any function lacks a target-features attribute, it'll
305 // default to the target CPU from the `TargetMachine`.
306 FeatureBitset Features;
307 bool AnyDefinedFuncs = false;
308 for (auto &F : M) {
309 if (F.isDeclaration())
310 continue;
311
312 Features |= WasmTM->getSubtargetImpl(F)->getFeatureBits();
313 AnyDefinedFuncs = true;
314 }
315
316 // If we have no defined functions, use the target CPU from the
317 // `TargetMachine`.
318 if (!AnyDefinedFuncs) {
319 Features =
320 WasmTM
321 ->getSubtargetImpl(std::string(WasmTM->getTargetCPU()),
322 std::string(WasmTM->getTargetFeatureString()))
323 ->getFeatureBits();
324 }
325
326 return Features;
327 }
328
329 static std::string getFeatureString(const FeatureBitset &Features) {
330 std::string Ret;
331 for (const SubtargetFeatureKV &KV : WebAssemblyFeatureKV) {
332 if (Features[KV.Value])
333 Ret += (StringRef("+") + KV.Key + ",").str();
334 else
335 Ret += (StringRef("-") + KV.Key + ",").str();
336 }
337 return Ret;
338 }
339
340 void replaceFeatures(Function &F, const std::string &Features) {
341 F.removeFnAttr("target-features");
342 F.removeFnAttr("target-cpu");
343 F.addFnAttr("target-features", Features);
344 }
345
346 bool stripAtomics(Module &M) {
347 // Detect whether any atomics will be lowered, since there is no way to tell
348 // whether the LowerAtomic pass lowers e.g. stores.
349 bool Stripped = false;
350 for (auto &F : M) {
351 for (auto &B : F) {
352 for (auto &I : B) {
353 if (I.isAtomic()) {
354 Stripped = true;
355 goto done;
356 }
357 }
358 }
359 }
360
361 done:
362 if (!Stripped)
363 return false;
364
365 LowerAtomicPass Lowerer;
367 for (auto &F : M)
368 Lowerer.run(F, FAM);
369
370 return true;
371 }
372
373 bool stripThreadLocals(Module &M) {
374 bool Stripped = false;
375 for (auto &GV : M.globals()) {
376 if (GV.isThreadLocal()) {
377 // replace `@llvm.threadlocal.address.pX(GV)` with `GV`.
378 for (Use &U : make_early_inc_range(GV.uses())) {
379 if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(U.getUser())) {
380 if (II->getIntrinsicID() == Intrinsic::threadlocal_address &&
381 II->getArgOperand(0) == &GV) {
382 II->replaceAllUsesWith(&GV);
383 II->eraseFromParent();
384 }
385 }
386 }
387
388 Stripped = true;
389 GV.setThreadLocal(false);
390 }
391 }
392 return Stripped;
393 }
394
395 void recordFeatures(Module &M, const FeatureBitset &Features, bool Stripped) {
396 for (const SubtargetFeatureKV &KV : WebAssemblyFeatureKV) {
397 if (Features[KV.Value]) {
398 // Mark features as used
399 std::string MDKey = (StringRef("wasm-feature-") + KV.Key).str();
400 M.addModuleFlag(Module::ModFlagBehavior::Error, MDKey,
402 }
403 }
404 // Code compiled without atomics or bulk-memory may have had its atomics or
405 // thread-local data lowered to nonatomic operations or non-thread-local
406 // data. In that case, we mark the pseudo-feature "shared-mem" as disallowed
407 // to tell the linker that it would be unsafe to allow this code ot be used
408 // in a module with shared memory.
409 if (Stripped) {
410 M.addModuleFlag(Module::ModFlagBehavior::Error, "wasm-feature-shared-mem",
412 }
413 }
414};
415char CoalesceFeaturesAndStripAtomics::ID = 0;
416
417/// WebAssembly Code Generator Pass Configuration Options.
418class WebAssemblyPassConfig final : public TargetPassConfig {
419public:
420 WebAssemblyPassConfig(WebAssemblyTargetMachine &TM, PassManagerBase &PM)
421 : TargetPassConfig(TM, PM) {}
422
423 WebAssemblyTargetMachine &getWebAssemblyTargetMachine() const {
425 }
426
427 FunctionPass *createTargetRegisterAllocator(bool) override;
428
429 void addIRPasses() override;
430 void addISelPrepare() override;
431 bool addInstSelector() override;
432 void addOptimizedRegAlloc() override;
433 void addPostRegAlloc() override;
434 bool addGCPasses() override { return false; }
435 void addPreEmitPass() override;
436 bool addPreISel() override;
437
438 // No reg alloc
439 bool addRegAssignAndRewriteFast() override { return false; }
440
441 // No reg alloc
442 bool addRegAssignAndRewriteOptimized() override { return false; }
443};
444} // end anonymous namespace
445
452
455 return TargetTransformInfo(std::make_unique<WebAssemblyTTIImpl>(this, F));
456}
457
460 return new WebAssemblyPassConfig(*this, PM);
461}
462
463FunctionPass *WebAssemblyPassConfig::createTargetRegisterAllocator(bool) {
464 return nullptr; // No reg alloc
465}
466
467//===----------------------------------------------------------------------===//
468// The following functions are called from lib/CodeGen/Passes.cpp to modify
469// the CodeGen pass sequence.
470//===----------------------------------------------------------------------===//
471
472void WebAssemblyPassConfig::addIRPasses() {
473 // Add signatures to prototype-less function declarations
475
476 // Lower .llvm.global_dtors into .llvm.global_ctors with __cxa_atexit calls.
478
479 // Fix function bitcasts, as WebAssembly requires caller and callee signatures
480 // to match.
482
483 // Optimize "returned" function attributes.
484 if (getOptLevel() != CodeGenOptLevel::None)
486
487 // If exception handling is not enabled and setjmp/longjmp handling is
488 // enabled, we lower invokes into calls and delete unreachable landingpad
489 // blocks. Lowering invokes when there is no EH support is done in
490 // TargetPassConfig::addPassesToHandleExceptions, but that runs after these IR
491 // passes and Emscripten SjLj handling expects all invokes to be lowered
492 // before.
493 if (!WasmEnableEmEH && !WasmEnableEH) {
494 addPass(createLowerInvokePass());
495 // The lower invoke pass may create unreachable code. Remove it in order not
496 // to process dead blocks in setjmp/longjmp handling.
498 }
499
500 // Handle exceptions and setjmp/longjmp if enabled. Unlike Wasm EH preparation
501 // done in WasmEHPrepare pass, Wasm SjLj preparation shares libraries and
502 // transformation algorithms with Emscripten SjLj, so we run
503 // LowerEmscriptenEHSjLj pass also when Wasm SjLj is enabled.
504 if (WasmEnableEmEH || WasmEnableEmSjLj || WasmEnableSjLj)
506
507 // Expand indirectbr instructions to switches.
509
511}
512
513void WebAssemblyPassConfig::addISelPrepare() {
514 // We need to move reference type allocas to WASM_ADDRESS_SPACE_VAR so that
515 // loads and stores are promoted to local.gets/local.sets.
517 // Lower atomics and TLS if necessary
518 addPass(new CoalesceFeaturesAndStripAtomics(&getWebAssemblyTargetMachine()));
519
520 // This is a no-op if atomics are not used in the module
522
524}
525
526bool WebAssemblyPassConfig::addInstSelector() {
528 addPass(
529 createWebAssemblyISelDag(getWebAssemblyTargetMachine(), getOptLevel()));
530 // Run the argument-move pass immediately after the ScheduleDAG scheduler
531 // so that we can fix up the ARGUMENT instructions before anything else
532 // sees them in the wrong place.
534 // Set the p2align operands. This information is present during ISel, however
535 // it's inconvenient to collect. Collect it now, and update the immediate
536 // operands.
538
539 // Eliminate range checks and add default targets to br_table instructions.
541
542 // unreachable is terminator, non-terminator instruction after it is not
543 // allowed.
545
546 return false;
547}
548
549void WebAssemblyPassConfig::addOptimizedRegAlloc() {
550 // Currently RegisterCoalesce degrades wasm debug info quality by a
551 // significant margin. As a quick fix, disable this for -O1, which is often
552 // used for debugging large applications. Disabling this increases code size
553 // of Emscripten core benchmarks by ~5%, which is acceptable for -O1, which is
554 // usually not used for production builds.
555 // TODO Investigate why RegisterCoalesce degrades debug info quality and fix
556 // it properly
557 if (getOptLevel() == CodeGenOptLevel::Less)
558 disablePass(&RegisterCoalescerID);
560}
561
562void WebAssemblyPassConfig::addPostRegAlloc() {
563 // TODO: The following CodeGen passes don't currently support code containing
564 // virtual registers. Consider removing their restrictions and re-enabling
565 // them.
566
567 // These functions all require the NoVRegs property.
568 disablePass(&MachineLateInstrsCleanupID);
569 disablePass(&MachineCopyPropagationID);
570 disablePass(&PostRAMachineSinkingID);
571 disablePass(&PostRASchedulerID);
572 disablePass(&FuncletLayoutID);
573 disablePass(&StackMapLivenessID);
574 disablePass(&PatchableFunctionID);
575 disablePass(&ShrinkWrapID);
576 disablePass(&RemoveLoadsIntoFakeUsesID);
577
578 // This pass hurts code size for wasm because it can generate irreducible
579 // control flow.
580 disablePass(&MachineBlockPlacementID);
581
583}
584
585void WebAssemblyPassConfig::addPreEmitPass() {
587
588 // Nullify DBG_VALUE_LISTs that we cannot handle.
590
591 // Eliminate multiple-entry loops.
594
595 // Do various transformations for exception handling.
596 // Every CFG-changing optimizations should come before this.
597 if (TM->Options.ExceptionModel == ExceptionHandling::Wasm)
599
600 // Now that we have a prologue and epilogue and all frame indices are
601 // rewritten, eliminate SP and FP. This allows them to be stackified,
602 // colored, and numbered with the rest of the registers.
604
605 // Preparations and optimizations related to register stackification.
606 if (getOptLevel() != CodeGenOptLevel::None) {
607 // Depend on LiveIntervals and perform some optimizations on it.
609
610 // Prepare memory intrinsic calls for register stackifying.
612 }
613
614 // Mark registers as representing wasm's value stack. This is a key
615 // code-compression technique in WebAssembly. We run this pass (and
616 // MemIntrinsicResults above) very late, so that it sees as much code as
617 // possible, including code emitted by PEI and expanded by late tail
618 // duplication.
619 addPass(createWebAssemblyRegStackify(getOptLevel()));
620
621 if (getOptLevel() != CodeGenOptLevel::None) {
622 // Run the register coloring pass to reduce the total number of registers.
623 // This runs after stackification so that it doesn't consider registers
624 // that become stackified.
626 }
627
628 // Sort the blocks of the CFG into topological order, a prerequisite for
629 // BLOCK and LOOP markers.
630 addPass(createWebAssemblyCFGSort());
631
632 // Insert BLOCK and LOOP markers.
634
635 // Insert explicit local.get and local.set operators.
638
639 // Lower br_unless into br_if.
641
642 // Perform the very last peephole optimizations on the code.
643 if (getOptLevel() != CodeGenOptLevel::None)
644 addPass(createWebAssemblyPeephole());
645
646 // Create a mapping from LLVM CodeGen virtual registers to wasm registers.
648
649 // Fix debug_values whose defs have been stackified.
652
653 // Collect information to prepare for MC lowering / asm printing.
655}
656
657bool WebAssemblyPassConfig::addPreISel() {
660 return false;
661}
662
667
673
676 SMDiagnostic &Error, SMRange &SourceRange) const {
677 const auto &YamlMFI = static_cast<const yaml::WebAssemblyFunctionInfo &>(MFI);
678 MachineFunction &MF = PFS.MF;
679 MF.getInfo<WebAssemblyFunctionInfo>()->initializeBaseYamlFields(MF, YamlMFI);
680 return false;
681}
static Reloc::Model getEffectiveRelocModel()
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_ABI
Definition Compiler.h:213
#define LLVM_EXTERNAL_VISIBILITY
Definition Compiler.h:132
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
Machine Check Debug Module
#define T
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
const GCNTargetMachine & getTM(const GCNSubtarget *STI)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Target-Independent Code Generator Pass Configuration Options pass.
This file defines the interfaces that WebAssembly uses to lower LLVM code into a selection DAG.
This file provides WebAssembly-specific target descriptions.
This file declares WebAssembly-specific per-machine-function information.
This file registers the WebAssembly target.
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeWebAssemblyTarget()
static void basicCheckForEHAndSjLj(TargetMachine *TM)
static cl::opt< bool > WasmDisableExplicitLocals("wasm-disable-explicit-locals", cl::Hidden, cl::desc("WebAssembly: output implicit locals in" " instruction output for test purposes only."), cl::init(false))
static cl::opt< bool > WasmDisableFixIrreducibleControlFlowPass("wasm-disable-fix-irreducible-control-flow-pass", cl::Hidden, cl::desc("webassembly: disables the fix " " irreducible control flow optimization pass"), cl::init(false))
This file declares the WebAssembly-specific subclass of TargetMachine.
This file declares the WebAssembly-specific subclass of TargetLoweringObjectFile.
This file a TargetTransformInfoImplBase conforming object specific to the WebAssembly target machine.
This file contains the declaration of the WebAssembly-specific utility functions.
This file contains the entry points for global functions defined in the LLVM WebAssembly back-end.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
LLVM_ABI StringRef getValueAsString() const
Return the attribute's value as a string.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:223
CodeGenTargetMachineImpl(const Target &T, StringRef DataLayoutString, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, Reloc::Model RM, CodeModel::Model CM, CodeGenOptLevel OL)
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
Container class for subtarget features.
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
PreservedAnalyses run(Function &F, FunctionAnalysisManager &)
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
ModulePass class - This class is used to implement unstructured interprocedural optimizations and ana...
Definition Pass.h:255
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
Instances of this class encapsulate one diagnostic report, allowing printing to a raw_ostream as a ca...
Definition SourceMgr.h:297
Represents a range in source code.
Definition SMLoc.h:47
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
std::string str() const
str - Get the contents as an std::string.
Definition StringRef.h:225
Primary interface to the complete machine description for the target machine.
Triple TargetTriple
Triple string, CPU name, and target feature strings the TargetMachine instance is created with.
StringRef getTargetFeatureString() const
StringRef getTargetCPU() const
std::unique_ptr< const MCSubtargetInfo > STI
TargetOptions Options
void setTargetFeatureString(StringRef FS)
void resetTargetOptions(const Function &F) const
Reset the target options based on the function's attributes.
unsigned FunctionSections
Emit functions into separate sections.
unsigned NoTrapAfterNoreturn
Do not emit a trap instruction for 'unreachable' IR instructions behind noreturn calls,...
unsigned DataSections
Emit data into separate sections.
unsigned TrapUnreachable
Emit target-specific trap instruction for 'unreachable' IR instructions.
Target-Independent Code Generator Pass Configuration Options.
virtual void addPostRegAlloc()
This method may be implemented by targets that want to run passes after register allocation pass pipe...
virtual bool addInstSelector()
addInstSelector - This method should install an instruction selector pass, which converts from LLVM c...
virtual bool addPreISel()
Methods with trivial inline returns are convenient points in the common codegen pass pipeline where t...
virtual void addOptimizedRegAlloc()
addOptimizedRegAlloc - Add passes related to register allocation.
virtual void addPreEmitPass()
This pass may be implemented by targets that want to run passes immediately before machine code is em...
virtual void addIRPasses()
Add common target configurable passes that perform LLVM IR to IR transforms following machine indepen...
virtual void addISelPrepare()
Add common passes that perform LLVM IR to IR transforms in preparation for instruction selection.
TargetSubtargetInfo - Generic base class for all target subtargets.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
This class is derived from MachineFunctionInfo and contains private WebAssembly-specific information ...
yaml::MachineFunctionInfo * createDefaultFuncInfoYAML() const override
Allocate and return a default initialized instance of the YAML representation for the MachineFunction...
bool parseMachineFunctionInfo(const yaml::MachineFunctionInfo &, PerFunctionMIParsingState &PFS, SMDiagnostic &Error, SMRange &SourceRange) const override
Parse out the target's MachineFunctionInfo from the YAML reprsentation.
WebAssemblyTargetMachine(const Target &T, const Triple &TT, StringRef CPU, StringRef FS, const TargetOptions &Options, std::optional< Reloc::Model > RM, std::optional< CodeModel::Model > CM, CodeGenOptLevel OL, bool JIT)
Create an WebAssembly architecture model.
TargetPassConfig * createPassConfig(PassManagerBase &PM) override
Create a pass configuration object to be used by addPassToEmitX methods for generating a pipeline of ...
const WebAssemblySubtarget * getSubtargetImpl() const
MachineFunctionInfo * createMachineFunctionInfo(BumpPtrAllocator &Allocator, const Function &F, const TargetSubtargetInfo *STI) const override
Create the target's instance of MachineFunctionInfo.
TargetTransformInfo getTargetTransformInfo(const Function &F) const override
Get a TargetTransformInfo implementation for the target.
yaml::MachineFunctionInfo * convertFuncInfoToYAML(const MachineFunction &MF) const override
Allocate and initialize an instance of the YAML representation of the MachineFunctionInfo.
PassManagerBase - An abstract interface to allow code to add passes to a pass manager without having ...
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
cl::opt< bool > WasmUseLegacyEH
cl::opt< bool > WasmEnableEH
cl::opt< bool > WasmEnableSjLj
cl::opt< bool > WasmEnableEmEH
cl::opt< bool > WasmEnableEmSjLj
initializer< Ty > init(const Ty &Val)
@ WASM_FEATURE_PREFIX_USED
Definition Wasm.h:180
@ WASM_FEATURE_PREFIX_DISALLOWED
Definition Wasm.h:181
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI ModulePass * createLowerGlobalDtorsLegacyPass()
void initializeOptimizeReturnedPass(PassRegistry &)
LLVM_ABI FunctionPass * createIndirectBrExpandPass()
void initializeWebAssemblyLowerBrUnlessPass(PassRegistry &)
FunctionPass * createWebAssemblyLowerRefTypesIntPtrConv()
FunctionPass * createWebAssemblyRegNumbering()
ModulePass * createWebAssemblyAddMissingPrototypes()
LLVM_ABI char & RegisterCoalescerID
RegisterCoalescer - This pass merges live ranges to eliminate copies.
FunctionPass * createWebAssemblyLateEHPrepare()
const SubtargetFeatureKV WebAssemblyFeatureKV[WebAssembly::NumSubtargetFeatures]
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
void initializeWebAssemblyLateEHPreparePass(PassRegistry &)
@ None
No exception support.
Definition CodeGen.h:54
@ Wasm
WebAssembly Exception Handling.
Definition CodeGen.h:59
FunctionPass * createWebAssemblyFixBrTableDefaults()
void initializeWebAssemblyAddMissingPrototypesPass(PassRegistry &)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:632
LLVM_ABI char & PatchableFunctionID
This pass implements the "patchable-function" attribute.
void initializeWebAssemblyExceptionInfoPass(PassRegistry &)
LLVM_ABI char & PostRASchedulerID
PostRAScheduler - This pass performs post register allocation scheduling.
LLVM_ABI char & RemoveLoadsIntoFakeUsesID
RemoveLoadsIntoFakeUses pass.
void initializeWebAssemblyRegNumberingPass(PassRegistry &)
void initializeWebAssemblyLowerRefTypesIntPtrConvPass(PassRegistry &)
void initializeWebAssemblyDAGToDAGISelLegacyPass(PassRegistry &)
FunctionPass * createWebAssemblyRegStackify(CodeGenOptLevel OptLevel)
FunctionPass * createWebAssemblyReplacePhysRegs()
void initializeWebAssemblyRegColoringPass(PassRegistry &)
static Reloc::Model getEffectiveRelocModel(std::optional< Reloc::Model > RM)
CodeModel::Model getEffectiveCodeModel(std::optional< CodeModel::Model > CM, CodeModel::Model Default)
Helper method for getting the code model, returning Default if CM does not have a value.
FunctionPass * createWebAssemblyMemIntrinsicResults()
LLVM_ABI char & ShrinkWrapID
ShrinkWrap pass. Look for the best place to insert save and restore.
LLVM_ABI char & MachineLateInstrsCleanupID
MachineLateInstrsCleanup - This pass removes redundant identical instructions after register allocati...
FunctionPass * createWebAssemblyDebugFixup()
LLVM_ABI FunctionPass * createLowerInvokePass()
Target & getTheWebAssemblyTarget32()
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
void initializeWebAssemblyNullifyDebugValueListsPass(PassRegistry &)
LLVM_ABI char & StackMapLivenessID
StackMapLiveness - This pass analyses the register live-out set of stackmap/patchpoint intrinsics and...
LLVM_ABI void initializeLowerGlobalDtorsLegacyPassPass(PassRegistry &)
void initializeWebAssemblyFixIrreducibleControlFlowPass(PassRegistry &)
FunctionPass * createWebAssemblyISelDag(WebAssemblyTargetMachine &TM, CodeGenOptLevel OptLevel)
This pass converts a legalized DAG into a WebAssembly-specific DAG, ready for instruction scheduling.
LLVM_ABI char & FuncletLayoutID
This pass lays out funclets contiguously.
void initializeWebAssemblyRegStackifyPass(PassRegistry &)
FunctionPass * createWebAssemblyCFGStackify()
FunctionPass * createWebAssemblyOptimizeLiveIntervals()
LLVM_ABI char & PostRAMachineSinkingID
This pass perform post-ra machine sink for COPY instructions.
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
Definition Allocator.h:383
CodeGenOptLevel
Code generation optimization level.
Definition CodeGen.h:82
FunctionPass * createWebAssemblyOptimizeReturned()
FunctionPass * createWebAssemblyRefTypeMem2Local()
FunctionPass * createWebAssemblyCleanCodeAfterTrap()
void initializeWebAssemblyOptimizeLiveIntervalsPass(PassRegistry &)
FunctionPass * createWebAssemblySetP2AlignOperands()
ModulePass * createWebAssemblyLowerEmscriptenEHSjLj()
void initializeWebAssemblyLowerEmscriptenEHSjLjPass(PassRegistry &)
FunctionPass * createWebAssemblyArgumentMove()
FunctionPass * createWebAssemblyExplicitLocals()
Target & getTheWebAssemblyTarget64()
void initializeWebAssemblyMemIntrinsicResultsPass(PassRegistry &)
void initializeWebAssemblyMCLowerPrePassPass(PassRegistry &)
void initializeWebAssemblyExplicitLocalsPass(PassRegistry &)
FunctionPass * createWebAssemblyFixIrreducibleControlFlow()
ModulePass * createWebAssemblyFixFunctionBitcasts()
FunctionPass * createWebAssemblyLowerBrUnless()
void initializeFixFunctionBitcastsPass(PassRegistry &)
FunctionPass * createWebAssemblyRegColoring()
void initializeWebAssemblyPeepholePass(PassRegistry &)
ModulePass * createWebAssemblyMCLowerPrePass()
void initializeWebAssemblyRefTypeMem2LocalPass(PassRegistry &)
LLVM_ABI char & MachineBlockPlacementID
MachineBlockPlacement - This pass places basic blocks based on branch probabilities.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI FunctionPass * createAtomicExpandLegacyPass()
AtomicExpandPass - At IR level this pass replace atomic instructions with __atomic_* library calls,...
FunctionPass * createWebAssemblyCFGSort()
void initializeWebAssemblyCFGSortPass(PassRegistry &)
void initializeWebAssemblyFixBrTableDefaultsPass(PassRegistry &)
FunctionPass * createWebAssemblyNullifyDebugValueLists()
void initializeWebAssemblyAsmPrinterPass(PassRegistry &)
void initializeWebAssemblyCFGStackifyPass(PassRegistry &)
void initializeWebAssemblySetP2AlignOperandsPass(PassRegistry &)
void initializeWebAssemblyDebugFixupPass(PassRegistry &)
LLVM_ABI char & MachineCopyPropagationID
MachineCopyPropagation - This pass performs copy propagation on machine instructions.
void initializeWebAssemblyArgumentMovePass(PassRegistry &)
LLVM_ABI FunctionPass * createUnreachableBlockEliminationPass()
createUnreachableBlockEliminationPass - The LLVM code generator does not work well with unreachable b...
FunctionPass * createWebAssemblyPeephole()
void initializeWebAssemblyReplacePhysRegsPass(PassRegistry &)
MachineFunctionInfo - This class can be derived from and used by targets to hold private target-speci...
static FuncInfoTy * create(BumpPtrAllocator &Allocator, const Function &F, const SubtargetTy *STI)
Factory function: default behavior is to call new using the supplied allocator.
RegisterTargetMachine - Helper template for registering a target machine implementation,...
Targets should override this in a way that mirrors the implementation of llvm::MachineFunctionInfo.