MachineModuleInfo.cpp revision 3b9d6216a41cfd43759e787db26d797e1f0ba0a8
16da186480b55c10b96a255ce0a4ab731155da907Jim Laskey//===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// 26af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 36af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// The LLVM Compiler Infrastructure 46af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 76af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// 86af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey//===----------------------------------------------------------------------===// 96af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 106da186480b55c10b96a255ce0a4ab731155da907Jim Laskey#include "llvm/CodeGen/MachineModuleInfo.h" 116af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 12b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Constants.h" 131611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/DerivedTypes.h" 141611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/GlobalVariable.h" 151611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/Intrinsics.h" 161611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/Instructions.h" 171611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/Module.h" 180ff39b3feb10477c224138156941234f5fa46f58Evan Cheng#include "llvm/Analysis/ValueTracking.h" 199d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunctionPass.h" 209d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunction.h" 218b56a90bec639665fc024896d2fc2bdd095c76a3Evan Cheng#include "llvm/CodeGen/Passes.h" 229d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetInstrInfo.h" 239d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetMachine.h" 24c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey#include "llvm/Target/TargetOptions.h" 251611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/MC/MCSymbol.h" 26b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Support/Dwarf.h" 27c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 286af5681824713544a7a8c6e115649b29d59b3d13Jim Laskeyusing namespace llvm; 299c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeyusing namespace llvm::dwarf; 306af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 316af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// Handle the Pass registration stuff necessary to use TargetData's. 32844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanstatic RegisterPass<MachineModuleInfo> 3311d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerX("machinemoduleinfo", "Machine Module Information"); 341997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar MachineModuleInfo::ID = 0; 35063e765345fd49df0f53b807e57ada7c2ded7e16Jim Laskey 36a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner// Out of line virtual method. 37a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfoImpl::~MachineModuleInfoImpl() {} 38a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner 39b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 40cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 4111d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerMachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI) 4211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner: ImmutablePass(&ID), Context(MAI), 4363d7836267298f5b6cde43f0a89acbabfc109f48Chris Lattner ObjFileMMI(0), 4418589de9b1b8c157dea602653042e486128dd9e4Chris Lattner CurCallSite(0), CallsEHReturn(0), CallsUnwindInit(0), DbgInfoAvailable(false){ 45d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // Always emit some info, by default "no personality" info. 468c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Personalities.push_back(NULL); 478c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 48b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 4911d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerMachineModuleInfo::MachineModuleInfo() 5011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner: ImmutablePass(&ID), Context(*(MCAsmInfo*)0) { 5111d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner assert(0 && "This MachineModuleInfo constructor should never be called, MMI " 5211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner "should always be explicitly constructed by LLVMTargetMachine"); 5311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner abort(); 5411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner} 5511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner 56a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfo::~MachineModuleInfo() { 57f18545550e1cfbe3f47afb6a9a58405416258e3bChris Lattner delete ObjFileMMI; 58b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 59b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 606da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doInitialization - Initialize the state for a new module. 61b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 626da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doInitialization() { 63b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 64b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 656af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 666da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doFinalization - Tear down the state after completion of a module. 67b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 686da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doFinalization() { 69b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 70b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 71b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 726da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// EndFunction - Discard function meta information. 734188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey/// 746da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::EndFunction() { 754188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Clean up frame info. 764188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey FrameMoves.clear(); 77cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 7859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey // Clean up exception info. 7959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.clear(); 80ca752c9020a1b1cf151142bd9e0cbca9af12d807Jim Grosbach CallSiteMap.clear(); 8159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.clear(); 8273ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.clear(); 8314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands FilterEnds.clear(); 842365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsEHReturn = 0; 852365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsUnwindInit = 0; 8685d29e2de30cf49956558e45246b998f6d9ed985Devang Patel VariableDbgInfo.clear(); 874188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey} 884188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 89b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// AnalyzeModule - Scan the module for global debug information. 90b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 916da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::AnalyzeModule(Module &M) { 92401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // Insert functions in the llvm.used array (but not llvm.compiler.used) into 93401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // UsedFunctions. 9448ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen GlobalVariable *GV = M.getGlobalVariable("llvm.used"); 9548ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (!GV || !GV->hasInitializer()) return; 9648ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 9748ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen // Should be an array of 'i8*'. 9848ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 9948ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (InitList == 0) return; 10048ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 1011d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 1021d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner if (Function *F = 1031d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner dyn_cast<Function>(InitList->getOperand(i)->stripPointerCasts())) 1041d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner UsedFunctions.insert(F); 105b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 106b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 1073b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// getAddrLabelSymbol - Return the symbol to be used for the specified basic 1083b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// block when its address is taken. This cannot be its normal LBB label 1093b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// because the block may be accessed outside its containing function. 1103b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris LattnerMCSymbol *MachineModuleInfo::getAddrLabelSymbol(const BasicBlock *BB) { 1113b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner assert(BB->hasAddressTaken() && 1123b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner "Shouldn't get label for block without address taken"); 1133b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner MCSymbol *&Entry = AddrLabelSymbols[const_cast<BasicBlock*>(BB)]; 1143b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner if (Entry) return Entry; 1153b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner return Entry = Context.CreateTempSymbol(); 1163b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner} 1173b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 1183b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 11959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey//===-EH-------------------------------------------------------------------===// 12059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 12159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 12259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// specified MachineBasicBlock. 12310fff6078a7bc42f142c536bd55e9569253b280bBill WendlingLandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo 12410fff6078a7bc42f142c536bd55e9569253b280bBill Wendling (MachineBasicBlock *LandingPad) { 12559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned N = LandingPads.size(); 12659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i < N; ++i) { 12759e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = LandingPads[i]; 12859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey if (LP.LandingPadBlock == LandingPad) 12959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey return LP; 13059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 131cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 13259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.push_back(LandingPadInfo(LandingPad)); 13359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return LandingPads[N]; 13459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 13559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 13659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addInvoke - Provide the begin and end labels of an invoke style call and 13759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// associate it with a try landing pad block. 13859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, 1391611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel, MCSymbol *EndLabel) { 14059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 141eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.BeginLabels.push_back(BeginLabel); 142eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.EndLabels.push_back(EndLabel); 14359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 14459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 14559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addLandingPad - Provide the label of a try LandingPad block. 14659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 1477561d480953e0a2faa4af9be0a00b1180097c4bdChris LattnerMCSymbol *MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { 14863d7836267298f5b6cde43f0a89acbabfc109f48Chris Lattner MCSymbol *LandingPadLabel = Context.CreateTempSymbol(); 14959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 150cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher LP.LandingPadLabel = LandingPadLabel; 1517561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner return LandingPadLabel; 15259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 15359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 15459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addPersonality - Provide the personality function for the exception 15559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// information. 15659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, 1578c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Function *Personality) { 15859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1598c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov LP.Personality = Personality; 1600ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov 16110fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) 1628c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 1638c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return; 164cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 165d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // If this is the first personality we're adding go 166d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // ahead and add it at the beginning. 167d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher if (Personalities[0] == NULL) 168d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities[0] = Personality; 169d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher else 170d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities.push_back(Personality); 17159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 17259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 17359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 17459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 17559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, 17659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey std::vector<GlobalVariable *> &TyInfo) { 17759e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 17859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned N = TyInfo.size(); N; --N) 17959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); 18059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 18173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 18273ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 18359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey/// 18473ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sandsvoid MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, 18573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands std::vector<GlobalVariable *> &TyInfo) { 18659e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1874925567f85ea60019a9cd45b8230fa72a1bd78dfBill Wendling std::vector<unsigned> IdsInFilter(TyInfo.size()); 18810fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) 18973ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands IdsInFilter[I] = getTypeIDFor(TyInfo[I]); 19073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); 19159e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey} 19259e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey 1936590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// addCleanup - Add a cleanup action for a landing pad. 1946590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// 1956590b0457c5e28a7336ae31de194953d8127217aDuncan Sandsvoid MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { 1966590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 1976590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LP.TypeIds.push_back(0); 1986590b0457c5e28a7336ae31de194953d8127217aDuncan Sands} 1996590b0457c5e28a7336ae31de194953d8127217aDuncan Sands 20059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// TidyLandingPads - Remap landing pad labels and remove any deleted landing 20159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// pads. 20259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::TidyLandingPads() { 20359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i != LandingPads.size(); ) { 20459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPadInfo &LandingPad = LandingPads[i]; 2051611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner if (LandingPad.LandingPadLabel && !LandingPad.LandingPadLabel->isDefined()) 206a34ec2290fa441d312ac33a61e6ec6029259bdefChris Lattner LandingPad.LandingPadLabel = 0; 207eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov 208070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Special case: we *should* emit LPs with null LP MBB. This indicates 209481dc721c37a3da0b3cc88191d01fe5b523625eeDuncan Sands // "nounwind" case. 210070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { 21159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.erase(LandingPads.begin() + i); 21259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey continue; 21359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 21457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 2151611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) { 2161611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel = LandingPad.BeginLabels[j]; 2171611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *EndLabel = LandingPad.EndLabels[j]; 2181611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner if (BeginLabel->isDefined() && EndLabel->isDefined()) continue; 2191611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner 2201611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); 2211611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); 2221611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner --j, --e; 223eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov } 22457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 22557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // Remove landing pads with no try-ranges. 226303595942502f17c087fa28874c2b89117148c45Dan Gohman if (LandingPads[i].BeginLabels.empty()) { 22757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPads.erase(LandingPads.begin() + i); 22857810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands continue; 22957810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands } 23057810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 23157810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If there is no landing pad, ensure that the list of typeids is empty. 23257810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If the only typeid is a cleanup, this is the same as having no typeids. 23357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands if (!LandingPad.LandingPadBlock || 23457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) 23557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPad.TypeIds.clear(); 23659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey ++i; 23759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 23859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 23959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 240cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher/// getTypeIDFor - Return the type id for the specified typeinfo. This is 24159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// function wide. 24259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyunsigned MachineModuleInfo::getTypeIDFor(GlobalVariable *TI) { 24310fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) 24410fff6078a7bc42f142c536bd55e9569253b280bBill Wendling if (TypeInfos[i] == TI) return i + 1; 24559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 24659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.push_back(TI); 24759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return TypeInfos.size(); 24859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 24959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 25073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// getFilterIDFor - Return the filter id for the specified typeinfos. This is 25173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// function wide. 252914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendlingint MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { 25314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // If the new filter coincides with the tail of an existing filter, then 25414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-use the existing filter. Folding filters more than this requires 25514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-ordering filters and/or their elements - probably not worth it. 25614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands for (std::vector<unsigned>::iterator I = FilterEnds.begin(), 25714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands E = FilterEnds.end(); I != E; ++I) { 258914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling unsigned i = *I, j = TyIds.size(); 25914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 26014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands while (i && j) 26114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (FilterIds[--i] != TyIds[--j]) 26214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands goto try_next; 26314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 26414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (!j) 26514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // The new filter coincides with range [i, end) of the existing filter. 26614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands return -(1 + i); 267914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling 26814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sandstry_next:; 26914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands } 27014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 27114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // Add the new filter. 272914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling int FilterID = -(1 + FilterIds.size()); 273914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); 274914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling for (unsigned I = 0, N = TyIds.size(); I != N; ++I) 27573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(TyIds[I]); 276914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterEnds.push_back(FilterIds.size()); 27773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(0); // terminator 27873ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands return FilterID; 27973ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands} 28073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 2818c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonality - Return the personality function for the current function. 28259667fe20379d65129ef5f3665e9f87e654c8623Jim LaskeyFunction *MachineModuleInfo::getPersonality() const { 2830ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov // FIXME: Until PR1414 will be fixed, we're using 1 personality function per 2848c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // function 2858c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return !LandingPads.empty() ? LandingPads[0].Personality : NULL; 28659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 28759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 2888c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonalityIndex - Return unique index for current personality 2895e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher/// function. NULL/first personality function should always get zero index. 2908c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikovunsigned MachineModuleInfo::getPersonalityIndex() const { 291070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov const Function* Personality = NULL; 292cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 293070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Scan landing pads. If there is at least one non-NULL personality - use it. 29410fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i != LandingPads.size(); ++i) 295070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (LandingPads[i].Personality) { 296070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov Personality = LandingPads[i].Personality; 297070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov break; 298070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov } 299cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 30010fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) { 3018c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 3028c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return i; 30310fff6078a7bc42f142c536bd55e9569253b280bBill Wendling } 3048c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov 3055e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // This will happen if the current personality function is 3065e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // in the zero index. 3078c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return 0; 3088c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 30959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 310