Jim Laskey | 5a1df97 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 1 | //===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// |
Jim Laskey | 4431739 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | f3ebc3f | 2007-12-29 20:36:04 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
Jim Laskey | 4431739 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
Jim Laskey | 4431739 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 9 | |
Jim Laskey | 5a1df97 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 10 | #include "llvm/CodeGen/MachineModuleInfo.h" |
Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 11 | #include "llvm/ADT/PointerUnion.h" |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 12 | #include "llvm/ADT/PostOrderIterator.h" |
Reid Kleckner | c20276d | 2015-11-17 21:10:25 +0000 | [diff] [blame] | 13 | #include "llvm/ADT/TinyPtrVector.h" |
David Majnemer | 70497c6 | 2015-12-02 23:06:39 +0000 | [diff] [blame] | 14 | #include "llvm/Analysis/EHPersonalities.h" |
Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 15 | #include "llvm/Analysis/ValueTracking.h" |
| 16 | #include "llvm/CodeGen/MachineFunction.h" |
Matthias Braun | 733fe36 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/MachineFunctionInitializer.h" |
Chandler Carruth | ed0881b | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/MachineFunctionPass.h" |
| 19 | #include "llvm/CodeGen/Passes.h" |
Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 20 | #include "llvm/IR/Constants.h" |
| 21 | #include "llvm/IR/DerivedTypes.h" |
| 22 | #include "llvm/IR/GlobalVariable.h" |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 23 | #include "llvm/IR/Instructions.h" |
Chandler Carruth | 9fb823b | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 24 | #include "llvm/IR/Module.h" |
Evan Cheng | 7679299 | 2011-07-20 05:58:47 +0000 | [diff] [blame] | 25 | #include "llvm/MC/MCObjectFileInfo.h" |
Chris Lattner | 34adc8d | 2010-03-14 01:41:15 +0000 | [diff] [blame] | 26 | #include "llvm/MC/MCSymbol.h" |
Jim Laskey | 0bbdc55 | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 27 | #include "llvm/Support/Dwarf.h" |
Torok Edwin | 56d0659 | 2009-07-11 20:10:48 +0000 | [diff] [blame] | 28 | #include "llvm/Support/ErrorHandling.h" |
Matthias Braun | c3b2e80 | 2016-08-24 00:42:05 +0000 | [diff] [blame] | 29 | #include "llvm/Target/TargetLoweringObjectFile.h" |
| 30 | #include "llvm/Target/TargetMachine.h" |
Jim Laskey | 4431739 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 31 | using namespace llvm; |
Jim Laskey | 4e71db1 | 2006-03-01 20:39:36 +0000 | [diff] [blame] | 32 | using namespace llvm::dwarf; |
Jim Laskey | 4431739 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 33 | |
Micah Villmow | cdfe20b | 2012-10-08 16:38:25 +0000 | [diff] [blame] | 34 | // Handle the Pass registration stuff necessary to use DataLayout's. |
Matthias Braun | c3b2e80 | 2016-08-24 00:42:05 +0000 | [diff] [blame] | 35 | INITIALIZE_TM_PASS(MachineModuleInfo, "machinemoduleinfo", |
| 36 | "Machine Module Information", false, false) |
Devang Patel | 8c78a0b | 2007-05-03 01:11:54 +0000 | [diff] [blame] | 37 | char MachineModuleInfo::ID = 0; |
Jim Laskey | b996602 | 2006-01-17 17:31:53 +0000 | [diff] [blame] | 38 | |
Chris Lattner | f2471ec | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 39 | // Out of line virtual method. |
| 40 | MachineModuleInfoImpl::~MachineModuleInfoImpl() {} |
| 41 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 42 | namespace llvm { |
David Blaikie | 774b584 | 2015-08-03 22:30:24 +0000 | [diff] [blame] | 43 | class MMIAddrLabelMapCallbackPtr final : CallbackVH { |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 44 | MMIAddrLabelMap *Map; |
| 45 | public: |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 46 | MMIAddrLabelMapCallbackPtr() : Map(nullptr) {} |
| 47 | MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V), Map(nullptr) {} |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 48 | |
Chris Lattner | b1c4f62 | 2010-03-22 23:15:57 +0000 | [diff] [blame] | 49 | void setPtr(BasicBlock *BB) { |
| 50 | ValueHandleBase::operator=(BB); |
| 51 | } |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 52 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 53 | void setMap(MMIAddrLabelMap *map) { Map = map; } |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 54 | |
Craig Topper | 4584cd5 | 2014-03-07 09:26:03 +0000 | [diff] [blame] | 55 | void deleted() override; |
| 56 | void allUsesReplacedWith(Value *V2) override; |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 57 | }; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 58 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 59 | class MMIAddrLabelMap { |
| 60 | MCContext &Context; |
| 61 | struct AddrLabelSymEntry { |
Ahmed Bougacha | 2b4c127 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 62 | /// The symbols for the label. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 63 | TinyPtrVector<MCSymbol *> Symbols; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 64 | |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 65 | Function *Fn; // The containing function of the BasicBlock. |
| 66 | unsigned Index; // The index in BBCallbacks for the BasicBlock. |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 67 | }; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 68 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 69 | DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 70 | |
Ahmed Bougacha | 2b4c127 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 71 | /// Callbacks for the BasicBlock's that we have entries for. We use this so |
| 72 | /// we get notified if a block is deleted or RAUWd. |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 73 | std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 74 | |
Ahmed Bougacha | 2b4c127 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 75 | /// This is a per-function list of symbols whose corresponding BasicBlock got |
| 76 | /// deleted. These symbols need to be emitted at some point in the file, so |
| 77 | /// AsmPrinter emits them after the function body. |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 78 | DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> > |
| 79 | DeletedAddrLabelsNeedingEmission; |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 80 | public: |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 81 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 82 | MMIAddrLabelMap(MCContext &context) : Context(context) {} |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 83 | ~MMIAddrLabelMap() { |
| 84 | assert(DeletedAddrLabelsNeedingEmission.empty() && |
| 85 | "Some labels for deleted blocks never got emitted"); |
| 86 | } |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 87 | |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 88 | ArrayRef<MCSymbol *> getAddrLabelSymbolToEmit(BasicBlock *BB); |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 89 | |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 90 | void takeDeletedSymbolsForFunction(Function *F, |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 91 | std::vector<MCSymbol*> &Result); |
| 92 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 93 | void UpdateForDeletedBlock(BasicBlock *BB); |
| 94 | void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New); |
| 95 | }; |
Alexander Kornienko | f00654e | 2015-06-23 09:49:53 +0000 | [diff] [blame] | 96 | } |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 97 | |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 98 | ArrayRef<MCSymbol *> MMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) { |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 99 | assert(BB->hasAddressTaken() && |
| 100 | "Shouldn't get label for block without address taken"); |
| 101 | AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 102 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 103 | // If we already had an entry for this block, just return it. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 104 | if (!Entry.Symbols.empty()) { |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 105 | assert(BB->getParent() == Entry.Fn && "Parent changed"); |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 106 | return Entry.Symbols; |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 107 | } |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 108 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 109 | // Otherwise, this is a new entry, create a new symbol for it and add an |
| 110 | // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd. |
Benjamin Kramer | f5e2fc4 | 2015-05-29 19:43:39 +0000 | [diff] [blame] | 111 | BBCallbacks.emplace_back(BB); |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 112 | BBCallbacks.back().setMap(this); |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 113 | Entry.Index = BBCallbacks.size() - 1; |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 114 | Entry.Fn = BB->getParent(); |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 115 | Entry.Symbols.push_back(Context.createTempSymbol()); |
| 116 | return Entry.Symbols; |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 117 | } |
| 118 | |
Ahmed Bougacha | 2b4c127 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 119 | /// If we have any deleted symbols for F, return them. |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 120 | void MMIAddrLabelMap:: |
| 121 | takeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) { |
| 122 | DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >::iterator I = |
| 123 | DeletedAddrLabelsNeedingEmission.find(F); |
| 124 | |
| 125 | // If there are no entries for the function, just return. |
| 126 | if (I == DeletedAddrLabelsNeedingEmission.end()) return; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 127 | |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 128 | // Otherwise, take the list. |
| 129 | std::swap(Result, I->second); |
| 130 | DeletedAddrLabelsNeedingEmission.erase(I); |
| 131 | } |
| 132 | |
| 133 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 134 | void MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) { |
| 135 | // If the block got deleted, there is no need for the symbol. If the symbol |
| 136 | // was already emitted, we can just forget about it, otherwise we need to |
| 137 | // queue it up for later emission when the function is output. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 138 | AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]); |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 139 | AddrLabelSymbols.erase(BB); |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 140 | assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?"); |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 141 | BBCallbacks[Entry.Index] = nullptr; // Clear the callback. |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 142 | |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 143 | assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) && |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 144 | "Block/parent mismatch"); |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 145 | |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 146 | for (MCSymbol *Sym : Entry.Symbols) { |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 147 | if (Sym->isDefined()) |
| 148 | return; |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 149 | |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 150 | // If the block is not yet defined, we need to emit it at the end of the |
| 151 | // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list |
| 152 | // for the containing Function. Since the block is being deleted, its |
| 153 | // parent may already be removed, we have to get the function from 'Entry'. |
| 154 | DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 155 | } |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 156 | } |
| 157 | |
| 158 | void MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) { |
| 159 | // Get the entry for the RAUW'd block and remove it from our map. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 160 | AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]); |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 161 | AddrLabelSymbols.erase(Old); |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 162 | assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?"); |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 163 | |
| 164 | AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New]; |
| 165 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 166 | // If New is not address taken, just move our symbol over to it. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 167 | if (NewEntry.Symbols.empty()) { |
Chris Lattner | b1c4f62 | 2010-03-22 23:15:57 +0000 | [diff] [blame] | 168 | BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback. |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 169 | NewEntry = std::move(OldEntry); // Set New's entry. |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 170 | return; |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 171 | } |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 172 | |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 173 | BBCallbacks[OldEntry.Index] = nullptr; // Update the callback. |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 174 | |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 175 | // Otherwise, we need to add the old symbols to the new block's set. |
| 176 | NewEntry.Symbols.insert(NewEntry.Symbols.end(), OldEntry.Symbols.begin(), |
| 177 | OldEntry.Symbols.end()); |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 178 | } |
| 179 | |
| 180 | |
| 181 | void MMIAddrLabelMapCallbackPtr::deleted() { |
| 182 | Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr())); |
| 183 | } |
| 184 | |
| 185 | void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) { |
| 186 | Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2)); |
| 187 | } |
| 188 | |
| 189 | |
Jim Laskey | 0bbdc55 | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 190 | //===----------------------------------------------------------------------===// |
Eric Christopher | c264571 | 2009-08-26 21:27:09 +0000 | [diff] [blame] | 191 | |
Matthias Braun | c3b2e80 | 2016-08-24 00:42:05 +0000 | [diff] [blame] | 192 | MachineModuleInfo::MachineModuleInfo(const TargetMachine *TM) |
Matthias Braun | 733fe36 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 193 | : ImmutablePass(ID), TM(*TM), |
| 194 | Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(), |
| 195 | TM->getObjFileLowering(), nullptr, false) { |
Owen Anderson | 6c18d1a | 2010-10-19 17:21:58 +0000 | [diff] [blame] | 196 | initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); |
Anton Korobeynikov | bbaf554 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 197 | } |
Jim Laskey | 0bbdc55 | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 198 | |
Chris Lattner | f2471ec | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 199 | MachineModuleInfo::~MachineModuleInfo() { |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 200 | } |
Michael J. Spencer | d3ea25e | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 201 | |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 202 | bool MachineModuleInfo::doInitialization(Module &M) { |
Pedro Artigas | e84b13f | 2012-12-06 22:12:44 +0000 | [diff] [blame] | 203 | |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 204 | ObjFileMMI = nullptr; |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 205 | CurCallSite = 0; |
Peter Collingbourne | 7ef497b | 2014-12-30 20:05:19 +0000 | [diff] [blame] | 206 | DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false; |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 207 | AddrLabelSymbols = nullptr; |
Matthias Braun | 733fe36 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 208 | TheModule = &M; |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 209 | |
| 210 | return false; |
| 211 | } |
| 212 | |
| 213 | bool MachineModuleInfo::doFinalization(Module &M) { |
| 214 | |
| 215 | Personalities.clear(); |
| 216 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 217 | delete AddrLabelSymbols; |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 218 | AddrLabelSymbols = nullptr; |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 219 | |
Pedro Artigas | 7212ee4 | 2012-12-12 22:59:46 +0000 | [diff] [blame] | 220 | Context.reset(); |
Pedro Artigas | e84b13f | 2012-12-06 22:12:44 +0000 | [diff] [blame] | 221 | |
Pedro Artigas | 3383225 | 2013-01-04 18:04:42 +0000 | [diff] [blame] | 222 | delete ObjFileMMI; |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 223 | ObjFileMMI = nullptr; |
Pedro Artigas | 3383225 | 2013-01-04 18:04:42 +0000 | [diff] [blame] | 224 | |
Pedro Artigas | 41b9884 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 225 | return false; |
Jim Laskey | 0bbdc55 | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 226 | } |
| 227 | |
Chris Lattner | 347a0eb | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 228 | //===- Address of Block Management ----------------------------------------===// |
| 229 | |
Benjamin Kramer | 6fe4e79 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 230 | ArrayRef<MCSymbol *> |
| 231 | MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) { |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 232 | // Lazily create AddrLabelSymbols. |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 233 | if (!AddrLabelSymbols) |
Chris Lattner | db035a0 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 234 | AddrLabelSymbols = new MMIAddrLabelMap(Context); |
| 235 | return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB)); |
| 236 | } |
| 237 | |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 238 | void MachineModuleInfo:: |
| 239 | takeDeletedSymbolsForFunction(const Function *F, |
| 240 | std::vector<MCSymbol*> &Result) { |
| 241 | // If no blocks have had their addresses taken, we're done. |
Craig Topper | c0196b1 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 242 | if (!AddrLabelSymbols) return; |
Chris Lattner | 561334a | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 243 | return AddrLabelSymbols-> |
| 244 | takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result); |
| 245 | } |
Chris Lattner | 9efbbcb | 2010-03-14 17:53:23 +0000 | [diff] [blame] | 246 | |
Matthias Braun | d0ee66c | 2016-12-01 19:32:15 +0000 | [diff] [blame] | 247 | /// \name Exception Handling |
| 248 | /// \{ |
Jim Laskey | 88dd2fd | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 249 | |
Keno Fischer | aff703a | 2015-07-14 19:22:51 +0000 | [diff] [blame] | 250 | void MachineModuleInfo::addPersonality(const Function *Personality) { |
Bill Wendling | 2e506894 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 251 | for (unsigned i = 0; i < Personalities.size(); ++i) |
Anton Korobeynikov | bbaf554 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 252 | if (Personalities[i] == Personality) |
| 253 | return; |
Reid Kleckner | e00faf8 | 2015-08-31 20:02:16 +0000 | [diff] [blame] | 254 | Personalities.push_back(Personality); |
Jim Laskey | 88dd2fd | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 255 | } |
| 256 | |
Matthias Braun | d0ee66c | 2016-12-01 19:32:15 +0000 | [diff] [blame] | 257 | /// \} |
Matthias Braun | 733fe36 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 258 | |
| 259 | MachineFunction &MachineModuleInfo::getMachineFunction(const Function &F) { |
| 260 | // Shortcut for the common case where a sequence of MachineFunctionPasses |
| 261 | // all query for the same Function. |
| 262 | if (LastRequest == &F) |
| 263 | return *LastResult; |
| 264 | |
| 265 | auto I = MachineFunctions.insert( |
| 266 | std::make_pair(&F, std::unique_ptr<MachineFunction>())); |
| 267 | MachineFunction *MF; |
| 268 | if (I.second) { |
| 269 | // No pre-existing machine function, create a new one. |
| 270 | MF = new MachineFunction(&F, TM, NextFnNum++, *this); |
| 271 | // Update the set entry. |
| 272 | I.first->second.reset(MF); |
| 273 | |
| 274 | if (MFInitializer) |
| 275 | if (MFInitializer->initializeMachineFunction(*MF)) |
| 276 | report_fatal_error("Unable to initialize machine function"); |
| 277 | } else { |
| 278 | MF = I.first->second.get(); |
| 279 | } |
| 280 | |
| 281 | LastRequest = &F; |
| 282 | LastResult = MF; |
| 283 | return *MF; |
| 284 | } |
| 285 | |
| 286 | void MachineModuleInfo::deleteMachineFunctionFor(Function &F) { |
| 287 | MachineFunctions.erase(&F); |
| 288 | LastRequest = nullptr; |
| 289 | LastResult = nullptr; |
| 290 | } |
| 291 | |
| 292 | namespace { |
| 293 | /// This pass frees the MachineFunction object associated with a Function. |
| 294 | class FreeMachineFunction : public FunctionPass { |
| 295 | public: |
| 296 | static char ID; |
| 297 | FreeMachineFunction() : FunctionPass(ID) {} |
| 298 | |
| 299 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
| 300 | AU.addRequired<MachineModuleInfo>(); |
| 301 | AU.addPreserved<MachineModuleInfo>(); |
| 302 | } |
| 303 | |
| 304 | bool runOnFunction(Function &F) override { |
| 305 | MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>(); |
| 306 | MMI.deleteMachineFunctionFor(F); |
| 307 | return true; |
| 308 | } |
Yaron Keren | 75fadfc | 2017-03-07 20:59:08 +0000 | [diff] [blame] | 309 | |
| 310 | StringRef getPassName() const override { |
| 311 | return "Free MachineFunction"; |
| 312 | } |
Matthias Braun | 733fe36 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 313 | }; |
| 314 | char FreeMachineFunction::ID; |
| 315 | } // end anonymous namespace |
| 316 | |
| 317 | namespace llvm { |
| 318 | FunctionPass *createFreeMachineFunctionPass() { |
| 319 | return new FreeMachineFunction(); |
| 320 | } |
| 321 | } // end namespace llvm |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 322 | |
| 323 | //===- MMI building helpers -----------------------------------------------===// |
| 324 | |
Ahmed Bougacha | bd6ce9a | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 325 | void llvm::computeUsesVAFloatArgument(const CallInst &I, |
| 326 | MachineModuleInfo &MMI) { |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 327 | FunctionType *FT = |
| 328 | cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0)); |
Ahmed Bougacha | bd6ce9a | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 329 | if (FT->isVarArg() && !MMI.usesVAFloatArgument()) { |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 330 | for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) { |
| 331 | Type *T = I.getArgOperand(i)->getType(); |
| 332 | for (auto i : post_order(T)) { |
| 333 | if (i->isFloatingPointTy()) { |
Ahmed Bougacha | bd6ce9a | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 334 | MMI.setUsesVAFloatArgument(true); |
Ahmed Bougacha | 456dce8 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 335 | return; |
| 336 | } |
| 337 | } |
| 338 | } |
| 339 | } |
| 340 | } |