diff options
| -rw-r--r-- | llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp | 440 | ||||
| -rw-r--r-- | llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.h | 16 | 
2 files changed, 0 insertions, 456 deletions
diff --git a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp index 4b3ca8759b8..1105bcc0437 100644 --- a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp +++ b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp @@ -595,443 +595,3 @@ JITDwarfEmitter::EmitEHFrame(const Function* Personality,    return StartEHPtr;  } - -unsigned JITDwarfEmitter::GetDwarfTableSizeInBytes(MachineFunction& F, -                                         JITCodeEmitter& jce, -                                         unsigned char* StartFunction, -                                         unsigned char* EndFunction) { -  const TargetMachine& TM = F.getTarget(); -  TD = TM.getTargetData(); -  stackGrowthDirection = TM.getFrameInfo()->getStackGrowthDirection(); -  RI = TM.getRegisterInfo(); -  JCE = &jce; -  unsigned FinalSize = 0; -   -  FinalSize += GetExceptionTableSizeInBytes(&F); -       -  const std::vector<const Function *> Personalities = MMI->getPersonalities(); -  FinalSize +=  -    GetCommonEHFrameSizeInBytes(Personalities[MMI->getPersonalityIndex()]); - -  FinalSize += GetEHFrameSizeInBytes(Personalities[MMI->getPersonalityIndex()], -                                     StartFunction); - -  return FinalSize; -} - -/// RoundUpToAlign - Add the specified alignment to FinalSize and returns -/// the new value. -static unsigned RoundUpToAlign(unsigned FinalSize, unsigned Alignment) { -  if (Alignment == 0) Alignment = 1; -  // Since we do not know where the buffer will be allocated, be pessimistic. -  return FinalSize + Alignment; -} -   -unsigned -JITDwarfEmitter::GetEHFrameSizeInBytes(const Function* Personality, -                                       unsigned char* StartFunction) const {  -  unsigned PointerSize = TD->getPointerSize(); -  unsigned FinalSize = 0; -  // EH frame header. -  FinalSize += PointerSize; -  // FDE CIE Offset -  FinalSize += 3 * PointerSize; -  // If there is a personality and landing pads then point to the language -  // specific data area in the exception table. -  if (Personality) { -    FinalSize += MCAsmInfo::getULEB128Size(4);  -    FinalSize += PointerSize; -  } else { -    FinalSize += MCAsmInfo::getULEB128Size(0); -  } -       -  // Indicate locations of function specific  callee saved registers in -  // frame. -  FinalSize += GetFrameMovesSizeInBytes((intptr_t)StartFunction, -                                        MMI->getFrameMoves()); -       -  FinalSize = RoundUpToAlign(FinalSize, 4); -   -  // Double zeroes for the unwind runtime -  FinalSize += 2 * PointerSize; - -  return FinalSize; -} - -unsigned JITDwarfEmitter::GetCommonEHFrameSizeInBytes(const Function* Personality)  -  const { - -  unsigned PointerSize = TD->getPointerSize(); -  int stackGrowth = stackGrowthDirection == TargetFrameInfo::StackGrowsUp ? -          PointerSize : -PointerSize; -  unsigned FinalSize = 0;  -  // EH Common Frame header -  FinalSize += PointerSize; -  FinalSize += 4; -  FinalSize += 1; -  FinalSize += Personality ? 5 : 3; // "zPLR" or "zR" -  FinalSize += MCAsmInfo::getULEB128Size(1); -  FinalSize += MCAsmInfo::getSLEB128Size(stackGrowth); -  FinalSize += 1; -   -  if (Personality) { -    FinalSize += MCAsmInfo::getULEB128Size(7); -     -    // Encoding -    FinalSize+= 1; -    //Personality -    FinalSize += PointerSize; -     -    FinalSize += MCAsmInfo::getULEB128Size(dwarf::DW_EH_PE_pcrel); -    FinalSize += MCAsmInfo::getULEB128Size(dwarf::DW_EH_PE_pcrel); -       -  } else { -    FinalSize += MCAsmInfo::getULEB128Size(1); -    FinalSize += MCAsmInfo::getULEB128Size(dwarf::DW_EH_PE_pcrel); -  } - -  std::vector<MachineMove> Moves; -  RI->getInitialFrameState(Moves); -  FinalSize += GetFrameMovesSizeInBytes(0, Moves); -  FinalSize = RoundUpToAlign(FinalSize, 4); -  return FinalSize; -} - -unsigned -JITDwarfEmitter::GetFrameMovesSizeInBytes(intptr_t BaseLabelPtr, -                                  const std::vector<MachineMove> &Moves) const { -  unsigned PointerSize = TD->getPointerSize(); -  int stackGrowth = stackGrowthDirection == TargetFrameInfo::StackGrowsUp ? -          PointerSize : -PointerSize; -  bool IsLocal = BaseLabelPtr; -  unsigned FinalSize = 0;  - -  for (unsigned i = 0, N = Moves.size(); i < N; ++i) { -    const MachineMove &Move = Moves[i]; -    MCSymbol *Label = Move.getLabel(); -     -    // Throw out move if the label is invalid. -    if (Label && (*JCE->getLabelLocations())[Label] == 0) -      continue; -     -    intptr_t LabelPtr = 0; -    if (Label) LabelPtr = JCE->getLabelAddress(Label); - -    const MachineLocation &Dst = Move.getDestination(); -    const MachineLocation &Src = Move.getSource(); -     -    // Advance row if new location. -    if (BaseLabelPtr && Label && (BaseLabelPtr != LabelPtr || !IsLocal)) { -      FinalSize++; -      FinalSize += PointerSize; -      BaseLabelPtr = LabelPtr; -      IsLocal = true; -    } -     -    // If advancing cfa. -    if (Dst.isReg() && Dst.getReg() == MachineLocation::VirtualFP) { -      if (!Src.isReg()) { -        if (Src.getReg() == MachineLocation::VirtualFP) { -          ++FinalSize; -        } else { -          ++FinalSize; -          unsigned RegNum = RI->getDwarfRegNum(Src.getReg(), true); -          FinalSize += MCAsmInfo::getULEB128Size(RegNum); -        } -         -        int Offset = -Src.getOffset(); -         -        FinalSize += MCAsmInfo::getULEB128Size(Offset); -      } else { -        llvm_unreachable("Machine move no supported yet."); -      } -    } else if (Src.isReg() && -      Src.getReg() == MachineLocation::VirtualFP) { -      if (Dst.isReg()) { -        ++FinalSize; -        unsigned RegNum = RI->getDwarfRegNum(Dst.getReg(), true); -        FinalSize += MCAsmInfo::getULEB128Size(RegNum); -      } else { -        llvm_unreachable("Machine move no supported yet."); -      } -    } else { -      unsigned Reg = RI->getDwarfRegNum(Src.getReg(), true); -      int Offset = Dst.getOffset() / stackGrowth; -       -      if (Offset < 0) { -        ++FinalSize; -        FinalSize += MCAsmInfo::getULEB128Size(Reg); -        FinalSize += MCAsmInfo::getSLEB128Size(Offset); -      } else if (Reg < 64) { -        ++FinalSize; -        FinalSize += MCAsmInfo::getULEB128Size(Offset); -      } else { -        ++FinalSize; -        FinalSize += MCAsmInfo::getULEB128Size(Reg); -        FinalSize += MCAsmInfo::getULEB128Size(Offset); -      } -    } -  } -  return FinalSize; -} - -unsigned  -JITDwarfEmitter::GetExceptionTableSizeInBytes(MachineFunction* MF) const { -  unsigned FinalSize = 0; - -  // Map all labels and get rid of any dead landing pads. -  MMI->TidyLandingPads(JCE->getLabelLocations()); - -  const std::vector<const GlobalVariable *> &TypeInfos = MMI->getTypeInfos(); -  const std::vector<unsigned> &FilterIds = MMI->getFilterIds(); -  const std::vector<LandingPadInfo> &PadInfos = MMI->getLandingPads(); -  if (PadInfos.empty()) return 0; - -  // Sort the landing pads in order of their type ids.  This is used to fold -  // duplicate actions. -  SmallVector<const LandingPadInfo *, 64> LandingPads; -  LandingPads.reserve(PadInfos.size()); -  for (unsigned i = 0, N = PadInfos.size(); i != N; ++i) -    LandingPads.push_back(&PadInfos[i]); -  std::sort(LandingPads.begin(), LandingPads.end(), PadLT); - -  // Negative type ids index into FilterIds, positive type ids index into -  // TypeInfos.  The value written for a positive type id is just the type -  // id itself.  For a negative type id, however, the value written is the -  // (negative) byte offset of the corresponding FilterIds entry.  The byte -  // offset is usually equal to the type id, because the FilterIds entries -  // are written using a variable width encoding which outputs one byte per -  // entry as long as the value written is not too large, but can differ. -  // This kind of complication does not occur for positive type ids because -  // type infos are output using a fixed width encoding. -  // FilterOffsets[i] holds the byte offset corresponding to FilterIds[i]. -  SmallVector<int, 16> FilterOffsets; -  FilterOffsets.reserve(FilterIds.size()); -  int Offset = -1; -  for(std::vector<unsigned>::const_iterator I = FilterIds.begin(), -    E = FilterIds.end(); I != E; ++I) { -    FilterOffsets.push_back(Offset); -    Offset -= MCAsmInfo::getULEB128Size(*I); -  } - -  // Compute the actions table and gather the first action index for each -  // landing pad site. -  SmallVector<ActionEntry, 32> Actions; -  SmallVector<unsigned, 64> FirstActions; -  FirstActions.reserve(LandingPads.size()); - -  int FirstAction = 0; -  unsigned SizeActions = 0; -  for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) { -    const LandingPadInfo *LP = LandingPads[i]; -    const std::vector<int> &TypeIds = LP->TypeIds; -    const unsigned NumShared = i ? SharedTypeIds(LP, LandingPads[i-1]) : 0; -    unsigned SizeSiteActions = 0; - -    if (NumShared < TypeIds.size()) { -      unsigned SizeAction = 0; -      ActionEntry *PrevAction = 0; - -      if (NumShared) { -        const unsigned SizePrevIds = LandingPads[i-1]->TypeIds.size(); -        assert(Actions.size()); -        PrevAction = &Actions.back(); -        SizeAction = MCAsmInfo::getSLEB128Size(PrevAction->NextAction) + -          MCAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID); -        for (unsigned j = NumShared; j != SizePrevIds; ++j) { -          SizeAction -= MCAsmInfo::getSLEB128Size(PrevAction->ValueForTypeID); -          SizeAction += -PrevAction->NextAction; -          PrevAction = PrevAction->Previous; -        } -      } - -      // Compute the actions. -      for (unsigned I = NumShared, M = TypeIds.size(); I != M; ++I) { -        int TypeID = TypeIds[I]; -        assert(-1-TypeID < (int)FilterOffsets.size() && "Unknown filter id!"); -        int ValueForTypeID = TypeID < 0 ? FilterOffsets[-1 - TypeID] : TypeID; -        unsigned SizeTypeID = MCAsmInfo::getSLEB128Size(ValueForTypeID); - -        int NextAction = SizeAction ? -(SizeAction + SizeTypeID) : 0; -        SizeAction = SizeTypeID + MCAsmInfo::getSLEB128Size(NextAction); -        SizeSiteActions += SizeAction; - -        ActionEntry Action = {ValueForTypeID, NextAction, PrevAction}; -        Actions.push_back(Action); - -        PrevAction = &Actions.back(); -      } - -      // Record the first action of the landing pad site. -      FirstAction = SizeActions + SizeSiteActions - SizeAction + 1; -    } // else identical - re-use previous FirstAction - -    FirstActions.push_back(FirstAction); - -    // Compute this sites contribution to size. -    SizeActions += SizeSiteActions; -  } - -  // Compute the call-site table.  Entries must be ordered by address. -  SmallVector<CallSiteEntry, 64> CallSites; - -  RangeMapType PadMap; -  for (unsigned i = 0, N = LandingPads.size(); i != N; ++i) { -    const LandingPadInfo *LandingPad = LandingPads[i]; -    for (unsigned j=0, E = LandingPad->BeginLabels.size(); j != E; ++j) { -      MCSymbol *BeginLabel = LandingPad->BeginLabels[j]; -      assert(!PadMap.count(BeginLabel) && "Duplicate landing pad labels!"); -      PadRange P = { i, j }; -      PadMap[BeginLabel] = P; -    } -  } - -  bool MayThrow = false; -  MCSymbol *LastLabel = 0; -  for (MachineFunction::const_iterator I = MF->begin(), E = MF->end(); -        I != E; ++I) { -    for (MachineBasicBlock::const_iterator MI = I->begin(), E = I->end(); -          MI != E; ++MI) { -      if (!MI->isLabel()) { -        MayThrow |= MI->getDesc().isCall(); -        continue; -      } - -      MCSymbol *BeginLabel = MI->getOperand(0).getMCSymbol(); -       -      if (BeginLabel == LastLabel) -        MayThrow = false; - -      RangeMapType::iterator L = PadMap.find(BeginLabel); - -      if (L == PadMap.end()) -        continue; - -      PadRange P = L->second; -      const LandingPadInfo *LandingPad = LandingPads[P.PadIndex]; - -      assert(BeginLabel == LandingPad->BeginLabels[P.RangeIndex] && -              "Inconsistent landing pad map!"); - -      // If some instruction between the previous try-range and this one may -      // throw, create a call-site entry with no landing pad for the region -      // between the try-ranges. -      if (MayThrow) { -        CallSiteEntry Site = {LastLabel, BeginLabel, 0, 0}; -        CallSites.push_back(Site); -      } - -      LastLabel = LandingPad->EndLabels[P.RangeIndex]; -      CallSiteEntry Site = {BeginLabel, LastLabel, -        LandingPad->LandingPadLabel, FirstActions[P.PadIndex]}; - -      assert(Site.BeginLabel && Site.EndLabel && Site.PadLabel && -              "Invalid landing pad!"); - -      // Try to merge with the previous call-site. -      if (CallSites.size()) { -        CallSiteEntry &Prev = CallSites.back(); -        if (Site.PadLabel == Prev.PadLabel && Site.Action == Prev.Action) { -          // Extend the range of the previous entry. -          Prev.EndLabel = Site.EndLabel; -          continue; -        } -      } - -      // Otherwise, create a new call-site. -      CallSites.push_back(Site); -    } -  } -  // If some instruction between the previous try-range and the end of the -  // function may throw, create a call-site entry with no landing pad for the -  // region following the try-range. -  if (MayThrow) { -    CallSiteEntry Site = {LastLabel, 0, 0, 0}; -    CallSites.push_back(Site); -  } - -  // Final tallies. -  unsigned SizeSites = CallSites.size() * (sizeof(int32_t) + // Site start. -                                            sizeof(int32_t) + // Site length. -                                            sizeof(int32_t)); // Landing pad. -  for (unsigned i = 0, e = CallSites.size(); i < e; ++i) -    SizeSites += MCAsmInfo::getULEB128Size(CallSites[i].Action); - -  unsigned SizeTypes = TypeInfos.size() * TD->getPointerSize(); - -  unsigned TypeOffset = sizeof(int8_t) + // Call site format -                        // Call-site table length -                        MCAsmInfo::getULEB128Size(SizeSites) +  -                        SizeSites + SizeActions + SizeTypes; - -  unsigned TotalSize = sizeof(int8_t) + // LPStart format -                       sizeof(int8_t) + // TType format -                       MCAsmInfo::getULEB128Size(TypeOffset) + // TType base offset -                       TypeOffset; - -  unsigned SizeAlign = (4 - TotalSize) & 3; - -  // Begin the exception table. -  FinalSize = RoundUpToAlign(FinalSize, 4); -  for (unsigned i = 0; i != SizeAlign; ++i) { -    ++FinalSize; -  } -   -  unsigned PointerSize = TD->getPointerSize(); - -  // Emit the header. -  ++FinalSize; -  // Asm->EOL("LPStart format (DW_EH_PE_omit)"); -  ++FinalSize; -  // Asm->EOL("TType format (DW_EH_PE_absptr)"); -  ++FinalSize; -  // Asm->EOL("TType base offset"); -  ++FinalSize; -  // Asm->EOL("Call site format (DW_EH_PE_udata4)"); -  ++FinalSize; -  // Asm->EOL("Call-site table length"); - -  // Emit the landing pad site information. -  for (unsigned i = 0; i < CallSites.size(); ++i) { -    CallSiteEntry &S = CallSites[i]; - -    // Asm->EOL("Region start"); -    FinalSize += PointerSize; -     -    //Asm->EOL("Region length"); -    FinalSize += PointerSize; - -    // Asm->EOL("Landing pad"); -    FinalSize += PointerSize; - -    FinalSize += MCAsmInfo::getULEB128Size(S.Action); -    // Asm->EOL("Action"); -  } - -  // Emit the actions. -  for (unsigned I = 0, N = Actions.size(); I != N; ++I) { -    ActionEntry &Action = Actions[I]; - -    //Asm->EOL("TypeInfo index"); -    FinalSize += MCAsmInfo::getSLEB128Size(Action.ValueForTypeID); -    //Asm->EOL("Next action"); -    FinalSize += MCAsmInfo::getSLEB128Size(Action.NextAction); -  } - -  // Emit the type ids. -  for (unsigned M = TypeInfos.size(); M; --M) { -    // Asm->EOL("TypeInfo"); -    FinalSize += PointerSize; -  } - -  // Emit the filter typeids. -  for (unsigned j = 0, M = FilterIds.size(); j < M; ++j) { -    unsigned TypeID = FilterIds[j]; -    FinalSize += MCAsmInfo::getULEB128Size(TypeID); -    //Asm->EOL("Filter TypeInfo index"); -  } -   -  FinalSize = RoundUpToAlign(FinalSize, 4); - -  return FinalSize; -} diff --git a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.h b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.h index e627550d6d0..30956820f35 100644 --- a/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.h +++ b/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.h @@ -49,17 +49,6 @@ class JITDwarfEmitter {                               unsigned char* EndFunction,                               unsigned char* ExceptionTable) const; -  unsigned GetExceptionTableSizeInBytes(MachineFunction* MF) const; -   -  unsigned -    GetFrameMovesSizeInBytes(intptr_t BaseLabelPtr,  -                             const std::vector<MachineMove> &Moves) const; -     -  unsigned GetCommonEHFrameSizeInBytes(const Function* Personality) const; - -  unsigned GetEHFrameSizeInBytes(const Function* Personality,  -                                 unsigned char* StartFunction) const;  -      public:    JITDwarfEmitter(JIT& jit); @@ -71,11 +60,6 @@ public:                                  unsigned char* &EHFramePtr); -  unsigned GetDwarfTableSizeInBytes(MachineFunction& F,  -                                    JITCodeEmitter& JCE, -                                    unsigned char* StartFunction, -                                    unsigned char* EndFunction); -    void setModuleInfo(MachineModuleInfo* Info) {      MMI = Info;    }  | 

