| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 1 | //===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 2 | // | 
 | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 4ee451d | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 7 | // | 
 | 8 | //===----------------------------------------------------------------------===// | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 9 |  | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 10 | #include "llvm/CodeGen/MachineModuleInfo.h" | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 11 |  | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 12 | #include "llvm/Constants.h" | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 13 | #include "llvm/DerivedTypes.h" | 
 | 14 | #include "llvm/GlobalVariable.h" | 
 | 15 | #include "llvm/Intrinsics.h" | 
 | 16 | #include "llvm/Instructions.h" | 
 | 17 | #include "llvm/Module.h" | 
| Evan Cheng | 0ff39b3 | 2008-06-30 07:31:25 +0000 | [diff] [blame] | 18 | #include "llvm/Analysis/ValueTracking.h" | 
| Jim Laskey | 9d4209f | 2006-11-07 19:33:46 +0000 | [diff] [blame] | 19 | #include "llvm/CodeGen/MachineFunctionPass.h" | 
 | 20 | #include "llvm/CodeGen/MachineFunction.h" | 
| Evan Cheng | 8b56a90 | 2008-09-22 22:21:38 +0000 | [diff] [blame] | 21 | #include "llvm/CodeGen/Passes.h" | 
| Jim Laskey | 9d4209f | 2006-11-07 19:33:46 +0000 | [diff] [blame] | 22 | #include "llvm/Target/TargetInstrInfo.h" | 
 | 23 | #include "llvm/Target/TargetMachine.h" | 
| Jim Laskey | c1c47c3 | 2007-01-29 23:40:33 +0000 | [diff] [blame] | 24 | #include "llvm/Target/TargetOptions.h" | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 25 | #include "llvm/MC/MCAsmInfo.h" | 
 | 26 | #include "llvm/MC/MCSymbol.h" | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 27 | #include "llvm/Support/Dwarf.h" | 
| Torok Edwin | c25e758 | 2009-07-11 20:10:48 +0000 | [diff] [blame] | 28 | #include "llvm/Support/ErrorHandling.h" | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 29 | using namespace llvm; | 
| Jim Laskey | 9c4447a | 2006-03-01 20:39:36 +0000 | [diff] [blame] | 30 | using namespace llvm::dwarf; | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 31 |  | 
 | 32 | // Handle the Pass registration stuff necessary to use TargetData's. | 
| Dan Gohman | 844731a | 2008-05-13 00:00:25 +0000 | [diff] [blame] | 33 | static RegisterPass<MachineModuleInfo> | 
| Chris Lattner | 11d53c1 | 2010-03-13 20:55:24 +0000 | [diff] [blame] | 34 | X("machinemoduleinfo", "Machine Module Information"); | 
| Devang Patel | 1997473 | 2007-05-03 01:11:54 +0000 | [diff] [blame] | 35 | char MachineModuleInfo::ID = 0; | 
| Jim Laskey | 063e765 | 2006-01-17 17:31:53 +0000 | [diff] [blame] | 36 |  | 
| Chris Lattner | a70e2e3 | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 37 | // Out of line virtual method. | 
 | 38 | MachineModuleInfoImpl::~MachineModuleInfoImpl() {} | 
 | 39 |  | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 40 | //===----------------------------------------------------------------------===// | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 41 |  | 
| Chris Lattner | 11d53c1 | 2010-03-13 20:55:24 +0000 | [diff] [blame] | 42 | MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI) | 
 | 43 | : ImmutablePass(&ID), Context(MAI), | 
 | 44 |   ObjFileMMI(0), CurCallSite(0), CallsEHReturn(0), CallsUnwindInit(0), | 
 | 45 |   DbgInfoAvailable(false) { | 
| Eric Christopher | d44fff7 | 2009-08-26 21:30:49 +0000 | [diff] [blame] | 46 |   // Always emit some info, by default "no personality" info. | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 47 |   Personalities.push_back(NULL); | 
 | 48 | } | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 49 |  | 
| Chris Lattner | 11d53c1 | 2010-03-13 20:55:24 +0000 | [diff] [blame] | 50 | MachineModuleInfo::MachineModuleInfo() | 
 | 51 | : ImmutablePass(&ID), Context(*(MCAsmInfo*)0) { | 
 | 52 |   assert(0 && "This MachineModuleInfo constructor should never be called, MMI " | 
 | 53 |          "should always be explicitly constructed by LLVMTargetMachine"); | 
 | 54 |   abort(); | 
 | 55 | } | 
 | 56 |  | 
