MachineModuleInfo.cpp revision ce665bd2e2b581ab0858d1afe359192bac96b868
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/Module.h" 160ff39b3feb10477c224138156941234f5fa46f58Evan Cheng#include "llvm/Analysis/ValueTracking.h" 179d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunctionPass.h" 189d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/CodeGen/MachineFunction.h" 198b56a90bec639665fc024896d2fc2bdd095c76a3Evan Cheng#include "llvm/CodeGen/Passes.h" 209d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetInstrInfo.h" 219d4209fb82cab74bae76511e3f21ef1c24ec948aJim Laskey#include "llvm/Target/TargetMachine.h" 22c1c47c3fa4d6d21b65924c02ab2f228e6285152dJim Laskey#include "llvm/Target/TargetOptions.h" 231611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/MC/MCSymbol.h" 24999aee24c7b7511575146b9950bb85830fab0378Chris Lattner#include "llvm/ADT/PointerUnion.h" 25b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Support/Dwarf.h" 26c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 276af5681824713544a7a8c6e115649b29d59b3d13Jim Laskeyusing namespace llvm; 289c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeyusing namespace llvm::dwarf; 296af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 306af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// Handle the Pass registration stuff necessary to use TargetData's. 31d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(MachineModuleInfo, "machinemoduleinfo", 32ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Machine Module Information", false, false) 331997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar MachineModuleInfo::ID = 0; 34063e765345fd49df0f53b807e57ada7c2ded7e16Jim Laskey 35a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner// Out of line virtual method. 36a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfoImpl::~MachineModuleInfoImpl() {} 37a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner 380220ba7995236accae6ac009a2700871fc17007dChris Lattnernamespace llvm { 390220ba7995236accae6ac009a2700871fc17007dChris Lattnerclass MMIAddrLabelMapCallbackPtr : CallbackVH { 400220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMap *Map; 410220ba7995236accae6ac009a2700871fc17007dChris Lattnerpublic: 420220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMapCallbackPtr() : Map(0) {} 430220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V), Map(0) {} 440220ba7995236accae6ac009a2700871fc17007dChris Lattner 45ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner void setPtr(BasicBlock *BB) { 46ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner ValueHandleBase::operator=(BB); 47ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner } 48ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner 490220ba7995236accae6ac009a2700871fc17007dChris Lattner void setMap(MMIAddrLabelMap *map) { Map = map; } 500220ba7995236accae6ac009a2700871fc17007dChris Lattner 510220ba7995236accae6ac009a2700871fc17007dChris Lattner virtual void deleted(); 520220ba7995236accae6ac009a2700871fc17007dChris Lattner virtual void allUsesReplacedWith(Value *V2); 530220ba7995236accae6ac009a2700871fc17007dChris Lattner}; 540220ba7995236accae6ac009a2700871fc17007dChris Lattner 550220ba7995236accae6ac009a2700871fc17007dChris Lattnerclass MMIAddrLabelMap { 560220ba7995236accae6ac009a2700871fc17007dChris Lattner MCContext &Context; 570220ba7995236accae6ac009a2700871fc17007dChris Lattner struct AddrLabelSymEntry { 58999aee24c7b7511575146b9950bb85830fab0378Chris Lattner /// Symbols - The symbols for the label. This is a pointer union that is 59999aee24c7b7511575146b9950bb85830fab0378Chris Lattner /// either one symbol (the common case) or a list of symbols. 60999aee24c7b7511575146b9950bb85830fab0378Chris Lattner PointerUnion<MCSymbol *, std::vector<MCSymbol*>*> Symbols; 61999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 629cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner Function *Fn; // The containing function of the BasicBlock. 639cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner unsigned Index; // The index in BBCallbacks for the BasicBlock. 640220ba7995236accae6ac009a2700871fc17007dChris Lattner }; 650220ba7995236accae6ac009a2700871fc17007dChris Lattner 660220ba7995236accae6ac009a2700871fc17007dChris Lattner DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; 670220ba7995236accae6ac009a2700871fc17007dChris Lattner 689cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// BBCallbacks - Callbacks for the BasicBlock's that we have entries for. We 699cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// use this so we get notified if a block is deleted or RAUWd. 700220ba7995236accae6ac009a2700871fc17007dChris Lattner std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; 719cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 729cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// DeletedAddrLabelsNeedingEmission - This is a per-function list of symbols 739cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// whose corresponding BasicBlock got deleted. These symbols need to be 749cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// emitted at some point in the file, so AsmPrinter emits them after the 759cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// function body. 769cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> > 779cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission; 780220ba7995236accae6ac009a2700871fc17007dChris Lattnerpublic: 790220ba7995236accae6ac009a2700871fc17007dChris Lattner 800220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMap(MCContext &context) : Context(context) {} 819cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner ~MMIAddrLabelMap() { 829cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert(DeletedAddrLabelsNeedingEmission.empty() && 839cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner "Some labels for deleted blocks never got emitted"); 84999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 85999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Deallocate any of the 'list of symbols' case. 86999aee24c7b7511575146b9950bb85830fab0378Chris Lattner for (DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry>::iterator 87999aee24c7b7511575146b9950bb85830fab0378Chris Lattner I = AddrLabelSymbols.begin(), E = AddrLabelSymbols.end(); I != E; ++I) 88999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (I->second.Symbols.is<std::vector<MCSymbol*>*>()) 89999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete I->second.Symbols.get<std::vector<MCSymbol*>*>(); 909cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner } 910220ba7995236accae6ac009a2700871fc17007dChris Lattner 92999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *getAddrLabelSymbol(BasicBlock *BB); 93999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> getAddrLabelSymbolToEmit(BasicBlock *BB); 94999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 959cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner void takeDeletedSymbolsForFunction(Function *F, 969cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::vector<MCSymbol*> &Result); 979cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 980220ba7995236accae6ac009a2700871fc17007dChris Lattner void UpdateForDeletedBlock(BasicBlock *BB); 990220ba7995236accae6ac009a2700871fc17007dChris Lattner void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New); 1000220ba7995236accae6ac009a2700871fc17007dChris Lattner}; 1010220ba7995236accae6ac009a2700871fc17007dChris Lattner} 1020220ba7995236accae6ac009a2700871fc17007dChris Lattner 1030220ba7995236accae6ac009a2700871fc17007dChris LattnerMCSymbol *MMIAddrLabelMap::getAddrLabelSymbol(BasicBlock *BB) { 1040220ba7995236accae6ac009a2700871fc17007dChris Lattner assert(BB->hasAddressTaken() && 1050220ba7995236accae6ac009a2700871fc17007dChris Lattner "Shouldn't get label for block without address taken"); 1060220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; 1070220ba7995236accae6ac009a2700871fc17007dChris Lattner 1080220ba7995236accae6ac009a2700871fc17007dChris Lattner // If we already had an entry for this block, just return it. 109999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (!Entry.Symbols.isNull()) { 1109cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert(BB->getParent() == Entry.Fn && "Parent changed"); 111999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Entry.Symbols.is<MCSymbol*>()) 112999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Entry.Symbols.get<MCSymbol*>(); 113999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return (*Entry.Symbols.get<std::vector<MCSymbol*>*>())[0]; 1149cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner } 1150220ba7995236accae6ac009a2700871fc17007dChris Lattner 1160220ba7995236accae6ac009a2700871fc17007dChris Lattner // Otherwise, this is a new entry, create a new symbol for it and add an 1170220ba7995236accae6ac009a2700871fc17007dChris Lattner // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd. 1180220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks.push_back(BB); 1190220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks.back().setMap(this); 1200220ba7995236accae6ac009a2700871fc17007dChris Lattner Entry.Index = BBCallbacks.size()-1; 1219cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner Entry.Fn = BB->getParent(); 122999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *Result = Context.CreateTempSymbol(); 123999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Entry.Symbols = Result; 124999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Result; 125999aee24c7b7511575146b9950bb85830fab0378Chris Lattner} 126999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 127999aee24c7b7511575146b9950bb85830fab0378Chris Lattnerstd::vector<MCSymbol*> 128999aee24c7b7511575146b9950bb85830fab0378Chris LattnerMMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) { 129999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(BB->hasAddressTaken() && 130999aee24c7b7511575146b9950bb85830fab0378Chris Lattner "Shouldn't get label for block without address taken"); 131999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; 132999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 133999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> Result; 134999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 135999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If we already had an entry for this block, just return it. 136999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Entry.Symbols.isNull()) 137999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result.push_back(getAddrLabelSymbol(BB)); 138999aee24c7b7511575146b9950bb85830fab0378Chris Lattner else if (MCSymbol *Sym = Entry.Symbols.dyn_cast<MCSymbol*>()) 139999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result.push_back(Sym); 140999aee24c7b7511575146b9950bb85830fab0378Chris Lattner else 141999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result = *Entry.Symbols.get<std::vector<MCSymbol*>*>(); 142999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Result; 1430220ba7995236accae6ac009a2700871fc17007dChris Lattner} 1440220ba7995236accae6ac009a2700871fc17007dChris Lattner 145999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 1469cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// takeDeletedSymbolsForFunction - If we have any deleted symbols for F, return 1479cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// them. 1489cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattnervoid MMIAddrLabelMap:: 1499cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris LattnertakeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) { 1509cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >::iterator I = 1519cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission.find(F); 1529cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1539cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // If there are no entries for the function, just return. 1549cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner if (I == DeletedAddrLabelsNeedingEmission.end()) return; 1559cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1569cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // Otherwise, take the list. 1579cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::swap(Result, I->second); 1589cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission.erase(I); 1599cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner} 1609cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1619cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1620220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) { 1630220ba7995236accae6ac009a2700871fc17007dChris Lattner // If the block got deleted, there is no need for the symbol. If the symbol 1640220ba7995236accae6ac009a2700871fc17007dChris Lattner // was already emitted, we can just forget about it, otherwise we need to 1650220ba7995236accae6ac009a2700871fc17007dChris Lattner // queue it up for later emission when the function is output. 1660220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry Entry = AddrLabelSymbols[BB]; 1670220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols.erase(BB); 168999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(!Entry.Symbols.isNull() && "Didn't have a symbol, why a callback?"); 1690220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks[Entry.Index] = 0; // Clear the callback. 1700220ba7995236accae6ac009a2700871fc17007dChris Lattner 1719cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert((BB->getParent() == 0 || BB->getParent() == Entry.Fn) && 1729cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner "Block/parent mismatch"); 173999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 174999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Handle both the single and the multiple symbols cases. 175999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *Sym = Entry.Symbols.dyn_cast<MCSymbol*>()) { 176999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Sym->isDefined()) 177999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 1789cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 179999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the block is not yet defined, we need to emit it at the end of the 180999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list 181999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // for the containing Function. Since the block is being deleted, its 182999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // parent may already be removed, we have to get the function from 'Entry'. 183999aee24c7b7511575146b9950bb85830fab0378Chris Lattner DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); 184999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } else { 185999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *Syms = Entry.Symbols.get<std::vector<MCSymbol*>*>(); 186999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 187999aee24c7b7511575146b9950bb85830fab0378Chris Lattner for (unsigned i = 0, e = Syms->size(); i != e; ++i) { 188999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *Sym = (*Syms)[i]; 189999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Sym->isDefined()) continue; // Ignore already emitted labels. 190999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 191999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the block is not yet defined, we need to emit it at the end of the 192999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list 193999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // for the containing Function. Since the block is being deleted, its 194999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // parent may already be removed, we have to get the function from 195999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // 'Entry'. 196999aee24c7b7511575146b9950bb85830fab0378Chris Lattner DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); 197999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 198999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 199999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // The entry is deleted, free the memory associated with the symbol list. 200999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete Syms; 201999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 2020220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2030220ba7995236accae6ac009a2700871fc17007dChris Lattner 2040220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) { 2050220ba7995236accae6ac009a2700871fc17007dChris Lattner // Get the entry for the RAUW'd block and remove it from our map. 2060220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry OldEntry = AddrLabelSymbols[Old]; 2070220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols.erase(Old); 208999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(!OldEntry.Symbols.isNull() && "Didn't have a symbol, why a callback?"); 209999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 210999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New]; 211999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 2120220ba7995236accae6ac009a2700871fc17007dChris Lattner // If New is not address taken, just move our symbol over to it. 213999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (NewEntry.Symbols.isNull()) { 214ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback. 215999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry = OldEntry; // Set New's entry. 216999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 217999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 218999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 219999aee24c7b7511575146b9950bb85830fab0378Chris Lattner BBCallbacks[OldEntry.Index] = 0; // Update the callback. 220999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 221999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Otherwise, we need to add the old symbol to the new block's set. If it is 222999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // just a single entry, upgrade it to a symbol list. 223999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *PrevSym = NewEntry.Symbols.dyn_cast<MCSymbol*>()) { 224999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *SymList = new std::vector<MCSymbol*>(); 225999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->push_back(PrevSym); 226999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry.Symbols = SymList; 227999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 228999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 229999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *SymList = 230999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry.Symbols.get<std::vector<MCSymbol*>*>(); 231999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 232999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the old entry was a single symbol, add it. 233999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *Sym = OldEntry.Symbols.dyn_cast<MCSymbol*>()) { 234999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->push_back(Sym); 235999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 2360220ba7995236accae6ac009a2700871fc17007dChris Lattner } 237999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 238999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Otherwise, concatenate the list. 239999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *Syms =OldEntry.Symbols.get<std::vector<MCSymbol*>*>(); 240999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->insert(SymList->end(), Syms->begin(), Syms->end()); 241999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete Syms; 2420220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2430220ba7995236accae6ac009a2700871fc17007dChris Lattner 2440220ba7995236accae6ac009a2700871fc17007dChris Lattner 2450220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMapCallbackPtr::deleted() { 2460220ba7995236accae6ac009a2700871fc17007dChris Lattner Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr())); 2470220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2480220ba7995236accae6ac009a2700871fc17007dChris Lattner 2490220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) { 2500220ba7995236accae6ac009a2700871fc17007dChris Lattner Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2)); 2510220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2520220ba7995236accae6ac009a2700871fc17007dChris Lattner 2530220ba7995236accae6ac009a2700871fc17007dChris Lattner 254b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 255cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 25611d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerMachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI) 25790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson: ImmutablePass(ID), Context(MAI), 25863d7836267298f5b6cde43f0a89acbabfc109f48Chris Lattner ObjFileMMI(0), 25918589de9b1b8c157dea602653042e486128dd9e4Chris Lattner CurCallSite(0), CallsEHReturn(0), CallsUnwindInit(0), DbgInfoAvailable(false){ 260d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // Always emit some info, by default "no personality" info. 2618c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Personalities.push_back(NULL); 2620220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 263421ccd9892178e741e24c96cef4304262475255dChris Lattner TheModule = 0; 2648c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 265b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 26611d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerMachineModuleInfo::MachineModuleInfo() 26790c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson: ImmutablePass(ID), Context(*(MCAsmInfo*)0) { 26811d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner assert(0 && "This MachineModuleInfo constructor should never be called, MMI " 26911d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner "should always be explicitly constructed by LLVMTargetMachine"); 27011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner abort(); 27111d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner} 27211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner 273a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfo::~MachineModuleInfo() { 274f18545550e1cfbe3f47afb6a9a58405416258e3bChris Lattner delete ObjFileMMI; 2750220ba7995236accae6ac009a2700871fc17007dChris Lattner 2760220ba7995236accae6ac009a2700871fc17007dChris Lattner // FIXME: Why isn't doFinalization being called?? 2770220ba7995236accae6ac009a2700871fc17007dChris Lattner //assert(AddrLabelSymbols == 0 && "doFinalization not called"); 2780220ba7995236accae6ac009a2700871fc17007dChris Lattner delete AddrLabelSymbols; 2790220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 280b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 281b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 2826da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doInitialization - Initialize the state for a new module. 283b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 2846da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doInitialization() { 2850220ba7995236accae6ac009a2700871fc17007dChris Lattner assert(AddrLabelSymbols == 0 && "Improperly initialized"); 286b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 287b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 2886af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 2896da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doFinalization - Tear down the state after completion of a module. 290b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 2916da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doFinalization() { 2920220ba7995236accae6ac009a2700871fc17007dChris Lattner delete AddrLabelSymbols; 2930220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 294b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 295b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 296b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 2976da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// EndFunction - Discard function meta information. 2984188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey/// 2996da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::EndFunction() { 3004188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Clean up frame info. 3014188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey FrameMoves.clear(); 302cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 30359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey // Clean up exception info. 30459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.clear(); 305ca752c9020a1b1cf151142bd9e0cbca9af12d807Jim Grosbach CallSiteMap.clear(); 30659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.clear(); 30773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.clear(); 30814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands FilterEnds.clear(); 3092365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsEHReturn = 0; 3102365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsUnwindInit = 0; 31185d29e2de30cf49956558e45246b998f6d9ed985Devang Patel VariableDbgInfo.clear(); 3124188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey} 3134188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 314b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// AnalyzeModule - Scan the module for global debug information. 315b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 31646510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanvoid MachineModuleInfo::AnalyzeModule(const Module &M) { 317401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // Insert functions in the llvm.used array (but not llvm.compiler.used) into 318401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // UsedFunctions. 31946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const GlobalVariable *GV = M.getGlobalVariable("llvm.used"); 32048ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (!GV || !GV->hasInitializer()) return; 32148ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 32248ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen // Should be an array of 'i8*'. 32346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 32448ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (InitList == 0) return; 32548ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 3261d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 32746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const Function *F = 3281d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner dyn_cast<Function>(InitList->getOperand(i)->stripPointerCasts())) 3291d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner UsedFunctions.insert(F); 330b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 331b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 3320220ba7995236accae6ac009a2700871fc17007dChris Lattner//===- Address of Block Management ----------------------------------------===// 3330220ba7995236accae6ac009a2700871fc17007dChris Lattner 3340220ba7995236accae6ac009a2700871fc17007dChris Lattner 3353b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// getAddrLabelSymbol - Return the symbol to be used for the specified basic 3363b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// block when its address is taken. This cannot be its normal LBB label 3373b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// because the block may be accessed outside its containing function. 3383b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris LattnerMCSymbol *MachineModuleInfo::getAddrLabelSymbol(const BasicBlock *BB) { 3390220ba7995236accae6ac009a2700871fc17007dChris Lattner // Lazily create AddrLabelSymbols. 3400220ba7995236accae6ac009a2700871fc17007dChris Lattner if (AddrLabelSymbols == 0) 3410220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = new MMIAddrLabelMap(Context); 3420220ba7995236accae6ac009a2700871fc17007dChris Lattner return AddrLabelSymbols->getAddrLabelSymbol(const_cast<BasicBlock*>(BB)); 3433b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner} 3443b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 345999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// getAddrLabelSymbolToEmit - Return the symbol to be used for the specified 346999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// basic block when its address is taken. If other blocks were RAUW'd to 347999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// this one, we may have to emit them as well, return the whole set. 348999aee24c7b7511575146b9950bb85830fab0378Chris Lattnerstd::vector<MCSymbol*> MachineModuleInfo:: 349999aee24c7b7511575146b9950bb85830fab0378Chris LattnergetAddrLabelSymbolToEmit(const BasicBlock *BB) { 350999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Lazily create AddrLabelSymbols. 351999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (AddrLabelSymbols == 0) 352999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymbols = new MMIAddrLabelMap(Context); 353999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB)); 354999aee24c7b7511575146b9950bb85830fab0378Chris Lattner} 355999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 356999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 3579cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// takeDeletedSymbolsForFunction - If the specified function has had any 3589cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// references to address-taken blocks generated, but the block got deleted, 3599cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// return the symbol now so we can emit it. This prevents emitting a 3609cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// reference to a symbol that has no definition. 3619cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattnervoid MachineModuleInfo:: 3629cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris LattnertakeDeletedSymbolsForFunction(const Function *F, 3639cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::vector<MCSymbol*> &Result) { 3649cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // If no blocks have had their addresses taken, we're done. 3659cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner if (AddrLabelSymbols == 0) return; 3669cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner return AddrLabelSymbols-> 3679cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result); 3689cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner} 3693b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 3700220ba7995236accae6ac009a2700871fc17007dChris Lattner//===- EH -----------------------------------------------------------------===// 37159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 37259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 37359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// specified MachineBasicBlock. 37410fff6078a7bc42f142c536bd55e9569253b280bBill WendlingLandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo 37510fff6078a7bc42f142c536bd55e9569253b280bBill Wendling (MachineBasicBlock *LandingPad) { 37659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned N = LandingPads.size(); 37759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i < N; ++i) { 37859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = LandingPads[i]; 37959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey if (LP.LandingPadBlock == LandingPad) 38059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey return LP; 38159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 382cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 38359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.push_back(LandingPadInfo(LandingPad)); 38459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return LandingPads[N]; 38559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 38659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 38759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addInvoke - Provide the begin and end labels of an invoke style call and 38859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// associate it with a try landing pad block. 38959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, 3901611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel, MCSymbol *EndLabel) { 39159e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 392eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.BeginLabels.push_back(BeginLabel); 393eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.EndLabels.push_back(EndLabel); 39459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 39559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 39659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addLandingPad - Provide the label of a try LandingPad block. 39759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 3987561d480953e0a2faa4af9be0a00b1180097c4bdChris LattnerMCSymbol *MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { 39963d7836267298f5b6cde43f0a89acbabfc109f48Chris Lattner MCSymbol *LandingPadLabel = Context.CreateTempSymbol(); 40059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 401cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher LP.LandingPadLabel = LandingPadLabel; 4027561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner return LandingPadLabel; 40359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 40459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 40559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addPersonality - Provide the personality function for the exception 40659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// information. 40759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, 40846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const Function *Personality) { 40959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4108c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov LP.Personality = Personality; 4110ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov 41210fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) 4138c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 4148c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return; 415cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 416d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // If this is the first personality we're adding go 417d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // ahead and add it at the beginning. 418d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher if (Personalities[0] == NULL) 419d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities[0] = Personality; 420d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher else 421d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities.push_back(Personality); 42259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 42359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 42459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 42559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 42659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addCatchTypeInfo(MachineBasicBlock *LandingPad, 42746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman std::vector<const GlobalVariable *> &TyInfo) { 42859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 42959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned N = TyInfo.size(); N; --N) 43059e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); 43159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 43273ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 43373ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 43459e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey/// 43573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sandsvoid MachineModuleInfo::addFilterTypeInfo(MachineBasicBlock *LandingPad, 43646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman std::vector<const GlobalVariable *> &TyInfo) { 43759e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4384925567f85ea60019a9cd45b8230fa72a1bd78dfBill Wendling std::vector<unsigned> IdsInFilter(TyInfo.size()); 43910fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) 44073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands IdsInFilter[I] = getTypeIDFor(TyInfo[I]); 44173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); 44259e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey} 44359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey 4446590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// addCleanup - Add a cleanup action for a landing pad. 4456590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// 4466590b0457c5e28a7336ae31de194953d8127217aDuncan Sandsvoid MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { 4476590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4486590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LP.TypeIds.push_back(0); 4496590b0457c5e28a7336ae31de194953d8127217aDuncan Sands} 4506590b0457c5e28a7336ae31de194953d8127217aDuncan Sands 45159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// TidyLandingPads - Remap landing pad labels and remove any deleted landing 45259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// pads. 45347639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendlingvoid MachineModuleInfo::TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap) { 45459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i != LandingPads.size(); ) { 45559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPadInfo &LandingPad = LandingPads[i]; 45647639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling if (LandingPad.LandingPadLabel && 45747639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling !LandingPad.LandingPadLabel->isDefined() && 45847639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (!LPMap || (*LPMap)[LandingPad.LandingPadLabel] == 0)) 459a34ec2290fa441d312ac33a61e6ec6029259bdefChris Lattner LandingPad.LandingPadLabel = 0; 460eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov 461070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Special case: we *should* emit LPs with null LP MBB. This indicates 462481dc721c37a3da0b3cc88191d01fe5b523625eeDuncan Sands // "nounwind" case. 463070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { 46459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.erase(LandingPads.begin() + i); 46559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey continue; 46659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 46757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 4681611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) { 4691611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel = LandingPad.BeginLabels[j]; 4701611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *EndLabel = LandingPad.EndLabels[j]; 47147639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling if ((BeginLabel->isDefined() || 47247639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (LPMap && (*LPMap)[BeginLabel] != 0)) && 47347639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (EndLabel->isDefined() || 47447639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (LPMap && (*LPMap)[EndLabel] != 0))) continue; 4751611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner 4761611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); 4771611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); 4781611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner --j, --e; 479eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov } 48057810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 48157810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // Remove landing pads with no try-ranges. 482303595942502f17c087fa28874c2b89117148c45Dan Gohman if (LandingPads[i].BeginLabels.empty()) { 48357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPads.erase(LandingPads.begin() + i); 48457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands continue; 48557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands } 48657810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 48757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If there is no landing pad, ensure that the list of typeids is empty. 48857810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If the only typeid is a cleanup, this is the same as having no typeids. 48957810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands if (!LandingPad.LandingPadBlock || 49057810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) 49157810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPad.TypeIds.clear(); 49259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey ++i; 49359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 49459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 49559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 496cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher/// getTypeIDFor - Return the type id for the specified typeinfo. This is 49759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// function wide. 49846510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanunsigned MachineModuleInfo::getTypeIDFor(const GlobalVariable *TI) { 49910fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) 50010fff6078a7bc42f142c536bd55e9569253b280bBill Wendling if (TypeInfos[i] == TI) return i + 1; 50159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 50259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.push_back(TI); 50359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return TypeInfos.size(); 50459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 50559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 50673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// getFilterIDFor - Return the filter id for the specified typeinfos. This is 50773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// function wide. 508914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendlingint MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { 50914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // If the new filter coincides with the tail of an existing filter, then 51014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-use the existing filter. Folding filters more than this requires 51114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-ordering filters and/or their elements - probably not worth it. 51214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands for (std::vector<unsigned>::iterator I = FilterEnds.begin(), 51314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands E = FilterEnds.end(); I != E; ++I) { 514914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling unsigned i = *I, j = TyIds.size(); 51514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 51614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands while (i && j) 51714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (FilterIds[--i] != TyIds[--j]) 51814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands goto try_next; 51914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 52014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (!j) 52114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // The new filter coincides with range [i, end) of the existing filter. 52214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands return -(1 + i); 523914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling 52414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sandstry_next:; 52514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands } 52614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 52714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // Add the new filter. 528914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling int FilterID = -(1 + FilterIds.size()); 529914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); 530914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling for (unsigned I = 0, N = TyIds.size(); I != N; ++I) 53173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(TyIds[I]); 532914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterEnds.push_back(FilterIds.size()); 53373ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(0); // terminator 53473ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands return FilterID; 53573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands} 53673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 5378c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonality - Return the personality function for the current function. 53846510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanconst Function *MachineModuleInfo::getPersonality() const { 5390ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov // FIXME: Until PR1414 will be fixed, we're using 1 personality function per 5408c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // function 5418c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return !LandingPads.empty() ? LandingPads[0].Personality : NULL; 54259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 54359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 5448c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonalityIndex - Return unique index for current personality 5455e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher/// function. NULL/first personality function should always get zero index. 5468c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikovunsigned MachineModuleInfo::getPersonalityIndex() const { 547070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov const Function* Personality = NULL; 548cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 549070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Scan landing pads. If there is at least one non-NULL personality - use it. 55010fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i != LandingPads.size(); ++i) 551070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (LandingPads[i].Personality) { 552070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov Personality = LandingPads[i].Personality; 553070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov break; 554070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov } 555cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 55610fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) { 5578c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 5588c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return i; 55910fff6078a7bc42f142c536bd55e9569253b280bBill Wendling } 5608c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov 5615e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // This will happen if the current personality function is 5625e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // in the zero index. 5638c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return 0; 5648c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 565