1 //===-- llvm/CodeGen/MachineModuleInfo.cpp ----------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "llvm/CodeGen/MachineModuleInfo.h" 11 #include "llvm/ADT/ArrayRef.h" 12 #include "llvm/ADT/DenseMap.h" 13 #include "llvm/ADT/PostOrderIterator.h" 14 #include "llvm/ADT/StringRef.h" 15 #include "llvm/ADT/TinyPtrVector.h" 16 #include "llvm/CodeGen/MachineFunction.h" 17 #include "llvm/CodeGen/Passes.h" 18 #include "llvm/IR/BasicBlock.h" 19 #include "llvm/IR/DebugInfo.h" 20 #include "llvm/IR/DerivedTypes.h" 21 #include "llvm/IR/Instructions.h" 22 #include "llvm/IR/Module.h" 23 #include "llvm/IR/Value.h" 24 #include "llvm/IR/ValueHandle.h" 25 #include "llvm/MC/MCContext.h" 26 #include "llvm/MC/MCSymbol.h" 27 #include "llvm/Pass.h" 28 #include "llvm/Support/Casting.h" 29 #include "llvm/Support/ErrorHandling.h" 30 #include "llvm/Target/TargetLoweringObjectFile.h" 31 #include "llvm/Target/TargetMachine.h" 32 #include <algorithm> 33 #include <cassert> 34 #include <memory> 35 #include <utility> 36 #include <vector> 37 38 using namespace llvm; 39 using namespace llvm::dwarf; 40 41 // Handle the Pass registration stuff necessary to use DataLayout's. 42 INITIALIZE_PASS(MachineModuleInfo, "machinemoduleinfo", 43 "Machine Module Information", false, false) 44 char MachineModuleInfo::ID = 0; 45 46 // Out of line virtual method. 47 MachineModuleInfoImpl::~MachineModuleInfoImpl() = default; 48 49 namespace llvm { 50 51 class MMIAddrLabelMapCallbackPtr final : CallbackVH { 52 MMIAddrLabelMap *Map = nullptr; 53 54 public: 55 MMIAddrLabelMapCallbackPtr() = default; 56 MMIAddrLabelMapCallbackPtr(Value *V) : CallbackVH(V) {} 57 58 void setPtr(BasicBlock *BB) { 59 ValueHandleBase::operator=(BB); 60 } 61 62 void setMap(MMIAddrLabelMap *map) { Map = map; } 63 64 void deleted() override; 65 void allUsesReplacedWith(Value *V2) override; 66 }; 67 68 class MMIAddrLabelMap { 69 MCContext &Context; 70 struct AddrLabelSymEntry { 71 /// The symbols for the label. 72 TinyPtrVector<MCSymbol *> Symbols; 73 74 Function *Fn; // The containing function of the BasicBlock. 75 unsigned Index; // The index in BBCallbacks for the BasicBlock. 76 }; 77 78 DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; 79 80 /// Callbacks for the BasicBlock's that we have entries for. We use this so 81 /// we get notified if a block is deleted or RAUWd. 82 std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; 83 84 /// This is a per-function list of symbols whose corresponding BasicBlock got 85 /// deleted. These symbols need to be emitted at some point in the file, so 86 /// AsmPrinter emits them after the function body. 87 DenseMap<AssertingVH<Function>, std::vector<MCSymbol*>> 88 DeletedAddrLabelsNeedingEmission; 89 90 public: 91 MMIAddrLabelMap(MCContext &context) : Context(context) {} 92 93 ~MMIAddrLabelMap() { 94 assert(DeletedAddrLabelsNeedingEmission.empty() && 95 "Some labels for deleted blocks never got emitted"); 96 } 97 98 ArrayRef<MCSymbol *> getAddrLabelSymbolToEmit(BasicBlock *BB); 99 100 void takeDeletedSymbolsForFunction(Function *F, 101 std::vector<MCSymbol*> &Result); 102 103 void UpdateForDeletedBlock(BasicBlock *BB); 104 void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New); 105 }; 106 107 } // end namespace llvm 108 109 ArrayRef<MCSymbol *> MMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) { 110 assert(BB->hasAddressTaken() && 111 "Shouldn't get label for block without address taken"); 112 AddrLabelSymEntry &Entry = AddrLabelSymbols[BB]; 113 114 // If we already had an entry for this block, just return it. 115 if (!Entry.Symbols.empty()) { 116 assert(BB->getParent() == Entry.Fn && "Parent changed"); 117 return Entry.Symbols; 118 } 119 120 // Otherwise, this is a new entry, create a new symbol for it and add an 121 // entry to BBCallbacks so we can be notified if the BB is deleted or RAUWd. 122 BBCallbacks.emplace_back(BB); 123 BBCallbacks.back().setMap(this); 124 Entry.Index = BBCallbacks.size() - 1; 125 Entry.Fn = BB->getParent(); 126 Entry.Symbols.push_back(Context.createTempSymbol()); 127 return Entry.Symbols; 128 } 129 130 /// If we have any deleted symbols for F, return them. 131 void MMIAddrLabelMap:: 132 takeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) { 133 DenseMap<AssertingVH<Function>, std::vector<MCSymbol*>>::iterator I = 134 DeletedAddrLabelsNeedingEmission.find(F); 135 136 // If there are no entries for the function, just return. 137 if (I == DeletedAddrLabelsNeedingEmission.end()) return; 138 139 // Otherwise, take the list. 140 std::swap(Result, I->second); 141 DeletedAddrLabelsNeedingEmission.erase(I); 142 } 143 144 void MMIAddrLabelMap::UpdateForDeletedBlock(BasicBlock *BB) { 145 // If the block got deleted, there is no need for the symbol. If the symbol 146 // was already emitted, we can just forget about it, otherwise we need to 147 // queue it up for later emission when the function is output. 148 AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]); 149 AddrLabelSymbols.erase(BB); 150 assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?"); 151 BBCallbacks[Entry.Index] = nullptr; // Clear the callback. 152 153 assert((BB->getParent() == nullptr || BB->getParent() == Entry.Fn) && 154 "Block/parent mismatch"); 155 156 for (MCSymbol *Sym : Entry.Symbols) { 157 if (Sym->isDefined()) 158 return; 159 160 // If the block is not yet defined, we need to emit it at the end of the 161 // function. Add the symbol to the DeletedAddrLabelsNeedingEmission list 162 // for the containing Function. Since the block is being deleted, its 163 // parent may already be removed, we have to get the function from 'Entry'. 164 DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym); 165 } 166 } 167 168 void MMIAddrLabelMap::UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New) { 169 // Get the entry for the RAUW'd block and remove it from our map. 170 AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]); 171 AddrLabelSymbols.erase(Old); 172 assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?"); 173 174 AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New]; 175 176 // If New is not address taken, just move our symbol over to it. 177 if (NewEntry.Symbols.empty()) { 178 BBCallbacks[OldEntry.Index].setPtr(New); // Update the callback. 179 NewEntry = std::move(OldEntry); // Set New's entry. 180 return; 181 } 182 183 BBCallbacks[OldEntry.Index] = nullptr; // Update the callback. 184 185 // Otherwise, we need to add the old symbols to the new block's set. 186 NewEntry.Symbols.insert(NewEntry.Symbols.end(), OldEntry.Symbols.begin(), 187 OldEntry.Symbols.end()); 188 } 189 190 void MMIAddrLabelMapCallbackPtr::deleted() { 191 Map->UpdateForDeletedBlock(cast<BasicBlock>(getValPtr())); 192 } 193 194 void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) { 195 Map->UpdateForRAUWBlock(cast<BasicBlock>(getValPtr()), cast<BasicBlock>(V2)); 196 } 197 198 MachineModuleInfo::MachineModuleInfo(const TargetMachine *TM) 199 : ImmutablePass(ID), TM(*TM), 200 Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(), 201 TM->getObjFileLowering(), nullptr, false) { 202 initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry()); 203 } 204 205 MachineModuleInfo::~MachineModuleInfo() = default; 206 207 bool MachineModuleInfo::doInitialization(Module &M) { 208 ObjFileMMI = nullptr; 209 CurCallSite = 0; 210 DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false; 211 AddrLabelSymbols = nullptr; 212 TheModule = &M; 213 if (getDebugMetadataVersionFromModule(M)) 214 M.getOrInsertNamedMetadata("llvm.dbg.mir"); 215 return false; 216 } 217 218 bool MachineModuleInfo::doFinalization(Module &M) { 219 Personalities.clear(); 220 221 delete AddrLabelSymbols; 222 AddrLabelSymbols = nullptr; 223 224 Context.reset(); 225 226 delete ObjFileMMI; 227 ObjFileMMI = nullptr; 228 229 return false; 230 } 231 232 //===- Address of Block Management ----------------------------------------===// 233 234 ArrayRef<MCSymbol *> 235 MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) { 236 // Lazily create AddrLabelSymbols. 237 if (!AddrLabelSymbols) 238 AddrLabelSymbols = new MMIAddrLabelMap(Context); 239 return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB)); 240 } 241 242 void MachineModuleInfo:: 243 takeDeletedSymbolsForFunction(const Function *F, 244 std::vector<MCSymbol*> &Result) { 245 // If no blocks have had their addresses taken, we're done. 246 if (!AddrLabelSymbols) return; 247 return AddrLabelSymbols-> 248 takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result); 249 } 250 251 /// \name Exception Handling 252 /// \{ 253 254 void MachineModuleInfo::addPersonality(const Function *Personality) { 255 for (unsigned i = 0; i < Personalities.size(); ++i) 256 if (Personalities[i] == Personality) 257 return; 258 Personalities.push_back(Personality); 259 } 260 261 /// \} 262 263 MachineFunction * 264 MachineModuleInfo::getMachineFunction(const Function &F) const { 265 auto I = MachineFunctions.find(&F); 266 return I != MachineFunctions.end() ? I->second.get() : nullptr; 267 } 268 269 MachineFunction & 270 MachineModuleInfo::getOrCreateMachineFunction(const Function &F) { 271 // Shortcut for the common case where a sequence of MachineFunctionPasses 272 // all query for the same Function. 273 if (LastRequest == &F) 274 return *LastResult; 275 276 auto I = MachineFunctions.insert( 277 std::make_pair(&F, std::unique_ptr<MachineFunction>())); 278 MachineFunction *MF; 279 if (I.second) { 280 // No pre-existing machine function, create a new one. 281 MF = new MachineFunction(&F, TM, NextFnNum++, *this); 282 // Update the set entry. 283 I.first->second.reset(MF); 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 { 300 301 /// This pass frees the MachineFunction object associated with a Function. 302 class FreeMachineFunction : public FunctionPass { 303 public: 304 static char ID; 305 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 } 318 319 StringRef getPassName() const override { 320 return "Free MachineFunction"; 321 } 322 }; 323 324 } // end anonymous namespace 325 326 char FreeMachineFunction::ID; 327 328 FunctionPass *llvm::createFreeMachineFunctionPass() { 329 return new FreeMachineFunction(); 330 } 331 332 //===- MMI building helpers -----------------------------------------------===// 333 334 void llvm::computeUsesVAFloatArgument(const CallInst &I, 335 MachineModuleInfo &MMI) { 336 FunctionType *FT = 337 cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0)); 338 if (FT->isVarArg() && !MMI.usesVAFloatArgument()) { 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()) { 343 MMI.setUsesVAFloatArgument(true); 344 return; 345 } 346 } 347 } 348 } 349 } 350