Opaque Pointer Types: GEP API migrations to specify the gep type explicitly
[oota-llvm.git] / lib / CodeGen / SjLjEHPrepare.cpp
1 //===- SjLjEHPrepare.cpp - Eliminate Invoke & Unwind instructions ---------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This transformation is designed for use by code generators which use SjLj
11 // based exception handling.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/CodeGen/Passes.h"
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/SetVector.h"
18 #include "llvm/ADT/SmallPtrSet.h"
19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/ADT/Statistic.h"
21 #include "llvm/IR/Constants.h"
22 #include "llvm/IR/DataLayout.h"
23 #include "llvm/IR/DerivedTypes.h"
24 #include "llvm/IR/IRBuilder.h"
25 #include "llvm/IR/Instructions.h"
26 #include "llvm/IR/Intrinsics.h"
27 #include "llvm/IR/LLVMContext.h"
28 #include "llvm/IR/Module.h"
29 #include "llvm/Pass.h"
30 #include "llvm/Support/CommandLine.h"
31 #include "llvm/Support/Debug.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include "llvm/Target/TargetLowering.h"
34 #include "llvm/Target/TargetSubtargetInfo.h"
35 #include "llvm/Transforms/Scalar.h"
36 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
37 #include "llvm/Transforms/Utils/Local.h"
38 #include <set>
39 using namespace llvm;
40
41 #define DEBUG_TYPE "sjljehprepare"
42
43 STATISTIC(NumInvokes, "Number of invokes replaced");
44 STATISTIC(NumSpilled, "Number of registers live across unwind edges");
45
46 namespace {
47 class SjLjEHPrepare : public FunctionPass {
48   const TargetMachine *TM;
49   Type *FunctionContextTy;
50   Constant *RegisterFn;
51   Constant *UnregisterFn;
52   Constant *BuiltinSetjmpFn;
53   Constant *FrameAddrFn;
54   Constant *StackAddrFn;
55   Constant *StackRestoreFn;
56   Constant *LSDAAddrFn;
57   Value *PersonalityFn;
58   Constant *CallSiteFn;
59   Constant *FuncCtxFn;
60   AllocaInst *FuncCtx;
61
62 public:
63   static char ID; // Pass identification, replacement for typeid
64   explicit SjLjEHPrepare(const TargetMachine *TM) : FunctionPass(ID), TM(TM) {}
65   bool doInitialization(Module &M) override;
66   bool runOnFunction(Function &F) override;
67
68   void getAnalysisUsage(AnalysisUsage &AU) const override {}
69   const char *getPassName() const override {
70     return "SJLJ Exception Handling preparation";
71   }
72
73 private:
74   bool setupEntryBlockAndCallSites(Function &F);
75   void substituteLPadValues(LandingPadInst *LPI, Value *ExnVal, Value *SelVal);
76   Value *setupFunctionContext(Function &F, ArrayRef<LandingPadInst *> LPads);
77   void lowerIncomingArguments(Function &F);
78   void lowerAcrossUnwindEdges(Function &F, ArrayRef<InvokeInst *> Invokes);
79   void insertCallSiteStore(Instruction *I, int Number);
80 };
81 } // end anonymous namespace
82
83 char SjLjEHPrepare::ID = 0;
84
85 // Public Interface To the SjLjEHPrepare pass.
86 FunctionPass *llvm::createSjLjEHPreparePass(const TargetMachine *TM) {
87   return new SjLjEHPrepare(TM);
88 }
89 // doInitialization - Set up decalarations and types needed to process
90 // exceptions.
91 bool SjLjEHPrepare::doInitialization(Module &M) {
92   // Build the function context structure.
93   // builtin_setjmp uses a five word jbuf
94   Type *VoidPtrTy = Type::getInt8PtrTy(M.getContext());
95   Type *Int32Ty = Type::getInt32Ty(M.getContext());
96   FunctionContextTy = StructType::get(VoidPtrTy,                  // __prev
97                                       Int32Ty,                    // call_site
98                                       ArrayType::get(Int32Ty, 4), // __data
99                                       VoidPtrTy, // __personality
100                                       VoidPtrTy, // __lsda
101                                       ArrayType::get(VoidPtrTy, 5), // __jbuf
102                                       nullptr);
103   RegisterFn = M.getOrInsertFunction(
104       "_Unwind_SjLj_Register", Type::getVoidTy(M.getContext()),
105       PointerType::getUnqual(FunctionContextTy), (Type *)nullptr);
106   UnregisterFn = M.getOrInsertFunction(
107       "_Unwind_SjLj_Unregister", Type::getVoidTy(M.getContext()),
108       PointerType::getUnqual(FunctionContextTy), (Type *)nullptr);
109   FrameAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::frameaddress);
110   StackAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::stacksave);
111   StackRestoreFn = Intrinsic::getDeclaration(&M, Intrinsic::stackrestore);
112   BuiltinSetjmpFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_setjmp);
113   LSDAAddrFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_lsda);
114   CallSiteFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_callsite);
115   FuncCtxFn = Intrinsic::getDeclaration(&M, Intrinsic::eh_sjlj_functioncontext);
116   PersonalityFn = nullptr;
117
118   return true;
119 }
120
121 /// insertCallSiteStore - Insert a store of the call-site value to the
122 /// function context
123 void SjLjEHPrepare::insertCallSiteStore(Instruction *I, int Number) {
124   IRBuilder<> Builder(I);
125
126   // Get a reference to the call_site field.
127   Type *Int32Ty = Type::getInt32Ty(I->getContext());
128   Value *Zero = ConstantInt::get(Int32Ty, 0);
129   Value *One = ConstantInt::get(Int32Ty, 1);
130   Value *Idxs[2] = { Zero, One };
131   Value *CallSite =
132       Builder.CreateGEP(FunctionContextTy, FuncCtx, Idxs, "call_site");
133
134   // Insert a store of the call-site number
135   ConstantInt *CallSiteNoC =
136       ConstantInt::get(Type::getInt32Ty(I->getContext()), Number);
137   Builder.CreateStore(CallSiteNoC, CallSite, true /*volatile*/);
138 }
139
140 /// MarkBlocksLiveIn - Insert BB and all of its predescessors into LiveBBs until
141 /// we reach blocks we've already seen.
142 static void MarkBlocksLiveIn(BasicBlock *BB,
143                              SmallPtrSetImpl<BasicBlock *> &LiveBBs) {
144   if (!LiveBBs.insert(BB).second)
145     return; // already been here.
146
147   for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
148     MarkBlocksLiveIn(*PI, LiveBBs);
149 }
150
151 /// substituteLPadValues - Substitute the values returned by the landingpad
152 /// instruction with those returned by the personality function.
153 void SjLjEHPrepare::substituteLPadValues(LandingPadInst *LPI, Value *ExnVal,
154                                          Value *SelVal) {
155   SmallVector<Value *, 8> UseWorkList(LPI->user_begin(), LPI->user_end());
156   while (!UseWorkList.empty()) {
157     Value *Val = UseWorkList.pop_back_val();
158     ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(Val);
159     if (!EVI)
160       continue;
161     if (EVI->getNumIndices() != 1)
162       continue;
163     if (*EVI->idx_begin() == 0)
164       EVI->replaceAllUsesWith(ExnVal);
165     else if (*EVI->idx_begin() == 1)
166       EVI->replaceAllUsesWith(SelVal);
167     if (EVI->getNumUses() == 0)
168       EVI->eraseFromParent();
169   }
170
171   if (LPI->getNumUses() == 0)
172     return;
173
174   // There are still some uses of LPI. Construct an aggregate with the exception
175   // values and replace the LPI with that aggregate.
176   Type *LPadType = LPI->getType();
177   Value *LPadVal = UndefValue::get(LPadType);
178   IRBuilder<> Builder(
179       std::next(BasicBlock::iterator(cast<Instruction>(SelVal))));
180   LPadVal = Builder.CreateInsertValue(LPadVal, ExnVal, 0, "lpad.val");
181   LPadVal = Builder.CreateInsertValue(LPadVal, SelVal, 1, "lpad.val");
182
183   LPI->replaceAllUsesWith(LPadVal);
184 }
185
186 /// setupFunctionContext - Allocate the function context on the stack and fill
187 /// it with all of the data that we know at this point.
188 Value *SjLjEHPrepare::setupFunctionContext(Function &F,
189                                            ArrayRef<LandingPadInst *> LPads) {
190   BasicBlock *EntryBB = F.begin();
191
192   // Create an alloca for the incoming jump buffer ptr and the new jump buffer
193   // that needs to be restored on all exits from the function. This is an alloca
194   // because the value needs to be added to the global context list.
195   const TargetLowering *TLI = TM->getSubtargetImpl(F)->getTargetLowering();
196   unsigned Align =
197       TLI->getDataLayout()->getPrefTypeAlignment(FunctionContextTy);
198   FuncCtx = new AllocaInst(FunctionContextTy, nullptr, Align, "fn_context",
199                            EntryBB->begin());
200
201   // Fill in the function context structure.
202   for (unsigned I = 0, E = LPads.size(); I != E; ++I) {
203     LandingPadInst *LPI = LPads[I];
204     IRBuilder<> Builder(LPI->getParent()->getFirstInsertionPt());
205
206     // Reference the __data field.
207     Value *FCData = Builder.CreateConstGEP2_32(FuncCtx, 0, 2, "__data");
208
209     // The exception values come back in context->__data[0].
210     Value *ExceptionAddr =
211         Builder.CreateConstGEP2_32(FCData, 0, 0, "exception_gep");
212     Value *ExnVal = Builder.CreateLoad(ExceptionAddr, true, "exn_val");
213     ExnVal = Builder.CreateIntToPtr(ExnVal, Builder.getInt8PtrTy());
214
215     Value *SelectorAddr =
216         Builder.CreateConstGEP2_32(FCData, 0, 1, "exn_selector_gep");
217     Value *SelVal = Builder.CreateLoad(SelectorAddr, true, "exn_selector_val");
218
219     substituteLPadValues(LPI, ExnVal, SelVal);
220   }
221
222   // Personality function
223   IRBuilder<> Builder(EntryBB->getTerminator());
224   if (!PersonalityFn)
225     PersonalityFn = LPads[0]->getPersonalityFn();
226   Value *PersonalityFieldPtr =
227       Builder.CreateConstGEP2_32(FuncCtx, 0, 3, "pers_fn_gep");
228   Builder.CreateStore(
229       Builder.CreateBitCast(PersonalityFn, Builder.getInt8PtrTy()),
230       PersonalityFieldPtr, /*isVolatile=*/true);
231
232   // LSDA address
233   Value *LSDA = Builder.CreateCall(LSDAAddrFn, "lsda_addr");
234   Value *LSDAFieldPtr = Builder.CreateConstGEP2_32(FuncCtx, 0, 4, "lsda_gep");
235   Builder.CreateStore(LSDA, LSDAFieldPtr, /*isVolatile=*/true);
236
237   return FuncCtx;
238 }
239
240 /// lowerIncomingArguments - To avoid having to handle incoming arguments
241 /// specially, we lower each arg to a copy instruction in the entry block. This
242 /// ensures that the argument value itself cannot be live out of the entry
243 /// block.
244 void SjLjEHPrepare::lowerIncomingArguments(Function &F) {
245   BasicBlock::iterator AfterAllocaInsPt = F.begin()->begin();
246   while (isa<AllocaInst>(AfterAllocaInsPt) &&
247          isa<ConstantInt>(cast<AllocaInst>(AfterAllocaInsPt)->getArraySize()))
248     ++AfterAllocaInsPt;
249
250   for (Function::arg_iterator AI = F.arg_begin(), AE = F.arg_end(); AI != AE;
251        ++AI) {
252     Type *Ty = AI->getType();
253
254     // Use 'select i8 true, %arg, undef' to simulate a 'no-op' instruction.
255     Value *TrueValue = ConstantInt::getTrue(F.getContext());
256     Value *UndefValue = UndefValue::get(Ty);
257     Instruction *SI = SelectInst::Create(TrueValue, AI, UndefValue,
258                                          AI->getName() + ".tmp",
259                                          AfterAllocaInsPt);
260     AI->replaceAllUsesWith(SI);
261
262     // Reset the operand, because it  was clobbered by the RAUW above.
263     SI->setOperand(1, AI);
264   }
265 }
266
267 /// lowerAcrossUnwindEdges - Find all variables which are alive across an unwind
268 /// edge and spill them.
269 void SjLjEHPrepare::lowerAcrossUnwindEdges(Function &F,
270                                            ArrayRef<InvokeInst *> Invokes) {
271   // Finally, scan the code looking for instructions with bad live ranges.
272   for (Function::iterator BB = F.begin(), BBE = F.end(); BB != BBE; ++BB) {
273     for (BasicBlock::iterator II = BB->begin(), IIE = BB->end(); II != IIE;
274          ++II) {
275       // Ignore obvious cases we don't have to handle. In particular, most
276       // instructions either have no uses or only have a single use inside the
277       // current block. Ignore them quickly.
278       Instruction *Inst = II;
279       if (Inst->use_empty())
280         continue;
281       if (Inst->hasOneUse() &&
282           cast<Instruction>(Inst->user_back())->getParent() == BB &&
283           !isa<PHINode>(Inst->user_back()))
284         continue;
285
286       // If this is an alloca in the entry block, it's not a real register
287       // value.
288       if (AllocaInst *AI = dyn_cast<AllocaInst>(Inst))
289         if (isa<ConstantInt>(AI->getArraySize()) && BB == F.begin())
290           continue;
291
292       // Avoid iterator invalidation by copying users to a temporary vector.
293       SmallVector<Instruction *, 16> Users;
294       for (User *U : Inst->users()) {
295         Instruction *UI = cast<Instruction>(U);
296         if (UI->getParent() != BB || isa<PHINode>(UI))
297           Users.push_back(UI);
298       }
299
300       // Find all of the blocks that this value is live in.
301       SmallPtrSet<BasicBlock *, 64> LiveBBs;
302       LiveBBs.insert(Inst->getParent());
303       while (!Users.empty()) {
304         Instruction *U = Users.back();
305         Users.pop_back();
306
307         if (!isa<PHINode>(U)) {
308           MarkBlocksLiveIn(U->getParent(), LiveBBs);
309         } else {
310           // Uses for a PHI node occur in their predecessor block.
311           PHINode *PN = cast<PHINode>(U);
312           for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
313             if (PN->getIncomingValue(i) == Inst)
314               MarkBlocksLiveIn(PN->getIncomingBlock(i), LiveBBs);
315         }
316       }
317
318       // Now that we know all of the blocks that this thing is live in, see if
319       // it includes any of the unwind locations.
320       bool NeedsSpill = false;
321       for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
322         BasicBlock *UnwindBlock = Invokes[i]->getUnwindDest();
323         if (UnwindBlock != BB && LiveBBs.count(UnwindBlock)) {
324           DEBUG(dbgs() << "SJLJ Spill: " << *Inst << " around "
325                        << UnwindBlock->getName() << "\n");
326           NeedsSpill = true;
327           break;
328         }
329       }
330
331       // If we decided we need a spill, do it.
332       // FIXME: Spilling this way is overkill, as it forces all uses of
333       // the value to be reloaded from the stack slot, even those that aren't
334       // in the unwind blocks. We should be more selective.
335       if (NeedsSpill) {
336         DemoteRegToStack(*Inst, true);
337         ++NumSpilled;
338       }
339     }
340   }
341
342   // Go through the landing pads and remove any PHIs there.
343   for (unsigned i = 0, e = Invokes.size(); i != e; ++i) {
344     BasicBlock *UnwindBlock = Invokes[i]->getUnwindDest();
345     LandingPadInst *LPI = UnwindBlock->getLandingPadInst();
346
347     // Place PHIs into a set to avoid invalidating the iterator.
348     SmallPtrSet<PHINode *, 8> PHIsToDemote;
349     for (BasicBlock::iterator PN = UnwindBlock->begin(); isa<PHINode>(PN); ++PN)
350       PHIsToDemote.insert(cast<PHINode>(PN));
351     if (PHIsToDemote.empty())
352       continue;
353
354     // Demote the PHIs to the stack.
355     for (PHINode *PN : PHIsToDemote)
356       DemotePHIToStack(PN);
357
358     // Move the landingpad instruction back to the top of the landing pad block.
359     LPI->moveBefore(UnwindBlock->begin());
360   }
361 }
362
363 /// setupEntryBlockAndCallSites - Setup the entry block by creating and filling
364 /// the function context and marking the call sites with the appropriate
365 /// values. These values are used by the DWARF EH emitter.
366 bool SjLjEHPrepare::setupEntryBlockAndCallSites(Function &F) {
367   SmallVector<ReturnInst *, 16> Returns;
368   SmallVector<InvokeInst *, 16> Invokes;
369   SmallSetVector<LandingPadInst *, 16> LPads;
370
371   // Look through the terminators of the basic blocks to find invokes.
372   for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB)
373     if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
374       if (Function *Callee = II->getCalledFunction())
375         if (Callee->isIntrinsic() &&
376             Callee->getIntrinsicID() == Intrinsic::donothing) {
377           // Remove the NOP invoke.
378           BranchInst::Create(II->getNormalDest(), II);
379           II->eraseFromParent();
380           continue;
381         }
382
383       Invokes.push_back(II);
384       LPads.insert(II->getUnwindDest()->getLandingPadInst());
385     } else if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) {
386       Returns.push_back(RI);
387     }
388
389   if (Invokes.empty())
390     return false;
391
392   NumInvokes += Invokes.size();
393
394   lowerIncomingArguments(F);
395   lowerAcrossUnwindEdges(F, Invokes);
396
397   Value *FuncCtx =
398       setupFunctionContext(F, makeArrayRef(LPads.begin(), LPads.end()));
399   BasicBlock *EntryBB = F.begin();
400   IRBuilder<> Builder(EntryBB->getTerminator());
401
402   // Get a reference to the jump buffer.
403   Value *JBufPtr = Builder.CreateConstGEP2_32(FuncCtx, 0, 5, "jbuf_gep");
404
405   // Save the frame pointer.
406   Value *FramePtr = Builder.CreateConstGEP2_32(JBufPtr, 0, 0, "jbuf_fp_gep");
407
408   Value *Val = Builder.CreateCall(FrameAddrFn, Builder.getInt32(0), "fp");
409   Builder.CreateStore(Val, FramePtr, /*isVolatile=*/true);
410
411   // Save the stack pointer.
412   Value *StackPtr = Builder.CreateConstGEP2_32(JBufPtr, 0, 2, "jbuf_sp_gep");
413
414   Val = Builder.CreateCall(StackAddrFn, "sp");
415   Builder.CreateStore(Val, StackPtr, /*isVolatile=*/true);
416
417   // Call the setjmp instrinsic. It fills in the rest of the jmpbuf.
418   Value *SetjmpArg = Builder.CreateBitCast(JBufPtr, Builder.getInt8PtrTy());
419   Builder.CreateCall(BuiltinSetjmpFn, SetjmpArg);
420
421   // Store a pointer to the function context so that the back-end will know
422   // where to look for it.
423   Value *FuncCtxArg = Builder.CreateBitCast(FuncCtx, Builder.getInt8PtrTy());
424   Builder.CreateCall(FuncCtxFn, FuncCtxArg);
425
426   // At this point, we are all set up, update the invoke instructions to mark
427   // their call_site values.
428   for (unsigned I = 0, E = Invokes.size(); I != E; ++I) {
429     insertCallSiteStore(Invokes[I], I + 1);
430
431     ConstantInt *CallSiteNum =
432         ConstantInt::get(Type::getInt32Ty(F.getContext()), I + 1);
433
434     // Record the call site value for the back end so it stays associated with
435     // the invoke.
436     CallInst::Create(CallSiteFn, CallSiteNum, "", Invokes[I]);
437   }
438
439   // Mark call instructions that aren't nounwind as no-action (call_site ==
440   // -1). Skip the entry block, as prior to then, no function context has been
441   // created for this function and any unexpected exceptions thrown will go
442   // directly to the caller's context, which is what we want anyway, so no need
443   // to do anything here.
444   for (Function::iterator BB = F.begin(), E = F.end(); ++BB != E;)
445     for (BasicBlock::iterator I = BB->begin(), end = BB->end(); I != end; ++I)
446       if (CallInst *CI = dyn_cast<CallInst>(I)) {
447         if (!CI->doesNotThrow())
448           insertCallSiteStore(CI, -1);
449       } else if (ResumeInst *RI = dyn_cast<ResumeInst>(I)) {
450         insertCallSiteStore(RI, -1);
451       }
452
453   // Register the function context and make sure it's known to not throw
454   CallInst *Register =
455       CallInst::Create(RegisterFn, FuncCtx, "", EntryBB->getTerminator());
456   Register->setDoesNotThrow();
457
458   // Following any allocas not in the entry block, update the saved SP in the
459   // jmpbuf to the new value.
460   for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) {
461     if (BB == F.begin())
462       continue;
463     for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) {
464       if (CallInst *CI = dyn_cast<CallInst>(I)) {
465         if (CI->getCalledFunction() != StackRestoreFn)
466           continue;
467       } else if (!isa<AllocaInst>(I)) {
468         continue;
469       }
470       Instruction *StackAddr = CallInst::Create(StackAddrFn, "sp");
471       StackAddr->insertAfter(I);
472       Instruction *StoreStackAddr = new StoreInst(StackAddr, StackPtr, true);
473       StoreStackAddr->insertAfter(StackAddr);
474     }
475   }
476
477   // Finally, for any returns from this function, if this function contains an
478   // invoke, add a call to unregister the function context.
479   for (unsigned I = 0, E = Returns.size(); I != E; ++I)
480     CallInst::Create(UnregisterFn, FuncCtx, "", Returns[I]);
481
482   return true;
483 }
484
485 bool SjLjEHPrepare::runOnFunction(Function &F) {
486   bool Res = setupEntryBlockAndCallSites(F);
487   return Res;
488 }