diff options
Diffstat (limited to 'contrib/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp')
-rw-r--r-- | contrib/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp | 440 |
1 files changed, 0 insertions, 440 deletions
diff --git a/contrib/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp b/contrib/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp index 4b3ca87..1105bcc 100644 --- a/contrib/llvm/lib/ExecutionEngine/JIT/JITDwarfEmitter.cpp +++ b/contrib/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; -} |