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