| Chris Lattner | a70e2e3 | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 57 | MachineModuleInfo::~MachineModuleInfo() { | 
| Chris Lattner | f185455 | 2009-09-16 05:26:00 +0000 | [diff] [blame] | 58 |   delete ObjFileMMI; | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 59 | } | 
 | 60 |  | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 61 | /// doInitialization - Initialize the state for a new module. | 
| Jim Laskey | b2efb85 | 2006-01-04 22:28:25 +0000 | [diff] [blame] | 62 | /// | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 63 | bool MachineModuleInfo::doInitialization() { | 
| Jim Laskey | b2efb85 | 2006-01-04 22:28:25 +0000 | [diff] [blame] | 64 |   return false; | 
| Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 65 | } | 
 | 66 |  | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 67 | /// doFinalization - Tear down the state after completion of a module. | 
| Jim Laskey | b2efb85 | 2006-01-04 22:28:25 +0000 | [diff] [blame] | 68 | /// | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 69 | bool MachineModuleInfo::doFinalization() { | 
| Jim Laskey | b2efb85 | 2006-01-04 22:28:25 +0000 | [diff] [blame] | 70 |   return false; | 
 | 71 | } | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 72 |  | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 73 | /// getLabelSym - Turn a label ID into a symbol. | 
 | 74 | MCSymbol *MachineModuleInfo::getLabelSym(unsigned ID) { | 
 | 75 |   return Context.GetOrCreateTemporarySymbol | 
 | 76 |     (Twine(Context.getAsmInfo().getPrivateGlobalPrefix()) + "Label" +Twine(ID)); | 
 | 77 | } | 
 | 78 |  | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 79 | /// EndFunction - Discard function meta information. | 
| Jim Laskey | 4188699 | 2006-04-07 16:34:46 +0000 | [diff] [blame] | 80 | /// | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 81 | void MachineModuleInfo::EndFunction() { | 
| Jim Laskey | 4188699 | 2006-04-07 16:34:46 +0000 | [diff] [blame] | 82 |   // Clean up frame info. | 
| Jim Laskey | 4188699 | 2006-04-07 16:34:46 +0000 | [diff] [blame] | 83 |   FrameMoves.clear(); | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 84 |  | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 85 |   // Clean up exception info. | 
 | 86 |   LandingPads.clear(); | 
| Jim Grosbach | ca752c9 | 2010-01-28 01:45:32 +0000 | [diff] [blame] | 87 |   CallSiteMap.clear(); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 88 |   TypeInfos.clear(); | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 89 |   FilterIds.clear(); | 
| Duncan Sands | 14da32a | 2007-07-05 15:15:01 +0000 | [diff] [blame] | 90 |   FilterEnds.clear(); | 
| Anton Korobeynikov | 2365f51 | 2007-07-14 14:06:15 +0000 | [diff] [blame] | 91 |   CallsEHReturn = 0; | 
 | 92 |   CallsUnwindInit = 0; | 
| Devang Patel | 85d29e2 | 2009-10-08 20:41:17 +0000 | [diff] [blame] | 93 |   VariableDbgInfo.clear(); | 
| Jim Laskey | 4188699 | 2006-04-07 16:34:46 +0000 | [diff] [blame] | 94 | } | 
 | 95 |  | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 96 | /// AnalyzeModule - Scan the module for global debug information. | 
 | 97 | /// | 
| Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 98 | void MachineModuleInfo::AnalyzeModule(Module &M) { | 
| Chris Lattner | 401e10c | 2009-07-20 06:14:25 +0000 | [diff] [blame] | 99 |   // Insert functions in the llvm.used array (but not llvm.compiler.used) into | 
 | 100 |   // UsedFunctions. | 
| Dale Johannesen | 48ae02f | 2008-01-16 19:59:28 +0000 | [diff] [blame] | 101 |   GlobalVariable *GV = M.getGlobalVariable("llvm.used"); | 
 | 102 |   if (!GV || !GV->hasInitializer()) return; | 
 | 103 |  | 
 | 104 |   // Should be an array of 'i8*'. | 
 | 105 |   ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); | 
 | 106 |   if (InitList == 0) return; | 
 | 107 |  | 
