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