diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2015-05-27 18:44:32 +0000 | 
| commit | 5a5ac124e1efaf208671f01c46edb15f29ed2a0b (patch) | |
| tree | a6140557876943cdd800ee997c9317283394b22c /lib/CodeGen/MachineModuleInfo.cpp | |
| parent | f03b5bed27d0d2eafd68562ce14f8b5e3f1f0801 (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/MachineModuleInfo.cpp')
| -rw-r--r-- | lib/CodeGen/MachineModuleInfo.cpp | 62 | 
1 files changed, 57 insertions, 5 deletions
| diff --git a/lib/CodeGen/MachineModuleInfo.cpp b/lib/CodeGen/MachineModuleInfo.cpp index baad411e2c5b..d9da7bcca4fa 100644 --- a/lib/CodeGen/MachineModuleInfo.cpp +++ b/lib/CodeGen/MachineModuleInfo.cpp @@ -9,10 +9,12 @@  #include "llvm/CodeGen/MachineModuleInfo.h"  #include "llvm/ADT/PointerUnion.h" +#include "llvm/Analysis/LibCallSemantics.h"  #include "llvm/Analysis/ValueTracking.h"  #include "llvm/CodeGen/MachineFunction.h"  #include "llvm/CodeGen/MachineFunctionPass.h"  #include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/WinEHFuncInfo.h"  #include "llvm/IR/Constants.h"  #include "llvm/IR/DerivedTypes.h"  #include "llvm/IR/GlobalVariable.h" @@ -116,7 +118,7 @@ MCSymbol *MMIAddrLabelMap::getAddrLabelSymbol(BasicBlock *BB) {    BBCallbacks.back().setMap(this);    Entry.Index = BBCallbacks.size()-1;    Entry.Fn = BB->getParent(); -  MCSymbol *Result = Context.CreateTempSymbol(); +  MCSymbol *Result = Context.createTempSymbol();    Entry.Symbols = Result;    return Result;  } @@ -276,6 +278,7 @@ bool MachineModuleInfo::doInitialization(Module &M) {    DbgInfoAvailable = UsesVAFloatArgument = UsesMorestackAddr = false;    // Always emit some info, by default "no personality" info.    Personalities.push_back(nullptr); +  PersonalityTypeCache = EHPersonality::Unknown;    AddrLabelSymbols = nullptr;    TheModule = nullptr; @@ -398,7 +401,7 @@ void MachineModuleInfo::addInvoke(MachineBasicBlock *LandingPad,  /// addLandingPad - Provide the label of a try LandingPad block.  ///  MCSymbol *MachineModuleInfo::addLandingPad(MachineBasicBlock *LandingPad) { -  MCSymbol *LandingPadLabel = Context.CreateTempSymbol(); +  MCSymbol *LandingPadLabel = Context.createTempSymbol();    LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad);    LP.LandingPadLabel = LandingPadLabel;    return LandingPadLabel; @@ -423,6 +426,12 @@ void MachineModuleInfo::addPersonality(MachineBasicBlock *LandingPad,      Personalities.push_back(Personality);  } +void MachineModuleInfo::addWinEHState(MachineBasicBlock *LandingPad, +                                      int State) { +  LandingPadInfo &LP = getOrCreateLandingPadInfo(LandingPad); +  LP.WinEHState = State; +} +  /// addCatchTypeInfo - Provide the catch typeinfo for a landing pad.  ///  void MachineModuleInfo:: @@ -452,6 +461,25 @@ void MachineModuleInfo::addCleanup(MachineBasicBlock *LandingPad) {    LP.TypeIds.push_back(0);  } +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); +} + +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); +} +  /// TidyLandingPads - Remap landing pad labels and remove any deleted landing  /// pads.  void MachineModuleInfo::TidyLandingPads(DenseMap<MCSymbol*, uintptr_t> *LPMap) { @@ -546,9 +574,18 @@ try_next:;  /// getPersonality - Return the personality function for the current function.  const Function *MachineModuleInfo::getPersonality() const { -  // FIXME: Until PR1414 will be fixed, we're using 1 personality function per -  // function -  return !LandingPads.empty() ? LandingPads[0].Personality : nullptr; +  for (const LandingPadInfo &LPI : LandingPads) +    if (LPI.Personality) +      return LPI.Personality; +  return nullptr; +} + +EHPersonality MachineModuleInfo::getPersonalityType() { +  if (PersonalityTypeCache == EHPersonality::Unknown) { +    if (const Function *F = getPersonality()) +      PersonalityTypeCache = classifyEHPersonality(F); +  } +  return PersonalityTypeCache;  }  /// getPersonalityIndex - Return unique index for current personality @@ -572,3 +609,18 @@ unsigned MachineModuleInfo::getPersonalityIndex() const {    // in the zero index.    return 0;  } + +const Function *MachineModuleInfo::getWinEHParent(const Function *F) const { +  StringRef WinEHParentName = +      F->getFnAttribute("wineh-parent").getValueAsString(); +  if (WinEHParentName.empty() || WinEHParentName == F->getName()) +    return F; +  return F->getParent()->getFunction(WinEHParentName); +} + +WinEHFuncInfo &MachineModuleInfo::getWinEHFuncInfo(const Function *F) { +  auto &Ptr = FuncInfoMap[getWinEHParent(F)]; +  if (!Ptr) +    Ptr.reset(new WinEHFuncInfo); +  return *Ptr; +} | 
