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" 20e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng#include "llvm/MC/MCObjectFileInfo.h" 211611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner#include "llvm/MC/MCSymbol.h" 22999aee24c7b7511575146b9950bb85830fab0378Chris Lattner#include "llvm/ADT/PointerUnion.h" 23b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey#include "llvm/Support/Dwarf.h" 24c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h" 256af5681824713544a7a8c6e115649b29d59b3d13Jim Laskeyusing namespace llvm; 269c4447aa2b47f133ac3eac095adb3c375d33031eJim Laskeyusing namespace llvm::dwarf; 276af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 286af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey// Handle the Pass registration stuff necessary to use TargetData's. 29d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(MachineModuleInfo, "machinemoduleinfo", 30ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Machine Module Information", false, false) 311997473cf72957d0e70322e2fe6fe2ab141c58a6Devang Patelchar MachineModuleInfo::ID = 0; 32063e765345fd49df0f53b807e57ada7c2ded7e16Jim Laskey 33a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner// Out of line virtual method. 34a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfoImpl::~MachineModuleInfoImpl() {} 35a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner 360220ba7995236accae6ac009a2700871fc17007dChris Lattnernamespace llvm { 370220ba7995236accae6ac009a2700871fc17007dChris Lattnerclass MMIAddrLabelMapCallbackPtr : CallbackVH { 380220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMap *Map; 390220ba7995236accae6ac009a2700871fc17007dChris Lattnerpublic: 400220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMapCallbackPtr() : Map(0) {} 410220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V), Map(0) {} 42e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 43ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner void setPtr(BasicBlock *BB) { 44ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner ValueHandleBase::operator=(BB); 45ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner } 46e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 470220ba7995236accae6ac009a2700871fc17007dChris Lattner void setMap(MMIAddrLabelMap *map) { Map = map; } 48e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 490220ba7995236accae6ac009a2700871fc17007dChris Lattner virtual void deleted(); 500220ba7995236accae6ac009a2700871fc17007dChris Lattner virtual void allUsesReplacedWith(Value *V2); 510220ba7995236accae6ac009a2700871fc17007dChris Lattner}; 52e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 530220ba7995236accae6ac009a2700871fc17007dChris Lattnerclass MMIAddrLabelMap { 540220ba7995236accae6ac009a2700871fc17007dChris Lattner MCContext &Context; 550220ba7995236accae6ac009a2700871fc17007dChris Lattner struct AddrLabelSymEntry { 56999aee24c7b7511575146b9950bb85830fab0378Chris Lattner /// Symbols - The symbols for the label. This is a pointer union that is 57999aee24c7b7511575146b9950bb85830fab0378Chris Lattner /// either one symbol (the common case) or a list of symbols. 58999aee24c7b7511575146b9950bb85830fab0378Chris Lattner PointerUnion<MCSymbol *, std::vector<MCSymbol*>*> Symbols; 59e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 609cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner Function *Fn; // The containing function of the BasicBlock. 619cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner unsigned Index; // The index in BBCallbacks for the BasicBlock. 620220ba7995236accae6ac009a2700871fc17007dChris Lattner }; 63e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 640220ba7995236accae6ac009a2700871fc17007dChris Lattner DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; 65e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 669cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// BBCallbacks - Callbacks for the BasicBlock's that we have entries for. We 679cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// use this so we get notified if a block is deleted or RAUWd. 680220ba7995236accae6ac009a2700871fc17007dChris Lattner std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; 699cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 709cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// DeletedAddrLabelsNeedingEmission - This is a per-function list of symbols 719cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// whose corresponding BasicBlock got deleted. These symbols need to be 729cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// emitted at some point in the file, so AsmPrinter emits them after the 739cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner /// function body. 749cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> > 759cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission; 760220ba7995236accae6ac009a2700871fc17007dChris Lattnerpublic: 77e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 780220ba7995236accae6ac009a2700871fc17007dChris Lattner MMIAddrLabelMap(MCContext &context) : Context(context) {} 799cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner ~MMIAddrLabelMap() { 809cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert(DeletedAddrLabelsNeedingEmission.empty() && 819cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner "Some labels for deleted blocks never got emitted"); 82e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 83999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Deallocate any of the 'list of symbols' case. 84999aee24c7b7511575146b9950bb85830fab0378Chris Lattner for (DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry>::iterator 85999aee24c7b7511575146b9950bb85830fab0378Chris Lattner I = AddrLabelSymbols.begin(), E = AddrLabelSymbols.end(); I != E; ++I) 86999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (I->second.Symbols.is<std::vector<MCSymbol*>*>()) 87999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete I->second.Symbols.get<std::vector<MCSymbol*>*>(); 889cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner } 89e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 90999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *getAddrLabelSymbol(BasicBlock *BB); 91999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> getAddrLabelSymbolToEmit(BasicBlock *BB); 92999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 93e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer void takeDeletedSymbolsForFunction(Function *F, 949cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::vector<MCSymbol*> &Result); 959cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 960220ba7995236accae6ac009a2700871fc17007dChris Lattner void UpdateForDeletedBlock(BasicBlock *BB); 970220ba7995236accae6ac009a2700871fc17007dChris Lattner void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New); 980220ba7995236accae6ac009a2700871fc17007dChris Lattner}; 990220ba7995236accae6ac009a2700871fc17007dChris Lattner} 1000220ba7995236accae6ac009a2700871fc17007dChris Lattner 1010220ba7995236accae6ac009a2700871fc17007dChris LattnerMCSymbol *MMIAddrLabelMap::getAddrLabelSymbol(BasicBlock *BB) { 1020220ba7995236accae6ac009a2700871fc17007dChris Lattner assert(BB->hasAddressTaken() && 1030220ba7995236accae6ac009a2700871fc17007dChris Lattner "Shouldn't get label for block without address taken"); 1040220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; 105e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1060220ba7995236accae6ac009a2700871fc17007dChris Lattner // If we already had an entry for this block, just return it. 107999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (!Entry.Symbols.isNull()) { 1089cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert(BB->getParent() == Entry.Fn && "Parent changed"); 109999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Entry.Symbols.is<MCSymbol*>()) 110999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Entry.Symbols.get<MCSymbol*>(); 111999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return (*Entry.Symbols.get<std::vector<MCSymbol*>*>())[0]; 1129cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner } 113e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1140220ba7995236accae6ac009a2700871fc17007dChris Lattner // Otherwise, this is a new entry, create a new symbol for it and add an 1150220ba7995236accae6ac009a2700871fc17007dChris Lattner // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd. 1160220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks.push_back(BB); 1170220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks.back().setMap(this); 1180220ba7995236accae6ac009a2700871fc17007dChris Lattner Entry.Index = BBCallbacks.size()-1; 1199cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner Entry.Fn = BB->getParent(); 120999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *Result = Context.CreateTempSymbol(); 121999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Entry.Symbols = Result; 122999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Result; 123999aee24c7b7511575146b9950bb85830fab0378Chris Lattner} 124999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 125999aee24c7b7511575146b9950bb85830fab0378Chris Lattnerstd::vector<MCSymbol*> 126999aee24c7b7511575146b9950bb85830fab0378Chris LattnerMMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) { 127999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(BB->hasAddressTaken() && 128999aee24c7b7511575146b9950bb85830fab0378Chris Lattner "Shouldn't get label for block without address taken"); 129999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; 130e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 131999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> Result; 132e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 133999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If we already had an entry for this block, just return it. 134999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Entry.Symbols.isNull()) 135999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result.push_back(getAddrLabelSymbol(BB)); 136999aee24c7b7511575146b9950bb85830fab0378Chris Lattner else if (MCSymbol *Sym = Entry.Symbols.dyn_cast<MCSymbol*>()) 137999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result.push_back(Sym); 138999aee24c7b7511575146b9950bb85830fab0378Chris Lattner else 139999aee24c7b7511575146b9950bb85830fab0378Chris Lattner Result = *Entry.Symbols.get<std::vector<MCSymbol*>*>(); 140999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return Result; 1410220ba7995236accae6ac009a2700871fc17007dChris Lattner} 1420220ba7995236accae6ac009a2700871fc17007dChris Lattner 143999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 1449cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// takeDeletedSymbolsForFunction - If we have any deleted symbols for F, return 1459cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// them. 1469cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattnervoid MMIAddrLabelMap:: 1479cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris LattnertakeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) { 1489cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >::iterator I = 1499cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission.find(F); 1509cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1519cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // If there are no entries for the function, just return. 1529cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner if (I == DeletedAddrLabelsNeedingEmission.end()) return; 153e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 1549cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // Otherwise, take the list. 1559cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::swap(Result, I->second); 1569cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner DeletedAddrLabelsNeedingEmission.erase(I); 1579cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner} 1589cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1599cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner 1600220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) { 1610220ba7995236accae6ac009a2700871fc17007dChris Lattner // If the block got deleted, there is no need for the symbol. If the symbol 1620220ba7995236accae6ac009a2700871fc17007dChris Lattner // was already emitted, we can just forget about it, otherwise we need to 1630220ba7995236accae6ac009a2700871fc17007dChris Lattner // queue it up for later emission when the function is output. 1640220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry Entry = AddrLabelSymbols[BB]; 1650220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols.erase(BB); 166999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(!Entry.Symbols.isNull() && "Didn't have a symbol, why a callback?"); 1670220ba7995236accae6ac009a2700871fc17007dChris Lattner BBCallbacks[Entry.Index] = 0; // Clear the callback. 1680220ba7995236accae6ac009a2700871fc17007dChris Lattner 1699cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner assert((BB->getParent() == 0 || BB->getParent() == Entry.Fn) && 1709cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner "Block/parent mismatch"); 171999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 172999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Handle both the single and the multiple symbols cases. 173999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *Sym = Entry.Symbols.dyn_cast<MCSymbol*>()) { 174999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Sym->isDefined()) 175999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 176e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 177999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the block is not yet defined, we need to emit it at the end of the 178999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list 179999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // for the containing Function. Since the block is being deleted, its 180999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // parent may already be removed, we have to get the function from 'Entry'. 181999aee24c7b7511575146b9950bb85830fab0378Chris Lattner DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); 182999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } else { 183999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *Syms = Entry.Symbols.get<std::vector<MCSymbol*>*>(); 184999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 185999aee24c7b7511575146b9950bb85830fab0378Chris Lattner for (unsigned i = 0, e = Syms->size(); i != e; ++i) { 186999aee24c7b7511575146b9950bb85830fab0378Chris Lattner MCSymbol *Sym = (*Syms)[i]; 187999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (Sym->isDefined()) continue; // Ignore already emitted labels. 188e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 189999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the block is not yet defined, we need to emit it at the end of the 190999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list 191999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // for the containing Function. Since the block is being deleted, its 192999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // parent may already be removed, we have to get the function from 193999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // 'Entry'. 194999aee24c7b7511575146b9950bb85830fab0378Chris Lattner DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); 195999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 196e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 197999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // The entry is deleted, free the memory associated with the symbol list. 198999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete Syms; 199999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 2000220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2010220ba7995236accae6ac009a2700871fc17007dChris Lattner 2020220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) { 2030220ba7995236accae6ac009a2700871fc17007dChris Lattner // Get the entry for the RAUW'd block and remove it from our map. 2040220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymEntry OldEntry = AddrLabelSymbols[Old]; 2050220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols.erase(Old); 206999aee24c7b7511575146b9950bb85830fab0378Chris Lattner assert(!OldEntry.Symbols.isNull() && "Didn't have a symbol, why a callback?"); 207999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 208999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New]; 209999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 2100220ba7995236accae6ac009a2700871fc17007dChris Lattner // If New is not address taken, just move our symbol over to it. 211999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (NewEntry.Symbols.isNull()) { 212ea16ea59011ce6d5d9baaab16c33b1457ceab0daChris Lattner BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback. 213999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry = OldEntry; // Set New's entry. 214999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 215999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 216999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 217999aee24c7b7511575146b9950bb85830fab0378Chris Lattner BBCallbacks[OldEntry.Index] = 0; // Update the callback. 218999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 219999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Otherwise, we need to add the old symbol to the new block's set. If it is 220999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // just a single entry, upgrade it to a symbol list. 221999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *PrevSym = NewEntry.Symbols.dyn_cast<MCSymbol*>()) { 222999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *SymList = new std::vector<MCSymbol*>(); 223999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->push_back(PrevSym); 224999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry.Symbols = SymList; 225999aee24c7b7511575146b9950bb85830fab0378Chris Lattner } 226e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 227999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *SymList = 228999aee24c7b7511575146b9950bb85830fab0378Chris Lattner NewEntry.Symbols.get<std::vector<MCSymbol*>*>(); 229999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 230999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // If the old entry was a single symbol, add it. 231999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (MCSymbol *Sym = OldEntry.Symbols.dyn_cast<MCSymbol*>()) { 232999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->push_back(Sym); 233999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return; 2340220ba7995236accae6ac009a2700871fc17007dChris Lattner } 235e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 236999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Otherwise, concatenate the list. 237999aee24c7b7511575146b9950bb85830fab0378Chris Lattner std::vector<MCSymbol*> *Syms =OldEntry.Symbols.get<std::vector<MCSymbol*>*>(); 238999aee24c7b7511575146b9950bb85830fab0378Chris Lattner SymList->insert(SymList->end(), Syms->begin(), Syms->end()); 239999aee24c7b7511575146b9950bb85830fab0378Chris Lattner delete Syms; 2400220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2410220ba7995236accae6ac009a2700871fc17007dChris Lattner 2420220ba7995236accae6ac009a2700871fc17007dChris Lattner 2430220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMapCallbackPtr::deleted() { 2440220ba7995236accae6ac009a2700871fc17007dChris Lattner Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr())); 2450220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2460220ba7995236accae6ac009a2700871fc17007dChris Lattner 2470220ba7995236accae6ac009a2700871fc17007dChris Lattnervoid MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) { 2480220ba7995236accae6ac009a2700871fc17007dChris Lattner Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2)); 2490220ba7995236accae6ac009a2700871fc17007dChris Lattner} 2500220ba7995236accae6ac009a2700871fc17007dChris Lattner 2510220ba7995236accae6ac009a2700871fc17007dChris Lattner 252b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey//===----------------------------------------------------------------------===// 253cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 25489b9372605db2ce3b0085c84089e389f7bc1fbddRafael EspindolaMachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI, 2550e6a052331f674dd70e28af41f654a7874405eabEvan Cheng const MCRegisterInfo &MRI, 256203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng const MCObjectFileInfo *MOFI) 257203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng : ImmutablePass(ID), Context(MAI, MRI, MOFI), 2587d36534d2235c6969b6f51c1f20ac1413f54eb67Bill Wendling ObjFileMMI(0), CompactUnwindEncoding(0), CurCallSite(0), CallsEHReturn(0), 259a67dcea0721c02ef543618f0d3b5014ffb3efc8fBill Wendling CallsUnwindInit(0), DbgInfoAvailable(false), 260a67dcea0721c02ef543618f0d3b5014ffb3efc8fBill Wendling CallsExternalVAFunctionWithFloatingPointArguments(false) { 261081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); 262d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // Always emit some info, by default "no personality" info. 2638c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov Personalities.push_back(NULL); 2640220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 265421ccd9892178e741e24c96cef4304262475255dChris Lattner TheModule = 0; 2668c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 267b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 26811d53c129fc9c2a4510605ec0a1696f58750af52Chris LattnerMachineModuleInfo::MachineModuleInfo() 269e76a33b9567d78a5744dc52fcec3a6056d6fb576Evan Cheng : ImmutablePass(ID), 270203576aa0cb9d8bf2d2e4d910ebab4b7a63262aeEvan Cheng Context(*(MCAsmInfo*)0, *(MCRegisterInfo*)0, (MCObjectFileInfo*)0) { 27111d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner assert(0 && "This MachineModuleInfo constructor should never be called, MMI " 27211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner "should always be explicitly constructed by LLVMTargetMachine"); 27311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner abort(); 27411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner} 27511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner 276a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris LattnerMachineModuleInfo::~MachineModuleInfo() { 277f18545550e1cfbe3f47afb6a9a58405416258e3bChris Lattner delete ObjFileMMI; 278e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 2790220ba7995236accae6ac009a2700871fc17007dChris Lattner // FIXME: Why isn't doFinalization being called?? 2800220ba7995236accae6ac009a2700871fc17007dChris Lattner //assert(AddrLabelSymbols == 0 && "doFinalization not called"); 2810220ba7995236accae6ac009a2700871fc17007dChris Lattner delete AddrLabelSymbols; 2820220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 283b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 284b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 2856da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doInitialization - Initialize the state for a new module. 286b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 2876da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doInitialization() { 2880220ba7995236accae6ac009a2700871fc17007dChris Lattner assert(AddrLabelSymbols == 0 && "Improperly initialized"); 289b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 290b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 2916af5681824713544a7a8c6e115649b29d59b3d13Jim Laskey 2926da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// doFinalization - Tear down the state after completion of a module. 293b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey/// 2946da186480b55c10b96a255ce0a4ab731155da907Jim Laskeybool MachineModuleInfo::doFinalization() { 2950220ba7995236accae6ac009a2700871fc17007dChris Lattner delete AddrLabelSymbols; 2960220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = 0; 297b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey return false; 298b2efb853f00d45b1c8d57f92acd0028fbdeffda6Jim Laskey} 299b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 3006da186480b55c10b96a255ce0a4ab731155da907Jim Laskey/// EndFunction - Discard function meta information. 3014188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey/// 3026da186480b55c10b96a255ce0a4ab731155da907Jim Laskeyvoid MachineModuleInfo::EndFunction() { 3034188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey // Clean up frame info. 3044188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey FrameMoves.clear(); 305cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 30659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey // Clean up exception info. 30759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.clear(); 308ca752c9020a1b1cf151142bd9e0cbca9af12d807Jim Grosbach CallSiteMap.clear(); 30959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.clear(); 31073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.clear(); 31114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands FilterEnds.clear(); 3122365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsEHReturn = 0; 3132365f51ed03afe6993bae962fdc2e5a956a64cd5Anton Korobeynikov CallsUnwindInit = 0; 3147d36534d2235c6969b6f51c1f20ac1413f54eb67Bill Wendling CompactUnwindEncoding = 0; 31585d29e2de30cf49956558e45246b998f6d9ed985Devang Patel VariableDbgInfo.clear(); 3164188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey} 3174188699f80c233a20b6ddc61570a8a8c1804cb85Jim Laskey 318b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// AnalyzeModule - Scan the module for global debug information. 319b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey/// 32046510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanvoid MachineModuleInfo::AnalyzeModule(const Module &M) { 321401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // Insert functions in the llvm.used array (but not llvm.compiler.used) into 322401e10c4fbfcdcfade5065093e2ca97f69a1d144Chris Lattner // UsedFunctions. 32346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const GlobalVariable *GV = M.getGlobalVariable("llvm.used"); 32448ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (!GV || !GV->hasInitializer()) return; 32548ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 32648ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen // Should be an array of 'i8*'. 32746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const ConstantArray *InitList = dyn_cast<ConstantArray>(GV->getInitializer()); 32848ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen if (InitList == 0) return; 32948ae02fe62cafd44c740e67cfae6e7277e61a973Dale Johannesen 3301d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) 33146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman if (const Function *F = 3321d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner dyn_cast<Function>(InitList->getOperand(i)->stripPointerCasts())) 3331d5c49327b81fe99295dc55d3be80a229f214da3Chris Lattner UsedFunctions.insert(F); 334b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey} 335b3e789ac2548a4382d0db03b573fd8a127617f8fJim Laskey 3360220ba7995236accae6ac009a2700871fc17007dChris Lattner//===- Address of Block Management ----------------------------------------===// 3370220ba7995236accae6ac009a2700871fc17007dChris Lattner 3380220ba7995236accae6ac009a2700871fc17007dChris Lattner 3393b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// getAddrLabelSymbol - Return the symbol to be used for the specified basic 3403b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// block when its address is taken. This cannot be its normal LBB label 3413b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner/// because the block may be accessed outside its containing function. 3423b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris LattnerMCSymbol *MachineModuleInfo::getAddrLabelSymbol(const BasicBlock *BB) { 3430220ba7995236accae6ac009a2700871fc17007dChris Lattner // Lazily create AddrLabelSymbols. 3440220ba7995236accae6ac009a2700871fc17007dChris Lattner if (AddrLabelSymbols == 0) 3450220ba7995236accae6ac009a2700871fc17007dChris Lattner AddrLabelSymbols = new MMIAddrLabelMap(Context); 3460220ba7995236accae6ac009a2700871fc17007dChris Lattner return AddrLabelSymbols->getAddrLabelSymbol(const_cast<BasicBlock*>(BB)); 3473b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner} 3483b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 349999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// getAddrLabelSymbolToEmit - Return the symbol to be used for the specified 350999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// basic block when its address is taken. If other blocks were RAUW'd to 351999aee24c7b7511575146b9950bb85830fab0378Chris Lattner/// this one, we may have to emit them as well, return the whole set. 352999aee24c7b7511575146b9950bb85830fab0378Chris Lattnerstd::vector<MCSymbol*> MachineModuleInfo:: 353999aee24c7b7511575146b9950bb85830fab0378Chris LattnergetAddrLabelSymbolToEmit(const BasicBlock *BB) { 354999aee24c7b7511575146b9950bb85830fab0378Chris Lattner // Lazily create AddrLabelSymbols. 355999aee24c7b7511575146b9950bb85830fab0378Chris Lattner if (AddrLabelSymbols == 0) 356999aee24c7b7511575146b9950bb85830fab0378Chris Lattner AddrLabelSymbols = new MMIAddrLabelMap(Context); 357999aee24c7b7511575146b9950bb85830fab0378Chris Lattner return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB)); 358999aee24c7b7511575146b9950bb85830fab0378Chris Lattner} 359999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 360999aee24c7b7511575146b9950bb85830fab0378Chris Lattner 3619cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// takeDeletedSymbolsForFunction - If the specified function has had any 3629cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// references to address-taken blocks generated, but the block got deleted, 3639cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// return the symbol now so we can emit it. This prevents emitting a 3649cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner/// reference to a symbol that has no definition. 3659cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattnervoid MachineModuleInfo:: 3669cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris LattnertakeDeletedSymbolsForFunction(const Function *F, 3679cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner std::vector<MCSymbol*> &Result) { 3689cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner // If no blocks have had their addresses taken, we're done. 3699cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner if (AddrLabelSymbols == 0) return; 3709cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner return AddrLabelSymbols-> 3719cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result); 3729cc0da9c29302e9463a6f31ba705c8e1b6f4cea1Chris Lattner} 3733b9d6216a41cfd43759e787db26d797e1f0ba0a8Chris Lattner 3740220ba7995236accae6ac009a2700871fc17007dChris Lattner//===- EH -----------------------------------------------------------------===// 37559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 37659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the 37759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// specified MachineBasicBlock. 37810fff6078a7bc42f142c536bd55e9569253b280bBill WendlingLandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo 37910fff6078a7bc42f142c536bd55e9569253b280bBill Wendling (MachineBasicBlock *LandingPad) { 38059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey unsigned N = LandingPads.size(); 38159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i < N; ++i) { 38259e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = LandingPads[i]; 38359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey if (LP.LandingPadBlock == LandingPad) 38459e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey return LP; 38559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 386cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 38759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.push_back(LandingPadInfo(LandingPad)); 38859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return LandingPads[N]; 38959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 39059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 39159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addInvoke - Provide the begin and end labels of an invoke style call and 39259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// associate it with a try landing pad block. 39359667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, 3941611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel, MCSymbol *EndLabel) { 39559e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 396eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.BeginLabels.push_back(BeginLabel); 397eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov LP.EndLabels.push_back(EndLabel); 39859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 39959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 40059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addLandingPad - Provide the label of a try LandingPad block. 40159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 4027561d480953e0a2faa4af9be0a00b1180097c4bdChris LattnerMCSymbol *MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { 40363d7836267298f5b6cde43f0a89acbabfc109f48Chris Lattner MCSymbol *LandingPadLabel = Context.CreateTempSymbol(); 40459e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 405cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher LP.LandingPadLabel = LandingPadLabel; 4067561d480953e0a2faa4af9be0a00b1180097c4bdChris Lattner return LandingPadLabel; 40759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 40859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 40959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addPersonality - Provide the personality function for the exception 41059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// information. 41159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskeyvoid MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad, 41246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const Function *Personality) { 41359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4148c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov LP.Personality = Personality; 4150ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov 41610fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) 4178c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 4188c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return; 419cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 420d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // If this is the first personality we're adding go 421d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher // ahead and add it at the beginning. 422d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher if (Personalities[0] == NULL) 423d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities[0] = Personality; 424d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher else 425d44fff7849034fc17d6a0e9f9926542865bb7881Eric Christopher Personalities.push_back(Personality); 42659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 42759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 42859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. 42959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// 4301ddaa9c1c684bd46102300e5c680dfa767a88214Bill Wendlingvoid MachineModuleInfo:: 4311ddaa9c1c684bd46102300e5c680dfa767a88214Bill WendlingaddCatchTypeInfo(MachineBasicBlock *LandingPad, 4321ddaa9c1c684bd46102300e5c680dfa767a88214Bill Wendling ArrayRef<const GlobalVariable *> TyInfo) { 43359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 43459667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned N = TyInfo.size(); N; --N) 43559e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); 43659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 43773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 43873ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. 43959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey/// 4401ddaa9c1c684bd46102300e5c680dfa767a88214Bill Wendlingvoid MachineModuleInfo:: 4411ddaa9c1c684bd46102300e5c680dfa767a88214Bill WendlingaddFilterTypeInfo(MachineBasicBlock *LandingPad, 4421ddaa9c1c684bd46102300e5c680dfa767a88214Bill Wendling ArrayRef<const GlobalVariable *> TyInfo) { 44359e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4444925567f85ea60019a9cd45b8230fa72a1bd78dfBill Wendling std::vector<unsigned> IdsInFilter(TyInfo.size()); 44510fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) 44673ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands IdsInFilter[I] = getTypeIDFor(TyInfo[I]); 44773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); 44859e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey} 44959e8434a855737ce3324e4b1acf5e9f12b57a2fcJim Laskey 4506590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// addCleanup - Add a cleanup action for a landing pad. 4516590b0457c5e28a7336ae31de194953d8127217aDuncan Sands/// 4526590b0457c5e28a7336ae31de194953d8127217aDuncan Sandsvoid MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { 4536590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); 4546590b0457c5e28a7336ae31de194953d8127217aDuncan Sands LP.TypeIds.push_back(0); 4556590b0457c5e28a7336ae31de194953d8127217aDuncan Sands} 4566590b0457c5e28a7336ae31de194953d8127217aDuncan Sands 45759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// TidyLandingPads - Remap landing pad labels and remove any deleted landing 45859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// pads. 45947639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendlingvoid MachineModuleInfo::TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap) { 46059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey for (unsigned i = 0; i != LandingPads.size(); ) { 46159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPadInfo &LandingPad = LandingPads[i]; 46247639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling if (LandingPad.LandingPadLabel && 46347639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling !LandingPad.LandingPadLabel->isDefined() && 46447639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (!LPMap || (*LPMap)[LandingPad.LandingPadLabel] == 0)) 465a34ec2290fa441d312ac33a61e6ec6029259bdefChris Lattner LandingPad.LandingPadLabel = 0; 466eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov 467070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Special case: we *should* emit LPs with null LP MBB. This indicates 468481dc721c37a3da0b3cc88191d01fe5b523625eeDuncan Sands // "nounwind" case. 469070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { 47059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey LandingPads.erase(LandingPads.begin() + i); 47159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey continue; 47259667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 47357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 4741611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) { 4751611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *BeginLabel = LandingPad.BeginLabels[j]; 4761611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner MCSymbol *EndLabel = LandingPad.EndLabels[j]; 47747639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling if ((BeginLabel->isDefined() || 47847639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (LPMap && (*LPMap)[BeginLabel] != 0)) && 47947639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (EndLabel->isDefined() || 48047639fc5be0b8f4873d076a9ed24b9a3c0682b15Bill Wendling (LPMap && (*LPMap)[EndLabel] != 0))) continue; 481e70c526d59e92048c89281d1b7011af0b1d9ee95Michael J. Spencer 4821611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); 4831611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); 4841611273351d75b5cbe2a67485bb9831d5916fe26Chris Lattner --j, --e; 485eeb37e0b80f6f71b7620099083e7c10a9978ef86Anton Korobeynikov } 48657810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 48757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // Remove landing pads with no try-ranges. 488303595942502f17c087fa28874c2b89117148c45Dan Gohman if (LandingPads[i].BeginLabels.empty()) { 48957810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPads.erase(LandingPads.begin() + i); 49057810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands continue; 49157810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands } 49257810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands 49357810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If there is no landing pad, ensure that the list of typeids is empty. 49457810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands // If the only typeid is a cleanup, this is the same as having no typeids. 49557810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands if (!LandingPad.LandingPadBlock || 49657810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) 49757810cdac4c842b4b395d2a0b2fae406aacb3ee4Duncan Sands LandingPad.TypeIds.clear(); 49859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey ++i; 49959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey } 50059667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 50159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 50284fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling/// setCallSiteLandingPad - Map the landing pad's EH symbol to the call site 50384fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling/// indexes. 50484fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendlingvoid MachineModuleInfo::setCallSiteLandingPad(MCSymbol *Sym, 50584fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling ArrayRef<unsigned> Sites) { 50684fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling for (unsigned I = 0, E = Sites.size(); I != E; ++I) 50784fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling LPadToCallSiteMap[Sym].push_back(Sites[I]); 50884fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling} 50984fb7dd09e35ee7d32f9d1d88f7dbc3dc706ad7dBill Wendling 510cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher/// getTypeIDFor - Return the type id for the specified typeinfo. This is 51159667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey/// function wide. 51246510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanunsigned MachineModuleInfo::getTypeIDFor(const GlobalVariable *TI) { 51310fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) 51410fff6078a7bc42f142c536bd55e9569253b280bBill Wendling if (TypeInfos[i] == TI) return i + 1; 51559667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 51659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey TypeInfos.push_back(TI); 51759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey return TypeInfos.size(); 51859667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 51959667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 52073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// getFilterIDFor - Return the filter id for the specified typeinfos. This is 52173ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands/// function wide. 522914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendlingint MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { 52314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // If the new filter coincides with the tail of an existing filter, then 52414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-use the existing filter. Folding filters more than this requires 52514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // re-ordering filters and/or their elements - probably not worth it. 52614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands for (std::vector<unsigned>::iterator I = FilterEnds.begin(), 52714da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands E = FilterEnds.end(); I != E; ++I) { 528914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling unsigned i = *I, j = TyIds.size(); 52914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 53014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands while (i && j) 53114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (FilterIds[--i] != TyIds[--j]) 53214da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands goto try_next; 53314da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 53414da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands if (!j) 53514da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // The new filter coincides with range [i, end) of the existing filter. 53614da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands return -(1 + i); 537914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling 53814da32a486f31ba695de9080830e6fadf4942d5bDuncan Sandstry_next:; 53914da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands } 54014da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands 54114da32a486f31ba695de9080830e6fadf4942d5bDuncan Sands // Add the new filter. 542914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling int FilterID = -(1 + FilterIds.size()); 543914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); 544914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling for (unsigned I = 0, N = TyIds.size(); I != N; ++I) 54573ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(TyIds[I]); 546914c970899ce3281a8d14d924ec1bfe335624ac6Bill Wendling FilterEnds.push_back(FilterIds.size()); 54773ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands FilterIds.push_back(0); // terminator 54873ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands return FilterID; 54973ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands} 55073ef58ab92d5cd23b119b7f206e5f8a8c529098dDuncan Sands 5518c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonality - Return the personality function for the current function. 55246510a73e977273ec67747eb34cbdb43f815e451Dan Gohmanconst Function *MachineModuleInfo::getPersonality() const { 5530ff3ca4f9240048462d4cf8e708b519177acf1b4Anton Korobeynikov // FIXME: Until PR1414 will be fixed, we're using 1 personality function per 5548c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov // function 5558c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return !LandingPads.empty() ? LandingPads[0].Personality : NULL; 55659667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey} 55759667fe20379d65129ef5f3665e9f87e654c8623Jim Laskey 5588c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov/// getPersonalityIndex - Return unique index for current personality 5595e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher/// function. NULL/first personality function should always get zero index. 5608c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikovunsigned MachineModuleInfo::getPersonalityIndex() const { 561070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov const Function* Personality = NULL; 562cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 563070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov // Scan landing pads. If there is at least one non-NULL personality - use it. 56410fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i != LandingPads.size(); ++i) 565070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov if (LandingPads[i].Personality) { 566070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov Personality = LandingPads[i].Personality; 567070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov break; 568070280e97f801ae809ddcc7930c153929f253997Anton Korobeynikov } 569cf29697266a78f74b4c00675ae54e3826a03fec1Eric Christopher 57010fff6078a7bc42f142c536bd55e9569253b280bBill Wendling for (unsigned i = 0; i < Personalities.size(); ++i) { 5718c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov if (Personalities[i] == Personality) 5728c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return i; 57310fff6078a7bc42f142c536bd55e9569253b280bBill Wendling } 5748c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov 5755e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // This will happen if the current personality function is 5765e365e23f165d03fd2edc972bd4395e52a481c25Eric Christopher // in the zero index. 5778c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov return 0; 5788c7c17354c7d954de95a064ee89f8c82cccdb819Anton Korobeynikov} 579