| Chris Lattner | 1d5c493 | 2009-07-20 06:05:50 +0000 | [diff] [blame] | 108 |   for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) | 
 | 109 |     if (Function *F = | 
 | 110 |           dyn_cast<Function>(InitList->getOperand(i)->stripPointerCasts())) | 
 | 111 |       UsedFunctions.insert(F); | 
| Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 112 | } | 
 | 113 |  | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 114 | //===-EH-------------------------------------------------------------------===// | 
 | 115 |  | 
 | 116 | /// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the | 
 | 117 | /// specified MachineBasicBlock. | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 118 | LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo | 
 | 119 |     (MachineBasicBlock *LandingPad) { | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 120 |   unsigned N = LandingPads.size(); | 
 | 121 |   for (unsigned i = 0; i < N; ++i) { | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 122 |     LandingPadInfo &LP = LandingPads[i]; | 
 | 123 |     if (LP.LandingPadBlock == LandingPad) | 
 | 124 |       return LP; | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 125 |   } | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 126 |  | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 127 |   LandingPads.push_back(LandingPadInfo(LandingPad)); | 
 | 128 |   return LandingPads[N]; | 
 | 129 | } | 
 | 130 |  | 
 | 131 | /// addInvoke - Provide the begin and end labels of an invoke style call and | 
 | 132 | /// associate it with a try landing pad block. | 
 | 133 | void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 134 |                                   MCSymbol *BeginLabel, MCSymbol *EndLabel) { | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 135 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
| Anton Korobeynikov | eeb37e0 | 2007-05-10 22:34:59 +0000 | [diff] [blame] | 136 |   LP.BeginLabels.push_back(BeginLabel); | 
 | 137 |   LP.EndLabels.push_back(EndLabel); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 138 | } | 
 | 139 |  | 
 | 140 | /// addLandingPad - Provide the label of a try LandingPad block. | 
 | 141 | /// | 
 | 142 | unsigned MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 143 |   unsigned LandingPadID = NextLabelID(); | 
 | 144 |   MCSymbol *LandingPadLabel = getLabelSym(LandingPadID); | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 145 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 146 |   LP.LandingPadLabel = LandingPadLabel; | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 147 |   return LandingPadID; | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 148 | } | 
 | 149 |  | 
 | 150 | /// addPersonality - Provide the personality function for the exception | 
 | 151 | /// information. | 
 | 152 | void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 153 |                                        Function *Personality) { | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 154 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 155 |   LP.Personality = Personality; | 
| Anton Korobeynikov | 0ff3ca4 | 2007-05-12 22:36:25 +0000 | [diff] [blame] | 156 |  | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 157 |   for (unsigned i = 0; i < Personalities.size(); ++i) | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 158 |     if (Personalities[i] == Personality) | 
 | 159 |       return; | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 160 |  | 
| Eric Christopher | d44fff7 | 2009-08-26 21:30:49 +0000 | [diff] [blame] | 161 |   // If this is the first personality we're adding go | 
 | 162 |   // ahead and add it at the beginning. | 
 | 163 |   if (Personalities[0] == NULL) | 
 | 164 |     Personalities[0] = Personality; | 
 | 165 |   else | 
 | 166 |     Personalities.push_back(Personality); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 167 | } | 
 | 168 |  | 
 | 169 | /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. | 
 | 170 | /// | 
 | 171 | void MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, | 
 | 172 |                                         std::vector<GlobalVariable *> &TyInfo) { | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 173 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 174 |   for (unsigned N = TyInfo.size(); N; --N) | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 175 |     LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 176 | } | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 177 |  | 
 | 178 | /// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 179 | /// | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 180 | void MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, | 
 | 181 |                                         std::vector<GlobalVariable *> &TyInfo) { | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 182 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
| Bill Wendling | 4925567 | 2008-07-07 21:41:57 +0000 | [diff] [blame] | 183 |   std::vector<unsigned> IdsInFilter(TyInfo.size()); | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 184 |   for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 185 |     IdsInFilter[I] = getTypeIDFor(TyInfo[I]); | 
 | 186 |   LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); | 
| Jim Laskey | 59e8434 | 2007-03-01 20:25:32 +0000 | [diff] [blame] | 187 | } | 
 | 188 |  | 
