LLVM 22.0.0git
SjLjEHPrepare.cpp
Go to the documentation of this file.
1//===- SjLjEHPrepare.cpp - Eliminate Invoke & Unwind instructions ---------===//
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// This transformation is designed for use by code generators which use SjLj
10// based exception handling.
11//
12//===----------------------------------------------------------------------===//
13
15#include "llvm/ADT/SetVector.h"
18#include "llvm/ADT/Statistic.h"
19#include "llvm/CodeGen/Passes.h"
20#include "llvm/IR/Constants.h"
21#include "llvm/IR/DataLayout.h"
23#include "llvm/IR/IRBuilder.h"
25#include "llvm/IR/Intrinsics.h"
26#include "llvm/IR/Module.h"
28#include "llvm/Pass.h"
29#include "llvm/Support/Debug.h"
33using namespace llvm;
34
35#define DEBUG_TYPE "sjlj-eh-prepare"
36
37STATISTIC(NumInvokes, "Number of invokes replaced");
38STATISTIC(NumSpilled, "Number of registers live across unwind edges");
39
40namespace {
41class SjLjEHPrepareImpl {
42 IntegerType *DataTy = nullptr;
43 Type *doubleUnderDataTy = nullptr;
44 Type *doubleUnderJBufTy = nullptr;
45 Type *FunctionContextTy = nullptr;
46 FunctionCallee RegisterFn;
47 FunctionCallee UnregisterFn;
48 Function *BuiltinSetupDispatchFn = nullptr;
49 Function *FrameAddrFn = nullptr;
50 Function *StackAddrFn = nullptr;
51 Function *StackRestoreFn = nullptr;
52 Function *LSDAAddrFn = nullptr;
53 Function *CallSiteFn = nullptr;
54 Function *FuncCtxFn = nullptr;
55 AllocaInst *FuncCtx = nullptr;
56 const TargetMachine *TM = nullptr;
57
58public:
59 explicit SjLjEHPrepareImpl(const TargetMachine *TM = nullptr) : TM(TM) {}
60 bool doInitialization(Module &M);
61 bool runOnFunction(Function &F);
62
63private:
64 bool setupEntryBlockAndCallSites(Function &F);
65 void substituteLPadValues(LandingPadInst *LPI, Value *ExnVal, Value *SelVal);
66 Value *setupFunctionContext(Function &F, ArrayRef<LandingPadInst *> LPads);
67 void lowerIncomingArguments(Function &F);
68 void lowerAcrossUnwindEdges(Function &F, ArrayRef<InvokeInst *> Invokes);
69 void insertCallSiteStore(Instruction *I, int Number);
70};
71
72class SjLjEHPrepare : public FunctionPass {
73 SjLjEHPrepareImpl Impl;
74
75public:
76 static char ID; // Pass identification, replacement for typeid
77 explicit SjLjEHPrepare(const TargetMachine *TM = nullptr)
78 : FunctionPass(ID), Impl(TM) {}
79 bool doInitialization(Module &M) override { return Impl.doInitialization(M); }
80 bool runOnFunction(Function &F) override { return Impl.runOnFunction(F); };
81
82 StringRef getPassName() const override {
83 return "SJLJ Exception Handling preparation";
84 }
85};
86
87} // end anonymous namespace
88
91 SjLjEHPrepareImpl Impl(TM);
92 Impl.doInitialization(*F.getParent());
93 bool Changed = Impl.runOnFunction(F);
95}
96
97char SjLjEHPrepare::ID = 0;
98INITIALIZE_PASS(SjLjEHPrepare, DEBUG_TYPE, "Prepare SjLj exceptions",
99 false, false)
100
101// Public Interface To the SjLjEHPrepare pass.
103 return new SjLjEHPrepare(TM);
104}
105
106// doInitialization - Set up decalarations and types needed to process
107// exceptions.
108bool SjLjEHPrepareImpl::doInitialization(Module &M) {
109 // Build the function context structure.
110 // builtin_setjmp uses a five word jbuf
111 Type *VoidPtrTy = PointerType::getUnqual(M.getContext());
112 unsigned DataBits =
113 TM ? TM->getSjLjDataSize() : TargetMachine::DefaultSjLjDataSize;
114 DataTy = Type::getIntNTy(M.getContext(), DataBits);
115 doubleUnderDataTy = ArrayType::get(DataTy, 4);
116 doubleUnderJBufTy = ArrayType::get(VoidPtrTy, 5);
117 FunctionContextTy = StructType::get(VoidPtrTy, // __prev
118 DataTy, // call_site
119 doubleUnderDataTy, // __data
120 VoidPtrTy, // __personality
121 VoidPtrTy, // __lsda
122 doubleUnderJBufTy // __jbuf
123 );
124
125 return false;
126}
127
128/// insertCallSiteStore - Insert a store of the call-site value to the
129/// function context
130void SjLjEHPrepareImpl::insertCallSiteStore(Instruction *I, int Number) {
131 IRBuilder<> Builder(I);
132
133 // Get a reference to the call_site field.
134 Type *Int32Ty = Type::getInt32Ty(I->getContext());
135 Value *Zero = ConstantInt::get(Int32Ty, 0);
136 Value *One = ConstantInt::get(Int32Ty, 1);
137 Value *Idxs[2] = { Zero, One };
138 Value *CallSite =
139 Builder.CreateGEP(FunctionContextTy, FuncCtx, Idxs, "call_site");
140
141 // Insert a store of the call-site number
142 ConstantInt *CallSiteNoC = ConstantInt::get(DataTy, Number);
143 Builder.CreateStore(CallSiteNoC, CallSite, true /*volatile*/);
144}
145
146/// MarkBlocksLiveIn - Insert BB and all of its predecessors into LiveBBs until
147/// we reach blocks we've already seen.
150 if (!LiveBBs.insert(BB).second)
151 return; // already been here.
152
154}
155
156/// substituteLPadValues - Substitute the values returned by the landingpad
157/// instruction with those returned by the personality function.
158void SjLjEHPrepareImpl::substituteLPadValues(LandingPadInst *LPI, Value *ExnVal,
159 Value *SelVal) {
160 SmallVector<Value *, 8> UseWorkList(LPI->users());
161 while (!UseWorkList.empty()) {
162 Value *Val = UseWorkList.pop_back_val();
163 auto *EVI = dyn_cast<ExtractValueInst>(Val);
164 if (!EVI)
165 continue;
166 if (EVI->getNumIndices() != 1)
167 continue;
168 if (*EVI->idx_begin() == 0)
169 EVI->replaceAllUsesWith(ExnVal);
170 else if (*EVI->idx_begin() == 1)
171 EVI->replaceAllUsesWith(SelVal);
172 if (EVI->use_empty())
173 EVI->eraseFromParent();
174 }
175
176 if (LPI->use_empty())
177 return;
178
179 // There are still some uses of LPI. Construct an aggregate with the exception
180 // values and replace the LPI with that aggregate.
181 Type *LPadType = LPI->getType();
182 Value *LPadVal = PoisonValue::get(LPadType);
183 auto *SelI = cast<Instruction>(SelVal);
184 IRBuilder<> Builder(SelI->getParent(), std::next(SelI->getIterator()));
185 LPadVal = Builder.CreateInsertValue(LPadVal, ExnVal, 0, "lpad.val");
186 LPadVal = Builder.CreateInsertValue(LPadVal, SelVal, 1, "lpad.val");
187
188 LPI->replaceAllUsesWith(LPadVal);
189}
190
191/// setupFunctionContext - Allocate the function context on the stack and fill
192/// it with all of the data that we know at this point.
193Value *
194SjLjEHPrepareImpl::setupFunctionContext(Function &F,
196 BasicBlock *EntryBB = &F.front();
197
198 // Create an alloca for the incoming jump buffer ptr and the new jump buffer
199 // that needs to be restored on all exits from the function. This is an alloca
200 // because the value needs to be added to the global context list.
201 auto &DL = F.getDataLayout();
202 const Align Alignment = DL.getPrefTypeAlign(FunctionContextTy);
203 FuncCtx = new AllocaInst(FunctionContextTy, DL.getAllocaAddrSpace(), nullptr,
204 Alignment, "fn_context", EntryBB->begin());
205
206 // Fill in the function context structure.
207 for (LandingPadInst *LPI : LPads) {
208 IRBuilder<> Builder(LPI->getParent(),
209 LPI->getParent()->getFirstInsertionPt());
210
211 // Reference the __data field.
212 Value *FCData =
213 Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 2, "__data");
214
215 // The exception values come back in context->__data[0].
216 Value *ExceptionAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
217 0, 0, "exception_gep");
218 Value *ExnVal = Builder.CreateLoad(DataTy, ExceptionAddr, true, "exn_val");
219 ExnVal = Builder.CreateIntToPtr(ExnVal, Builder.getPtrTy());
220
221 Value *SelectorAddr = Builder.CreateConstGEP2_32(doubleUnderDataTy, FCData,
222 0, 1, "exn_selector_gep");
223 Value *SelVal =
224 Builder.CreateLoad(DataTy, SelectorAddr, true, "exn_selector_val");
225
226 // SelVal must be Int32Ty, so trunc it
227 SelVal = Builder.CreateTrunc(SelVal, Type::getInt32Ty(F.getContext()));
228
229 substituteLPadValues(LPI, ExnVal, SelVal);
230 }
231
232 // Personality function
233 IRBuilder<> Builder(EntryBB->getTerminator());
234 Value *PersonalityFn = F.getPersonalityFn();
235 Value *PersonalityFieldPtr = Builder.CreateConstGEP2_32(
236 FunctionContextTy, FuncCtx, 0, 3, "pers_fn_gep");
237 Builder.CreateStore(PersonalityFn, PersonalityFieldPtr, /*isVolatile=*/true);
238
239 // LSDA address
240 Value *LSDA = Builder.CreateCall(LSDAAddrFn, {}, "lsda_addr");
241 Value *LSDAFieldPtr =
242 Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 4, "lsda_gep");
243 Builder.CreateStore(LSDA, LSDAFieldPtr, /*isVolatile=*/true);
244
245 return FuncCtx;
246}
247
248/// lowerIncomingArguments - To avoid having to handle incoming arguments
249/// specially, we lower each arg to a copy instruction in the entry block. This
250/// ensures that the argument value itself cannot be live out of the entry
251/// block.
252void SjLjEHPrepareImpl::lowerIncomingArguments(Function &F) {
253 BasicBlock::iterator AfterAllocaInsPt = F.begin()->begin();
254 while (isa<AllocaInst>(AfterAllocaInsPt) &&
255 cast<AllocaInst>(AfterAllocaInsPt)->isStaticAlloca())
256 ++AfterAllocaInsPt;
257 assert(AfterAllocaInsPt != F.front().end());
258
259 for (auto &AI : F.args()) {
260 // Swift error really is a register that we model as memory -- instruction
261 // selection will perform mem-to-reg for us and spill/reload appropriately
262 // around calls that clobber it. There is no need to spill this
263 // value to the stack and doing so would not be allowed.
264 if (AI.isSwiftError())
265 continue;
266
267 Type *Ty = AI.getType();
268
269 // Use 'select i8 true, %arg, poison' to simulate a 'no-op' instruction.
270 Value *TrueValue = ConstantInt::getTrue(F.getContext());
273 TrueValue, &AI, PoisonValue, AI.getName() + ".tmp", AfterAllocaInsPt);
274 AI.replaceAllUsesWith(SI);
275
276 // Reset the operand, because it was clobbered by the RAUW above.
277 SI->setOperand(1, &AI);
278 }
279}
280
281/// lowerAcrossUnwindEdges - Find all variables which are alive across an unwind
282/// edge and spill them.
283void SjLjEHPrepareImpl::lowerAcrossUnwindEdges(Function &F,
284 ArrayRef<InvokeInst *> Invokes) {
285 // Finally, scan the code looking for instructions with bad live ranges.
286 for (BasicBlock &BB : F) {
287 for (Instruction &Inst : BB) {
288 // Ignore obvious cases we don't have to handle. In particular, most
289 // instructions either have no uses or only have a single use inside the
290 // current block. Ignore them quickly.
291 if (Inst.use_empty())
292 continue;
293 if (Inst.hasOneUse() &&
294 cast<Instruction>(Inst.user_back())->getParent() == &BB &&
295 !isa<PHINode>(Inst.user_back()))
296 continue;
297
298 // If this is an alloca in the entry block, it's not a real register
299 // value.
300 if (auto *AI = dyn_cast<AllocaInst>(&Inst))
301 if (AI->isStaticAlloca())
302 continue;
303
304 // Avoid iterator invalidation by copying users to a temporary vector.
306 for (User *U : Inst.users()) {
308 if (UI->getParent() != &BB || isa<PHINode>(UI))
309 Users.push_back(UI);
310 }
311
312 // Find all of the blocks that this value is live in.
314 LiveBBs.insert(&BB);
315 while (!Users.empty()) {
316 Instruction *U = Users.pop_back_val();
317
318 if (!isa<PHINode>(U)) {
319 MarkBlocksLiveIn(U->getParent(), LiveBBs);
320 } else {
321 // Uses for a PHI node occur in their predecessor block.
322 PHINode *PN = cast<PHINode>(U);
323 for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
324 if (PN->getIncomingValue(i) == &Inst)
325 MarkBlocksLiveIn(PN->getIncomingBlock(i), LiveBBs);
326 }
327 }
328
329 // Now that we know all of the blocks that this thing is live in, see if
330 // it includes any of the unwind locations.
331 bool NeedsSpill = false;
332 for (InvokeInst *Invoke : Invokes) {
333 BasicBlock *UnwindBlock = Invoke->getUnwindDest();
334 if (UnwindBlock != &BB && LiveBBs.count(UnwindBlock)) {
335 LLVM_DEBUG(dbgs() << "SJLJ Spill: " << Inst << " around "
336 << UnwindBlock->getName() << "\n");
337 NeedsSpill = true;
338 break;
339 }
340 }
341
342 // If we decided we need a spill, do it.
343 // FIXME: Spilling this way is overkill, as it forces all uses of
344 // the value to be reloaded from the stack slot, even those that aren't
345 // in the unwind blocks. We should be more selective.
346 if (NeedsSpill) {
347 DemoteRegToStack(Inst, true);
348 ++NumSpilled;
349 }
350 }
351 }
352
353 // Go through the landing pads and remove any PHIs there.
354 for (InvokeInst *Invoke : Invokes) {
355 BasicBlock *UnwindBlock = Invoke->getUnwindDest();
356 LandingPadInst *LPI = UnwindBlock->getLandingPadInst();
357
358 // Place PHIs into a set to avoid invalidating the iterator.
359 SmallPtrSet<PHINode *, 8> PHIsToDemote;
360 for (BasicBlock::iterator PN = UnwindBlock->begin(); isa<PHINode>(PN); ++PN)
361 PHIsToDemote.insert(cast<PHINode>(PN));
362 if (PHIsToDemote.empty())
363 continue;
364
365 // Demote the PHIs to the stack.
366 for (PHINode *PN : PHIsToDemote)
368
369 // Move the landingpad instruction back to the top of the landing pad block.
370 LPI->moveBefore(UnwindBlock->begin());
371 }
372}
373
374/// setupEntryBlockAndCallSites - Setup the entry block by creating and filling
375/// the function context and marking the call sites with the appropriate
376/// values. These values are used by the DWARF EH emitter.
377bool SjLjEHPrepareImpl::setupEntryBlockAndCallSites(Function &F) {
381
382 // Look through the terminators of the basic blocks to find invokes.
383 for (BasicBlock &BB : F)
384 if (auto *II = dyn_cast<InvokeInst>(BB.getTerminator())) {
385 if (Function *Callee = II->getCalledFunction())
386 if (Callee->getIntrinsicID() == Intrinsic::donothing) {
387 // Remove the NOP invoke.
388 BranchInst::Create(II->getNormalDest(), II->getIterator());
389 II->eraseFromParent();
390 continue;
391 }
392
393 Invokes.push_back(II);
394 LPads.insert(II->getUnwindDest()->getLandingPadInst());
395 } else if (auto *RI = dyn_cast<ReturnInst>(BB.getTerminator())) {
396 Returns.push_back(RI);
397 }
398
399 if (Invokes.empty())
400 return false;
401
402 NumInvokes += Invokes.size();
403
404 lowerIncomingArguments(F);
405 lowerAcrossUnwindEdges(F, Invokes);
406
407 Value *FuncCtx =
408 setupFunctionContext(F, ArrayRef(LPads.begin(), LPads.end()));
409 BasicBlock *EntryBB = &F.front();
410 IRBuilder<> Builder(EntryBB->getTerminator());
411
412 // Get a reference to the jump buffer.
413 Value *JBufPtr =
414 Builder.CreateConstGEP2_32(FunctionContextTy, FuncCtx, 0, 5, "jbuf_gep");
415
416 // Save the frame pointer.
417 Value *FramePtr = Builder.CreateConstGEP2_32(doubleUnderJBufTy, JBufPtr, 0, 0,
418 "jbuf_fp_gep");
419
420 Value *Val = Builder.CreateCall(FrameAddrFn, Builder.getInt32(0), "fp");
421 Builder.CreateStore(Val, FramePtr, /*isVolatile=*/true);
422
423 // Save the stack pointer.
424 Value *StackPtr = Builder.CreateConstGEP2_32(doubleUnderJBufTy, JBufPtr, 0, 2,
425 "jbuf_sp_gep");
426
427 Val = Builder.CreateCall(StackAddrFn, {}, "sp");
428 Builder.CreateStore(Val, StackPtr, /*isVolatile=*/true);
429
430 // Call the setup_dispatch intrinsic. It fills in the rest of the jmpbuf.
431 Builder.CreateCall(BuiltinSetupDispatchFn, {});
432
433 // Store a pointer to the function context so that the back-end will know
434 // where to look for it.
435 Builder.CreateCall(FuncCtxFn, FuncCtx);
436
437 // Register the function context and make sure it's known to not throw.
438 CallInst *Register = Builder.CreateCall(RegisterFn, FuncCtx, "");
439 Register->setDoesNotThrow();
440
441 // At this point, we are all set up, update the invoke instructions to mark
442 // their call_site values.
443 for (unsigned I = 0, E = Invokes.size(); I != E; ++I) {
444 insertCallSiteStore(Invokes[I], I + 1);
445
446 ConstantInt *CallSiteNum =
447 ConstantInt::get(Type::getInt32Ty(F.getContext()), I + 1);
448
449 // Record the call site value for the back end so it stays associated with
450 // the invoke.
451 CallInst::Create(CallSiteFn, CallSiteNum, "", Invokes[I]->getIterator());
452 }
453
454 // Mark call instructions that aren't nounwind as no-action (call_site ==
455 // -1). Skip the entry block, as prior to then, no function context has been
456 // created for this function and any unexpected exceptions thrown will go
457 // directly to the caller's context, which is what we want anyway, so no need
458 // to do anything here.
459 for (BasicBlock &BB : F) {
460 if (&BB == &F.front())
461 continue;
462 for (Instruction &I : BB)
463 if (!isa<InvokeInst>(I) && I.mayThrow())
464 insertCallSiteStore(&I, -1);
465 }
466
467 // Following any allocas not in the entry block, update the saved SP in the
468 // jmpbuf to the new value.
469 for (BasicBlock &BB : F) {
470 if (&BB == &F.front())
471 continue;
472 for (Instruction &I : BB) {
473 if (auto *CI = dyn_cast<CallInst>(&I)) {
474 if (CI->getCalledFunction() != StackRestoreFn)
475 continue;
476 } else if (!isa<AllocaInst>(&I)) {
477 continue;
478 }
479 Instruction *StackAddr = CallInst::Create(StackAddrFn, "sp");
480 StackAddr->insertAfter(I.getIterator());
481 new StoreInst(StackAddr, StackPtr, true,
482 std::next(StackAddr->getIterator()));
483 }
484 }
485
486 // Finally, for any returns from this function, if this function contains an
487 // invoke, add a call to unregister the function context.
488 for (ReturnInst *Return : Returns) {
489 Instruction *InsertPoint = Return;
490 if (CallInst *CI = Return->getParent()->getTerminatingMustTailCall())
491 InsertPoint = CI;
492 CallInst::Create(UnregisterFn, FuncCtx, "", InsertPoint->getIterator());
493 }
494
495 return true;
496}
497
498bool SjLjEHPrepareImpl::runOnFunction(Function &F) {
499 Module &M = *F.getParent();
500 RegisterFn = M.getOrInsertFunction(
501 "_Unwind_SjLj_Register", Type::getVoidTy(M.getContext()),
502 PointerType::getUnqual(FunctionContextTy->getContext()));
503 UnregisterFn = M.getOrInsertFunction(
504 "_Unwind_SjLj_Unregister", Type::getVoidTy(M.getContext()),
505 PointerType::getUnqual(FunctionContextTy->getContext()));
506
507 PointerType *AllocaPtrTy = M.getDataLayout().getAllocaPtrType(M.getContext());
508
509 FrameAddrFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::frameaddress,
510 {AllocaPtrTy});
511 StackAddrFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::stacksave,
512 {AllocaPtrTy});
513 StackRestoreFn = Intrinsic::getOrInsertDeclaration(
514 &M, Intrinsic::stackrestore, {AllocaPtrTy});
515 BuiltinSetupDispatchFn =
516 Intrinsic::getOrInsertDeclaration(&M, Intrinsic::eh_sjlj_setup_dispatch);
517 LSDAAddrFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::eh_sjlj_lsda);
518 CallSiteFn =
519 Intrinsic::getOrInsertDeclaration(&M, Intrinsic::eh_sjlj_callsite);
520 FuncCtxFn =
521 Intrinsic::getOrInsertDeclaration(&M, Intrinsic::eh_sjlj_functioncontext);
522
523 bool Res = setupEntryBlockAndCallSites(F);
524 return Res;
525}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool runOnFunction(Function &F, bool PostInlining)
#define DEBUG_TYPE
Module.h This file contains the declarations for the Module class.
iv Induction Variable Users
Definition IVUsers.cpp:48
#define F(x, y, z)
Definition MD5.cpp:55
#define I(x, y, z)
Definition MD5.cpp:58
Machine Check Debug Module
uint64_t IntrinsicInst * II
FunctionAnalysisManager FAM
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition PassSupport.h:56
This file implements a set that has insertion order iteration characteristics.
static void MarkBlocksLiveIn(BasicBlock *BB, SmallPtrSetImpl< BasicBlock * > &LiveBBs)
MarkBlocksLiveIn - Insert BB and all of its predecessors into LiveBBs until we reach blocks we've alr...
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:114
static const unsigned FramePtr
an instruction to allocate memory on the stack
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition BasicBlock.h:459
LLVM_ABI const LandingPadInst * getLandingPadInst() const
Return the landingpad instruction associated with the landing pad.
const Instruction & front() const
Definition BasicBlock.h:482
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
Definition BasicBlock.h:233
static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
A handy container for a FunctionType+Callee-pointer pair, which can be passed around as a single enti...
FunctionPass class - This class is used to implement most global optimizations.
Definition Pass.h:314
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2780
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
Class to represent integer types.
Invoke instruction.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
Class to represent pointers.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
In order to facilitate speculative execution, many instructions do not invoke immediate undefined beh...
Definition Constants.h:1468
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:19
Return a value (possibly void), from a function.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, Instruction *MDFrom=nullptr)
iterator end()
Get an iterator to the end of the SetVector.
Definition SetVector.h:119
iterator begin()
Get an iterator to the beginning of the SetVector.
Definition SetVector.h:109
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:168
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM)
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
void insert_range(Range &&R)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:356
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
static LLVM_ABI StructType * get(LLVMContext &Context, ArrayRef< Type * > Elements, bool isPacked=false)
This static method is the primary way to create a literal StructType.
Definition Type.cpp:414
Primary interface to the complete machine description for the target machine.
static constexpr unsigned DefaultSjLjDataSize
The integer bit size to use for SjLj based exception handling.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:297
static LLVM_ABI Type * getVoidTy(LLVMContext &C)
Definition Type.cpp:281
static LLVM_ABI IntegerType * getIntNTy(LLVMContext &C, unsigned N)
Definition Type.cpp:301
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
iterator_range< user_iterator > users()
Definition Value.h:426
bool use_empty() const
Definition Value.h:346
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:130
Changed
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
This is an optimization pass for GlobalISel generic memory operations.
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
FunctionAddr VTableAddr uintptr_t uintptr_t Int32Ty
Definition InstrProf.h:296
LLVM_ABI AllocaInst * DemoteRegToStack(Instruction &X, bool VolatileLoads=false, std::optional< BasicBlock::iterator > AllocaPoint=std::nullopt)
This function takes a virtual register computed by an Instruction and replaces it with a slot in the ...
LLVM_ABI AllocaInst * DemotePHIToStack(PHINode *P, std::optional< BasicBlock::iterator > AllocaPoint=std::nullopt)
This function takes a virtual register computed by a phi node and replaces it with a slot in the stac...
iterator_range< idf_iterator< T > > inverse_depth_first(const T &G)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:207
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:548
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI FunctionPass * createSjLjEHPreparePass(const TargetMachine *TM)
createSjLjEHPreparePass - This pass adapts exception handling code to use the GCC-style builtin setjm...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39