Jim Laskey | 6da1864 | 2007-01-26 21:38:26 +0000 | [diff] [blame] | 1 | //===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// |
Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
Chris Lattner | 4ee451d | 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 | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 9 | |
Chandler Carruth | e3e43d9 | 2017-06-06 11:49:48 +0000 | [diff] [blame] | 10 | #include "llvm/CodeGen/MachineModuleInfo.h" |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 11 | #include "llvm/ADT/ArrayRef.h" |
| 12 | #include "llvm/ADT/DenseMap.h" |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 13 | #include "llvm/ADT/PostOrderIterator.h" |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 14 | #include "llvm/ADT/StringRef.h" |
Reid Kleckner | 595419d | 2015-11-17 21:10:25 +0000 | [diff] [blame] | 15 | #include "llvm/ADT/TinyPtrVector.h" |
Chandler Carruth | d04a8d4 | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 16 | #include "llvm/CodeGen/MachineFunction.h" |
Chandler Carruth | d04a8d4 | 2012-12-03 16:50:05 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/Passes.h" |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 18 | #include "llvm/IR/BasicBlock.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 19 | #include "llvm/IR/DerivedTypes.h" |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 20 | #include "llvm/IR/Instructions.h" |
Chandler Carruth | 0b8c9a8 | 2013-01-02 11:36:10 +0000 | [diff] [blame] | 21 | #include "llvm/IR/Module.h" |
Eugene Zelenko | 1d081e6 | 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 | 1611273 | 2010-03-14 01:41:15 +0000 | [diff] [blame] | 25 | #include "llvm/MC/MCSymbol.h" |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 26 | #include "llvm/Pass.h" |
| 27 | #include "llvm/Support/Casting.h" |
Torok Edwin | c25e758 | 2009-07-11 20:10:48 +0000 | [diff] [blame] | 28 | #include "llvm/Support/ErrorHandling.h" |
David Blaikie | fe42bd5 | 2018-03-23 23:58:19 +0000 | [diff] [blame] | 29 | #include "llvm/Target/TargetLoweringObjectFile.h" |
Matthias Braun | 43f89c5 | 2016-08-24 00:42:05 +0000 | [diff] [blame] | 30 | #include "llvm/Target/TargetMachine.h" |
Eugene Zelenko | 1d081e6 | 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 | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 37 | using namespace llvm; |
Jim Laskey | 9c4447a | 2006-03-01 20:39:36 +0000 | [diff] [blame] | 38 | using namespace llvm::dwarf; |
Jim Laskey | 6af5681 | 2006-01-04 13:36:38 +0000 | [diff] [blame] | 39 | |
Micah Villmow | 3574eca | 2012-10-08 16:38:25 +0000 | [diff] [blame] | 40 | // Handle the Pass registration stuff necessary to use DataLayout's. |
Francis Visoiu Mistrih | ae1c853 | 2017-05-18 17:21:13 +0000 | [diff] [blame] | 41 | INITIALIZE_PASS(MachineModuleInfo, "machinemoduleinfo", |
| 42 | "Machine Module Information", false, false) |
Devang Patel | 1997473 | 2007-05-03 01:11:54 +0000 | [diff] [blame] | 43 | char MachineModuleInfo::ID = 0; |
Jim Laskey | 063e765 | 2006-01-17 17:31:53 +0000 | [diff] [blame] | 44 | |
Chris Lattner | a70e2e3 | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 45 | // Out of line virtual method. |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 46 | MachineModuleInfoImpl::~MachineModuleInfoImpl() = default; |
Chris Lattner | a70e2e3 | 2009-09-15 22:44:26 +0000 | [diff] [blame] | 47 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 48 | namespace llvm { |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 49 | |
David Blaikie | c4423f0 | 2015-08-03 22:30:24 +0000 | [diff] [blame] | 50 | class MMIAddrLabelMapCallbackPtr final : CallbackVH { |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 51 | MMIAddrLabelMap *Map = nullptr; |
| 52 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 53 | public: |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 54 | MMIAddrLabelMapCallbackPtr() = default; |
| 55 | MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V) {} |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 56 | |
Chris Lattner | ea16ea5 | 2010-03-22 23:15:57 +0000 | [diff] [blame] | 57 | void setPtr(BasicBlock *BB) { |
| 58 | ValueHandleBase::operator=(BB); |
| 59 | } |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 60 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 61 | void setMap(MMIAddrLabelMap *map) { Map = map; } |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 62 | |
Craig Topper | 9f998de | 2014-03-07 09:26:03 +0000 | [diff] [blame] | 63 | void deleted() override; |
| 64 | void allUsesReplacedWith(Value *V2) override; |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 65 | }; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 66 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 67 | class MMIAddrLabelMap { |
| 68 | MCContext &Context; |
| 69 | struct AddrLabelSymEntry { |
Ahmed Bougacha | 8d35b78 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 70 | /// The symbols for the label. |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 71 | TinyPtrVector<MCSymbol *> Symbols; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 72 | |
Chris Lattner | 9cc0da9 | 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 | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 75 | }; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 76 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 77 | DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 78 | |
Ahmed Bougacha | 8d35b78 | 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 | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 81 | std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 82 | |
Ahmed Bougacha | 8d35b78 | 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 | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 86 | DenseMap<AssertingVH<Function>, std::vector<MCSymbol*>> |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 87 | DeletedAddrLabelsNeedingEmission; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 88 | |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 89 | public: |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 90 | MMIAddrLabelMap(MCContext &context) : Context(context) {} |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 91 | |
Chris Lattner | 9cc0da9 | 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 | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 96 | |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 97 | ArrayRef<MCSymbol *> getAddrLabelSymbolToEmit(BasicBlock *BB); |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 98 | |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 99 | void takeDeletedSymbolsForFunction(Function *F, |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 100 | std::vector<MCSymbol*> &Result); |
| 101 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 102 | void UpdateForDeletedBlock(BasicBlock *BB); |
| 103 | void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New); |
| 104 | }; |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 105 | |
| 106 | } // end namespace llvm |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 107 | |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 108 | ArrayRef<MCSymbol *> MMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) { |
Chris Lattner | 0220ba7 | 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 | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 112 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 113 | // If we already had an entry for this block, just return it. |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 114 | if (!Entry.Symbols.empty()) { |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 115 | assert(BB->getParent() == Entry.Fn && "Parent changed"); |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 116 | return Entry.Symbols; |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 117 | } |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 118 | |
Chris Lattner | 0220ba7 | 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 | 9589ff8 | 2015-05-29 19:43:39 +0000 | [diff] [blame] | 121 | BBCallbacks.emplace_back(BB); |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 122 | BBCallbacks.back().setMap(this); |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 123 | Entry.Index = BBCallbacks.size() - 1; |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 124 | Entry.Fn = BB->getParent(); |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 125 | Entry.Symbols.push_back(Context.createTempSymbol()); |
| 126 | return Entry.Symbols; |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 127 | } |
| 128 | |
Ahmed Bougacha | 8d35b78 | 2016-11-16 22:24:53 +0000 | [diff] [blame] | 129 | /// If we have any deleted symbols for F, return them. |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 130 | void MMIAddrLabelMap:: |
| 131 | takeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) { |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 132 | DenseMap<AssertingVH<Function>, std::vector<MCSymbol*>>::iterator I = |
Chris Lattner | 9cc0da9 | 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 | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 137 | |
Chris Lattner | 9cc0da9 | 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 | 0220ba7 | 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 | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 147 | AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]); |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 148 | AddrLabelSymbols.erase(BB); |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 149 | assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?"); |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 150 | BBCallbacks[Entry.Index] = nullptr; // Clear the callback. |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 151 | |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 152 | assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) && |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 153 | "Block/parent mismatch"); |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 154 | |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 155 | for (MCSymbol *Sym : Entry.Symbols) { |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 156 | if (Sym->isDefined()) |
| 157 | return; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 158 | |
Chris Lattner | 999aee2 | 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 | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 164 | } |
Chris Lattner | 0220ba7 | 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 | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 169 | AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]); |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 170 | AddrLabelSymbols.erase(Old); |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 171 | assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?"); |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 172 | |
| 173 | AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New]; |
| 174 | |
Chris Lattner | 0220ba7 | 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 | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 176 | if (NewEntry.Symbols.empty()) { |
Chris Lattner | ea16ea5 | 2010-03-22 23:15:57 +0000 | [diff] [blame] | 177 | BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback. |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 178 | NewEntry = std::move(OldEntry); // Set New's entry. |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 179 | return; |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 180 | } |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 181 | |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 182 | BBCallbacks[OldEntry.Index] = nullptr; // Update the callback. |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 183 | |
Benjamin Kramer | 17d7215 | 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 | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 187 | } |
| 188 | |
Chris Lattner | 0220ba7 | 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 | 51c2c7a | 2018-11-05 23:49:13 +0000 | [diff] [blame] | 197 | MachineModuleInfo::MachineModuleInfo(const LLVMTargetMachine *TM) |
Matthias Braun | fa5c5c7 | 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 | 081c34b | 2010-10-19 17:21:58 +0000 | [diff] [blame] | 201 | initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); |
Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 202 | } |
Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 203 | |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 204 | MachineModuleInfo::~MachineModuleInfo() = default; |
Michael J. Spencer | e70c526 | 2010-10-16 08:25:21 +0000 | [diff] [blame] | 205 | |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 206 | bool MachineModuleInfo::doInitialization(Module &M) { |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 207 | ObjFileMMI = nullptr; |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 208 | CurCallSite = 0; |
Matthias Braun | 08b668a | 2018-10-31 17:18:41 +0000 | [diff] [blame] | 209 | UsesVAFloatArgument = UsesMorestackAddr = false; |
Than McIntosh | 3962d56 | 2017-09-27 19:34:00 +0000 | [diff] [blame] | 210 | HasSplitStack = HasNosplitStack = false; |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 211 | AddrLabelSymbols = nullptr; |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 212 | TheModule = &M; |
Matthias Braun | 08b668a | 2018-10-31 17:18:41 +0000 | [diff] [blame] | 213 | DbgInfoAvailable = !empty(M.debug_compile_units()); |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 214 | return false; |
| 215 | } |
| 216 | |
| 217 | bool MachineModuleInfo::doFinalization(Module &M) { |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 218 | Personalities.clear(); |
| 219 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 220 | delete AddrLabelSymbols; |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 221 | AddrLabelSymbols = nullptr; |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 222 | |
Pedro Artigas | 5399d25 | 2012-12-12 22:59:46 +0000 | [diff] [blame] | 223 | Context.reset(); |
Pedro Artigas | 873a1dd | 2012-12-06 22:12:44 +0000 | [diff] [blame] | 224 | |
Pedro Artigas | b9d1005 | 2013-01-04 18:04:42 +0000 | [diff] [blame] | 225 | delete ObjFileMMI; |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 226 | ObjFileMMI = nullptr; |
Pedro Artigas | b9d1005 | 2013-01-04 18:04:42 +0000 | [diff] [blame] | 227 | |
Pedro Artigas | d1abec3 | 2012-12-05 17:12:22 +0000 | [diff] [blame] | 228 | return false; |
Jim Laskey | b3e789a | 2006-01-26 20:21:46 +0000 | [diff] [blame] | 229 | } |
| 230 | |
Chris Lattner | 0220ba7 | 2010-03-15 19:09:43 +0000 | [diff] [blame] | 231 | //===- Address of Block Management ----------------------------------------===// |
| 232 | |
Benjamin Kramer | 17d7215 | 2015-06-29 20:21:55 +0000 | [diff] [blame] | 233 | ArrayRef<MCSymbol *> |
| 234 | MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) { |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 235 | // Lazily create AddrLabelSymbols. |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 236 | if (!AddrLabelSymbols) |
Chris Lattner | 999aee2 | 2010-03-16 00:29:39 +0000 | [diff] [blame] | 237 | AddrLabelSymbols = new MMIAddrLabelMap(Context); |
| 238 | return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB)); |
| 239 | } |
| 240 | |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 241 | void MachineModuleInfo:: |
| 242 | takeDeletedSymbolsForFunction(const Function *F, |
| 243 | std::vector<MCSymbol*> &Result) { |
| 244 | // If no blocks have had their addresses taken, we're done. |
Craig Topper | 4ba8443 | 2014-04-14 00:51:57 +0000 | [diff] [blame] | 245 | if (!AddrLabelSymbols) return; |
Chris Lattner | 9cc0da9 | 2010-03-15 20:39:00 +0000 | [diff] [blame] | 246 | return AddrLabelSymbols-> |
| 247 | takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result); |
| 248 | } |
Chris Lattner | 3b9d621 | 2010-03-14 17:53:23 +0000 | [diff] [blame] | 249 | |
Matthias Braun | 347847b | 2016-12-01 19:32:15 +0000 | [diff] [blame] | 250 | /// \name Exception Handling |
| 251 | /// \{ |
Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 252 | |
Keno Fischer | 890c166 | 2015-07-14 19:22:51 +0000 | [diff] [blame] | 253 | void MachineModuleInfo::addPersonality(const Function *Personality) { |
Bill Wendling | 10fff60 | 2008-07-03 22:53:42 +0000 | [diff] [blame] | 254 | for (unsigned i = 0; i < Personalities.size(); ++i) |
Anton Korobeynikov | 8c7c173 | 2007-05-13 15:42:26 +0000 | [diff] [blame] | 255 | if (Personalities[i] == Personality) |
| 256 | return; |
Reid Kleckner | 7174af9 | 2015-08-31 20:02:16 +0000 | [diff] [blame] | 257 | Personalities.push_back(Personality); |
Jim Laskey | 59667fe | 2007-02-21 22:38:31 +0000 | [diff] [blame] | 258 | } |
| 259 | |
Matthias Braun | 347847b | 2016-12-01 19:32:15 +0000 | [diff] [blame] | 260 | /// \} |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 261 | |
Matthias Braun | 2144c52 | 2017-06-06 00:44:35 +0000 | [diff] [blame] | 262 | MachineFunction * |
| 263 | MachineModuleInfo::getMachineFunction(const Function &F) const { |
| 264 | auto I = MachineFunctions.find(&F); |
| 265 | return I != MachineFunctions.end() ? I->second.get() : nullptr; |
| 266 | } |
| 267 | |
| 268 | MachineFunction & |
| 269 | MachineModuleInfo::getOrCreateMachineFunction(const Function &F) { |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 270 | // Shortcut for the common case where a sequence of MachineFunctionPasses |
| 271 | // all query for the same Function. |
| 272 | if (LastRequest == &F) |
| 273 | return *LastResult; |
| 274 | |
| 275 | auto I = MachineFunctions.insert( |
| 276 | std::make_pair(&F, std::unique_ptr<MachineFunction>())); |
| 277 | MachineFunction *MF; |
| 278 | if (I.second) { |
| 279 | // No pre-existing machine function, create a new one. |
Matthias Braun | dfcb4f5 | 2017-12-15 22:22:46 +0000 | [diff] [blame] | 280 | const TargetSubtargetInfo &STI = *TM.getSubtargetImpl(F); |
| 281 | MF = new MachineFunction(F, TM, STI, NextFnNum++, *this); |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 282 | // Update the set entry. |
| 283 | I.first->second.reset(MF); |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 284 | } else { |
| 285 | MF = I.first->second.get(); |
| 286 | } |
| 287 | |
| 288 | LastRequest = &F; |
| 289 | LastResult = MF; |
| 290 | return *MF; |
| 291 | } |
| 292 | |
| 293 | void MachineModuleInfo::deleteMachineFunctionFor(Function &F) { |
| 294 | MachineFunctions.erase(&F); |
| 295 | LastRequest = nullptr; |
| 296 | LastResult = nullptr; |
| 297 | } |
| 298 | |
| 299 | namespace { |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 300 | |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 301 | /// This pass frees the MachineFunction object associated with a Function. |
| 302 | class FreeMachineFunction : public FunctionPass { |
| 303 | public: |
| 304 | static char ID; |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 305 | |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 306 | FreeMachineFunction() : FunctionPass(ID) {} |
| 307 | |
| 308 | void getAnalysisUsage(AnalysisUsage &AU) const override { |
| 309 | AU.addRequired<MachineModuleInfo>(); |
| 310 | AU.addPreserved<MachineModuleInfo>(); |
| 311 | } |
| 312 | |
| 313 | bool runOnFunction(Function &F) override { |
| 314 | MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>(); |
| 315 | MMI.deleteMachineFunctionFor(F); |
| 316 | return true; |
| 317 | } |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 318 | |
Yaron Keren | debb02e | 2017-03-07 20:59:08 +0000 | [diff] [blame] | 319 | StringRef getPassName() const override { |
| 320 | return "Free MachineFunction"; |
Fangrui Song | af7b183 | 2018-07-30 19:41:25 +0000 | [diff] [blame] | 321 | } |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 322 | }; |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 323 | |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 324 | } // end anonymous namespace |
| 325 | |
Eugene Zelenko | 1d081e6 | 2017-05-31 01:10:10 +0000 | [diff] [blame] | 326 | char FreeMachineFunction::ID; |
| 327 | |
| 328 | FunctionPass *llvm::createFreeMachineFunctionPass() { |
Matthias Braun | fa5c5c7 | 2016-08-24 01:52:46 +0000 | [diff] [blame] | 329 | return new FreeMachineFunction(); |
| 330 | } |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 331 | |
| 332 | //===- MMI building helpers -----------------------------------------------===// |
| 333 | |
Ahmed Bougacha | 03cebfb | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 334 | void llvm::computeUsesVAFloatArgument(const CallInst &I, |
| 335 | MachineModuleInfo &MMI) { |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 336 | FunctionType *FT = |
| 337 | cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0)); |
Ahmed Bougacha | 03cebfb | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 338 | if (FT->isVarArg() && !MMI.usesVAFloatArgument()) { |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 339 | for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) { |
| 340 | Type *T = I.getArgOperand(i)->getType(); |
| 341 | for (auto i : post_order(T)) { |
| 342 | if (i->isFloatingPointTy()) { |
Ahmed Bougacha | 03cebfb | 2016-11-16 22:25:03 +0000 | [diff] [blame] | 343 | MMI.setUsesVAFloatArgument(true); |
Ahmed Bougacha | f522e20 | 2016-11-16 22:24:56 +0000 | [diff] [blame] | 344 | return; |
| 345 | } |
| 346 | } |
| 347 | } |
| 348 | } |
| 349 | } |