diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-01-02 19:17:04 +0000 | 
| commit | b915e9e0fc85ba6f398b3fab0db6a81a8913af94 (patch) | |
| tree | 98b8f811c7aff2547cab8642daf372d6c59502fb /lib/CodeGen/MachineModuleInfo.cpp | |
| parent | 6421cca32f69ac849537a3cff78c352195e99f1b (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineModuleInfo.cpp')
| -rw-r--r-- | lib/CodeGen/MachineModuleInfo.cpp | 305 | 
1 files changed, 89 insertions, 216 deletions
| diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index 244e3fbc4e8f..6618857477ed 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -9,26 +9,31 @@  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/ADT/PointerUnion.h" +#include "llvm/ADT/PostOrderIterator.h"  #include "llvm/ADT/TinyPtrVector.h"  #include "llvm/Analysis/EHPersonalities.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionInitializer.h"  #include "llvm/CodeGen/MachineFunctionPass.h"  #include "llvm/CodeGen/Passes.h"  #include "llvm/IR/Constants.h"  #include "llvm/IR/DerivedTypes.h"  #include "llvm/IR/GlobalVariable.h" +#include "llvm/IR/Instructions.h"  #include "llvm/IR/Module.h"  #include "llvm/MC/MCObjectFileInfo.h"  #include "llvm/MC/MCSymbol.h"  #include "llvm/Support/Dwarf.h"  #include "llvm/Support/ErrorHandling.h" +#include "llvm/Target/TargetLoweringObjectFile.h" +#include "llvm/Target/TargetMachine.h"  using namespace llvm;  using namespace llvm::dwarf;  // Handle the Pass registration stuff necessary to use DataLayout's. -INITIALIZE_PASS(MachineModuleInfo, "machinemoduleinfo", -                "Machine Module Information", false, false) +INITIALIZE_TM_PASS(MachineModuleInfo, "machinemoduleinfo", +                   "Machine Module Information", false, false)  char MachineModuleInfo::ID = 0;  // Out of line virtual method. @@ -54,7 +59,7 @@ public:  class MMIAddrLabelMap {    MCContext &Context;    struct AddrLabelSymEntry { -    /// Symbols - The symbols for the label. +    /// The symbols for the label.      TinyPtrVector<MCSymbol *> Symbols;      Function *Fn;   // The containing function of the BasicBlock. @@ -63,14 +68,13 @@ class MMIAddrLabelMap {    DenseMap<AssertingVH<BasicBlock>, AddrLabelSymEntry> AddrLabelSymbols; -  /// BBCallbacks - Callbacks for the BasicBlock's that we have entries for.  We -  /// use this so we get notified if a block is deleted or RAUWd. +  /// Callbacks for the BasicBlock's that we have entries for.  We use this so +  /// we get notified if a block is deleted or RAUWd.    std::vector<MMIAddrLabelMapCallbackPtr> BBCallbacks; -  /// DeletedAddrLabelsNeedingEmission - This is a per-function list of symbols -  /// whose corresponding BasicBlock got deleted.  These symbols need to be -  /// emitted at some point in the file, so AsmPrinter emits them after the -  /// function body. +  /// This is a per-function list of symbols whose corresponding BasicBlock got +  /// deleted.  These symbols need to be emitted at some point in the file, so +  /// AsmPrinter emits them after the function body.    DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >      DeletedAddrLabelsNeedingEmission;  public: @@ -112,8 +116,7 @@ ArrayRef<MCSymbol *> MMIAddrLabelMap::getAddrLabelSymbolToEmit(BasicBlock *BB) {    return Entry.Symbols;  } -/// takeDeletedSymbolsForFunction - If we have any deleted symbols for F, return -/// them. +/// If we have any deleted symbols for F, return them.  void MMIAddrLabelMap::  takeDeletedSymbolsForFunction(Function *F, std::vector<MCSymbol*> &Result) {    DenseMap<AssertingVH<Function>, std::vector<MCSymbol*> >::iterator I = @@ -186,20 +189,13 @@ void MMIAddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {  //===----------------------------------------------------------------------===// -MachineModuleInfo::MachineModuleInfo(const MCAsmInfo &MAI, -                                     const MCRegisterInfo &MRI, -                                     const MCObjectFileInfo *MOFI) -  : ImmutablePass(ID), Context(&MAI, &MRI, MOFI, nullptr, false) { +MachineModuleInfo::MachineModuleInfo(const TargetMachine *TM) +  : ImmutablePass(ID), TM(*TM), +    Context(TM->getMCAsmInfo(), TM->getMCRegisterInfo(), +            TM->getObjFileLowering(), nullptr, false) {    initializeMachineModuleInfoPass(*PassRegistry::getPassRegistry());  } -MachineModuleInfo::MachineModuleInfo() -  : ImmutablePass(ID), Context(nullptr, nullptr, nullptr) { -  llvm_unreachable("This MachineModuleInfo constructor should never be called, " -                   "MMI should always be explicitly constructed by " -                   "LLVMTargetMachine"); -} -  MachineModuleInfo::~MachineModuleInfo() {  } @@ -207,13 +203,9 @@ bool MachineModuleInfo::doInitialization(Module &M) {    ObjFileMMI = nullptr;    CurCallSite = 0; -  CallsEHReturn = false; -  CallsUnwindInit = false; -  HasEHFunclets = false;    DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false; -  PersonalityTypeCache = EHPersonality::Unknown;    AddrLabelSymbols = nullptr; -  TheModule = nullptr; +  TheModule = &M;    return false;  } @@ -233,30 +225,8 @@ bool MachineModuleInfo::doFinalization(Module &M) {    return false;  } -/// EndFunction - Discard function meta information. -/// -void MachineModuleInfo::EndFunction() { -  // Clean up frame info. -  FrameInstructions.clear(); - -  // Clean up exception info. -  LandingPads.clear(); -  PersonalityTypeCache = EHPersonality::Unknown; -  CallSiteMap.clear(); -  TypeInfos.clear(); -  FilterIds.clear(); -  FilterEnds.clear(); -  CallsEHReturn = false; -  CallsUnwindInit = false; -  HasEHFunclets = false; -  VariableDbgInfos.clear(); -} -  //===- Address of Block Management ----------------------------------------===// -/// getAddrLabelSymbolToEmit - Return the symbol to be used for the specified -/// basic block when its address is taken.  If other blocks were RAUW'd to -/// this one, we may have to emit them as well, return the whole set.  ArrayRef<MCSymbol *>  MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) {    // Lazily create AddrLabelSymbols. @@ -265,11 +235,6 @@ MachineModuleInfo::getAddrLabelSymbolToEmit(const BasicBlock *BB) {   return AddrLabelSymbols->getAddrLabelSymbolToEmit(const_cast<BasicBlock*>(BB));  } - -/// takeDeletedSymbolsForFunction - If the specified function has had any -/// references to address-taken blocks generated, but the block got deleted, -/// return the symbol now so we can emit it.  This prevents emitting a -/// reference to a symbol that has no definition.  void MachineModuleInfo::  takeDeletedSymbolsForFunction(const Function *F,                                std::vector<MCSymbol*> &Result) { @@ -279,40 +244,8 @@ takeDeletedSymbolsForFunction(const Function *F,       takeDeletedSymbolsForFunction(const_cast<Function*>(F), Result);  } -//===- EH -----------------------------------------------------------------===// - -/// getOrCreateLandingPadInfo - Find or create an LandingPadInfo for the -/// specified MachineBasicBlock. -LandingPadInfo &MachineModuleInfo::getOrCreateLandingPadInfo -    (MachineBasicBlock *LandingPad) { -  unsigned N = LandingPads.size(); -  for (unsigned i = 0; i < N; ++i) { -    LandingPadInfo &LP = LandingPads[i]; -    if (LP.LandingPadBlock == LandingPad) -      return LP; -  } - -  LandingPads.push_back(LandingPadInfo(LandingPad)); -  return LandingPads[N]; -} - -/// addInvoke - Provide the begin and end labels of an invoke style call and -/// associate it with a try landing pad block. -void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad, -                                  MCSymbol *BeginLabel, MCSymbol *EndLabel) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  LP.BeginLabels.push_back(BeginLabel); -  LP.EndLabels.push_back(EndLabel); -} - -/// addLandingPad - Provide the label of a try LandingPad block. -/// -MCSymbol *MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { -  MCSymbol *LandingPadLabel = Context.createTempSymbol(); -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  LP.LandingPadLabel = LandingPadLabel; -  return LandingPadLabel; -} +/// \name Exception Handling +/// \{  void MachineModuleInfo::addPersonality(const Function *Personality) {    for (unsigned i = 0; i < Personalities.size(); ++i) @@ -321,143 +254,83 @@ void MachineModuleInfo::addPersonality(const Function *Personality) {    Personalities.push_back(Personality);  } -/// addCatchTypeInfo - Provide the catch typeinfo for a landing pad. -/// -void MachineModuleInfo:: -addCatchTypeInfo(MachineBasicBlock *LandingPad, -                 ArrayRef<const GlobalValue *> TyInfo) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  for (unsigned N = TyInfo.size(); N; --N) -    LP.TypeIds.push_back(getTypeIDFor(TyInfo[N - 1])); -} - -/// addFilterTypeInfo - Provide the filter typeinfo for a landing pad. -/// -void MachineModuleInfo:: -addFilterTypeInfo(MachineBasicBlock *LandingPad, -                  ArrayRef<const GlobalValue *> TyInfo) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  std::vector<unsigned> IdsInFilter(TyInfo.size()); -  for (unsigned I = 0, E = TyInfo.size(); I != E; ++I) -    IdsInFilter[I] = getTypeIDFor(TyInfo[I]); -  LP.TypeIds.push_back(getFilterIDFor(IdsInFilter)); -} - -/// addCleanup - Add a cleanup action for a landing pad. -/// -void MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  LP.TypeIds.push_back(0); -} +/// \} + +MachineFunction &MachineModuleInfo::getMachineFunction(const Function &F) { +  // Shortcut for the common case where a sequence of MachineFunctionPasses +  // all query for the same Function. +  if (LastRequest == &F) +    return *LastResult; + +  auto I = MachineFunctions.insert( +      std::make_pair(&F, std::unique_ptr<MachineFunction>())); +  MachineFunction *MF; +  if (I.second) { +    // No pre-existing machine function, create a new one. +    MF = new MachineFunction(&F, TM, NextFnNum++, *this); +    // Update the set entry. +    I.first->second.reset(MF); + +    if (MFInitializer) +      if (MFInitializer->initializeMachineFunction(*MF)) +        report_fatal_error("Unable to initialize machine function"); +  } else { +    MF = I.first->second.get(); +  } -void MachineModuleInfo::addSEHCatchHandler(MachineBasicBlock *LandingPad, -                                           const Function *Filter, -                                           const BlockAddress *RecoverBA) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  SEHHandler Handler; -  Handler.FilterOrFinally = Filter; -  Handler.RecoverBA = RecoverBA; -  LP.SEHHandlers.push_back(Handler); +  LastRequest = &F; +  LastResult = MF; +  return *MF;  } -void MachineModuleInfo::addSEHCleanupHandler(MachineBasicBlock *LandingPad, -                                             const Function *Cleanup) { -  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); -  SEHHandler Handler; -  Handler.FilterOrFinally = Cleanup; -  Handler.RecoverBA = nullptr; -  LP.SEHHandlers.push_back(Handler); +void MachineModuleInfo::deleteMachineFunctionFor(Function &F) { +  MachineFunctions.erase(&F); +  LastRequest = nullptr; +  LastResult = nullptr;  } -/// TidyLandingPads - Remap landing pad labels and remove any deleted landing -/// pads. -void MachineModuleInfo::TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap) { -  for (unsigned i = 0; i != LandingPads.size(); ) { -    LandingPadInfo &LandingPad = LandingPads[i]; -    if (LandingPad.LandingPadLabel && -        !LandingPad.LandingPadLabel->isDefined() && -        (!LPMap || (*LPMap)[LandingPad.LandingPadLabel] == 0)) -      LandingPad.LandingPadLabel = nullptr; - -    // Special case: we *should* emit LPs with null LP MBB. This indicates -    // "nounwind" case. -    if (!LandingPad.LandingPadLabel && LandingPad.LandingPadBlock) { -      LandingPads.erase(LandingPads.begin() + i); -      continue; -    } - -    for (unsigned j = 0, e = LandingPads[i].BeginLabels.size(); j != e; ++j) { -      MCSymbol *BeginLabel = LandingPad.BeginLabels[j]; -      MCSymbol *EndLabel = LandingPad.EndLabels[j]; -      if ((BeginLabel->isDefined() || -           (LPMap && (*LPMap)[BeginLabel] != 0)) && -          (EndLabel->isDefined() || -           (LPMap && (*LPMap)[EndLabel] != 0))) continue; - -      LandingPad.BeginLabels.erase(LandingPad.BeginLabels.begin() + j); -      LandingPad.EndLabels.erase(LandingPad.EndLabels.begin() + j); -      --j; -      --e; -    } - -    // Remove landing pads with no try-ranges. -    if (LandingPads[i].BeginLabels.empty()) { -      LandingPads.erase(LandingPads.begin() + i); -      continue; -    } +namespace { +/// This pass frees the MachineFunction object associated with a Function. +class FreeMachineFunction : public FunctionPass { +public: +  static char ID; +  FreeMachineFunction() : FunctionPass(ID) {} -    // If there is no landing pad, ensure that the list of typeids is empty. -    // If the only typeid is a cleanup, this is the same as having no typeids. -    if (!LandingPad.LandingPadBlock || -        (LandingPad.TypeIds.size() == 1 && !LandingPad.TypeIds[0])) -      LandingPad.TypeIds.clear(); -    ++i; +  void getAnalysisUsage(AnalysisUsage &AU) const override { +    AU.addRequired<MachineModuleInfo>(); +    AU.addPreserved<MachineModuleInfo>();    } -} -/// setCallSiteLandingPad - Map the landing pad's EH symbol to the call site -/// indexes. -void MachineModuleInfo::setCallSiteLandingPad(MCSymbol *Sym, -                                              ArrayRef<unsigned> Sites) { -  LPadToCallSiteMap[Sym].append(Sites.begin(), Sites.end()); -} - -/// getTypeIDFor - Return the type id for the specified typeinfo.  This is -/// function wide. -unsigned MachineModuleInfo::getTypeIDFor(const GlobalValue *TI) { -  for (unsigned i = 0, N = TypeInfos.size(); i != N; ++i) -    if (TypeInfos[i] == TI) return i + 1; +  bool runOnFunction(Function &F) override { +    MachineModuleInfo &MMI = getAnalysis<MachineModuleInfo>(); +    MMI.deleteMachineFunctionFor(F); +    return true; +  } +}; +char FreeMachineFunction::ID; +} // end anonymous namespace -  TypeInfos.push_back(TI); -  return TypeInfos.size(); +namespace llvm { +FunctionPass *createFreeMachineFunctionPass() { +  return new FreeMachineFunction();  } - -/// getFilterIDFor - Return the filter id for the specified typeinfos.  This is -/// function wide. -int MachineModuleInfo::getFilterIDFor(std::vector<unsigned> &TyIds) { -  // If the new filter coincides with the tail of an existing filter, then -  // re-use the existing filter.  Folding filters more than this requires -  // re-ordering filters and/or their elements - probably not worth it. -  for (std::vector<unsigned>::iterator I = FilterEnds.begin(), -       E = FilterEnds.end(); I != E; ++I) { -    unsigned i = *I, j = TyIds.size(); - -    while (i && j) -      if (FilterIds[--i] != TyIds[--j]) -        goto try_next; - -    if (!j) -      // The new filter coincides with range [i, end) of the existing filter. -      return -(1 + i); - -try_next:; +} // end namespace llvm + +//===- MMI building helpers -----------------------------------------------===// + +void llvm::computeUsesVAFloatArgument(const CallInst &I, +                                      MachineModuleInfo &MMI) { +  FunctionType *FT = +      cast<FunctionType>(I.getCalledValue()->getType()->getContainedType(0)); +  if (FT->isVarArg() && !MMI.usesVAFloatArgument()) { +    for (unsigned i = 0, e = I.getNumArgOperands(); i != e; ++i) { +      Type *T = I.getArgOperand(i)->getType(); +      for (auto i : post_order(T)) { +        if (i->isFloatingPointTy()) { +          MMI.setUsesVAFloatArgument(true); +          return; +        } +      } +    }    } - -  // Add the new filter. -  int FilterID = -(1 + FilterIds.size()); -  FilterIds.reserve(FilterIds.size() + TyIds.size() + 1); -  FilterIds.insert(FilterIds.end(), TyIds.begin(), TyIds.end()); -  FilterEnds.push_back(FilterIds.size()); -  FilterIds.push_back(0); // terminator -  return FilterID;  } | 