| Duncan Sands | 6590b04 | 2007-08-27 15:47:50 +0000 | [diff] [blame] | 189 | /// addCleanup - Add a cleanup action for a landing pad. | 
 | 190 | /// | 
 | 191 | void MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { | 
 | 192 |   LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); | 
 | 193 |   LP.TypeIds.push_back(0); | 
 | 194 | } | 
 | 195 |  | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 196 | /// TidyLandingPads - Remap landing pad labels and remove any deleted landing | 
 | 197 | /// pads. | 
 | 198 | void MachineModuleInfo::TidyLandingPads() { | 
 | 199 |   for (unsigned i = 0; i != LandingPads.size(); ) { | 
 | 200 |     LandingPadInfo &LandingPad = LandingPads[i]; | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 201 |     if (LandingPad.LandingPadLabel && !LandingPad.LandingPadLabel->isDefined()) | 
| Chris Lattner | a34ec229 | 2010-03-09 01:51:43 +0000 | [diff] [blame] | 202 |       LandingPad.LandingPadLabel = 0; | 
| Anton Korobeynikov | eeb37e0 | 2007-05-10 22:34:59 +0000 | [diff] [blame] | 203 |  | 
| Anton Korobeynikov | 070280e | 2007-05-23 11:08:31 +0000 | [diff] [blame] | 204 |     // Special case: we *should* emit LPs with null LP MBB. This indicates | 
| Duncan Sands | 481dc72 | 2007-12-19 07:36:31 +0000 | [diff] [blame] | 205 |     // "nounwind" case. | 
| Anton Korobeynikov | 070280e | 2007-05-23 11:08:31 +0000 | [diff] [blame] | 206 |     if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 207 |       LandingPads.erase(LandingPads.begin() + i); | 
 | 208 |       continue; | 
 | 209 |     } | 
| Duncan Sands | 57810cd | 2007-09-05 11:27:52 +0000 | [diff] [blame] | 210 |  | 
| Chris Lattner | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame^] | 211 |     for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) { | 
 | 212 |       MCSymbol *BeginLabel = LandingPad.BeginLabels[j]; | 
 | 213 |       MCSymbol *EndLabel = LandingPad.EndLabels[j]; | 
 | 214 |       if (BeginLabel->isDefined() && EndLabel->isDefined()) continue; | 
 | 215 |        | 
 | 216 |       LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); | 
 | 217 |       LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); | 
 | 218 |       --j, --e; | 
| Anton Korobeynikov | eeb37e0 | 2007-05-10 22:34:59 +0000 | [diff] [blame] | 219 |     } | 
| Duncan Sands | 57810cd | 2007-09-05 11:27:52 +0000 | [diff] [blame] | 220 |  | 
 | 221 |     // Remove landing pads with no try-ranges. | 
| Dan Gohman | 3035959 | 2008-01-29 13:02:09 +0000 | [diff] [blame] | 222 |     if (LandingPads[i].BeginLabels.empty()) { | 
| Duncan Sands | 57810cd | 2007-09-05 11:27:52 +0000 | [diff] [blame] | 223 |       LandingPads.erase(LandingPads.begin() + i); | 
 | 224 |       continue; | 
 | 225 |     } | 
 | 226 |  | 
 | 227 |     // If there is no landing pad, ensure that the list of typeids is empty. | 
 | 228 |     // If the only typeid is a cleanup, this is the same as having no typeids. | 
 | 229 |     if (!LandingPad.LandingPadBlock || | 
 | 230 |         (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) | 
 | 231 |       LandingPad.TypeIds.clear(); | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 232 |     ++i; | 
 | 233 |   } | 
 | 234 | } | 
 | 235 |  | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 236 | /// getTypeIDFor - Return the type id for the specified typeinfo.  This is | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 237 | /// function wide. | 
 | 238 | unsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 239 |   for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) | 
 | 240 |     if (TypeInfos[i] == TI) return i + 1; | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 241 |  | 
 | 242 |   TypeInfos.push_back(TI); | 
 | 243 |   return TypeInfos.size(); | 
 | 244 | } | 
 | 245 |  | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 246 | /// getFilterIDFor - Return the filter id for the specified typeinfos.  This is | 
 | 247 | /// function wide. | 
| Bill Wendling | 914c970 | 2008-06-27 01:27:56 +0000 | [diff] [blame] | 248 | int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { | 
| Duncan Sands | 14da32a | 2007-07-05 15:15:01 +0000 | [diff] [blame] | 249 |   // If the new filter coincides with the tail of an existing filter, then | 
 | 250 |   // re-use the existing filter.  Folding filters more than this requires | 
 | 251 |   // re-ordering filters and/or their elements - probably not worth it. | 
 | 252 |   for (std::vector<unsigned>::iterator I = FilterEnds.begin(), | 
 | 253 |        E = FilterEnds.end(); I != E; ++I) { | 
| Bill Wendling | 914c970 | 2008-06-27 01:27:56 +0000 | [diff] [blame] | 254 |     unsigned i = *I, j = TyIds.size(); | 
| Duncan Sands | 14da32a | 2007-07-05 15:15:01 +0000 | [diff] [blame] | 255 |  | 
 | 256 |     while (i && j) | 
 | 257 |       if (FilterIds[--i] != TyIds[--j]) | 
 | 258 |         goto try_next; | 
 | 259 |  | 
 | 260 |     if (!j) | 
 | 261 |       // The new filter coincides with range [i, end) of the existing filter. | 
 | 262 |       return -(1 + i); | 
| Bill Wendling | 914c970 | 2008-06-27 01:27:56 +0000 | [diff] [blame] | 263 |  | 
| Duncan Sands | 14da32a | 2007-07-05 15:15:01 +0000 | [diff] [blame] | 264 | try_next:; | 
 | 265 |   } | 
 | 266 |  | 
 | 267 |   // Add the new filter. | 
| Bill Wendling | 914c970 | 2008-06-27 01:27:56 +0000 | [diff] [blame] | 268 |   int FilterID = -(1 + FilterIds.size()); | 
 | 269 |   FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); | 
 | 270 |   for (unsigned I = 0, N = TyIds.size(); I != N; ++I) | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 271 |     FilterIds.push_back(TyIds[I]); | 
| Bill Wendling | 914c970 | 2008-06-27 01:27:56 +0000 | [diff] [blame] | 272 |   FilterEnds.push_back(FilterIds.size()); | 
| Duncan Sands | 73ef58a | 2007-06-02 16:53:42 +0000 | [diff] [blame] | 273 |   FilterIds.push_back(0); // terminator | 
 | 274 |   return FilterID; | 
 | 275 | } | 
 | 276 |  | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 277 | /// getPersonality - Return the personality function for the current function. | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 278 | Function *MachineModuleInfo::getPersonality() const { | 
| Anton Korobeynikov | 0ff3ca4 | 2007-05-12 22:36:25 +0000 | [diff] [blame] | 279 |   // FIXME: Until PR1414 will be fixed, we're using 1 personality function per | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 280 |   // function | 
 | 281 |   return !LandingPads.empty() ? LandingPads[0].Personality : NULL; | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 282 | } | 
 | 283 |  | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 284 | /// getPersonalityIndex - Return unique index for current personality | 
| Eric Christopher | 5e365e2 | 2009-08-26 21:44:57 +0000 | [diff] [blame] | 285 | /// function. NULL/first personality function should always get zero index. | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 286 | unsigned MachineModuleInfo::getPersonalityIndex() const { | 
| Anton Korobeynikov | 070280e | 2007-05-23 11:08:31 +0000 | [diff] [blame] | 287 |   const Function* Personality = NULL; | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 288 |  | 
| Anton Korobeynikov | 070280e | 2007-05-23 11:08:31 +0000 | [diff] [blame] | 289 |   // Scan landing pads. If there is at least one non-NULL personality - use it. | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 290 |   for (unsigned i = 0; i != LandingPads.size(); ++i) | 
| Anton Korobeynikov | 070280e | 2007-05-23 11:08:31 +0000 | [diff] [blame] | 291 |     if (LandingPads[i].Personality) { | 
 | 292 |       Personality = LandingPads[i].Personality; | 
 | 293 |       break; | 
 | 294 |     } | 
| Eric Christopher | cf29697 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 295 |  | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 296 |   for (unsigned i = 0; i < Personalities.size(); ++i) { | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 297 |     if (Personalities[i] == Personality) | 
 | 298 |       return i; | 
| Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 299 |   } | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 300 |  | 
| Eric Christopher | 5e365e2 | 2009-08-26 21:44:57 +0000 | [diff] [blame] | 301 |   // This will happen if the current personality function is | 
 | 302 |   // in the zero index. | 
| Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 303 |   return 0; | 
 | 304 | } | 
| Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 305 |  |