Lines Matching full:info

155                                 const WinEH::FrameInfo *info) {  in EmitRuntimeFunction()  argument
159 EmitSymbolRefWithOfs(streamer, info->Begin, info->Begin); in EmitRuntimeFunction()
160 EmitSymbolRefWithOfs(streamer, info->Begin, info->End); in EmitRuntimeFunction()
161 streamer.emitValue(MCSymbolRefExpr::create(info->Symbol, in EmitRuntimeFunction()
166 static void EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info) { in EmitUnwindInfo() argument
168 if (info->Symbol) in EmitUnwindInfo()
176 info->Symbol = Label; in EmitUnwindInfo()
180 if (info->ChainedParent) in EmitUnwindInfo()
183 if (info->HandlesUnwind) in EmitUnwindInfo()
185 if (info->HandlesExceptions) in EmitUnwindInfo()
190 if (info->PrologEnd) in EmitUnwindInfo()
191 EmitAbsDifference(streamer, info->PrologEnd, info->Begin); in EmitUnwindInfo()
195 uint8_t numCodes = CountOfUnwindCodes(info->Instructions); in EmitUnwindInfo()
199 if (info->LastFrameInst >= 0) { in EmitUnwindInfo()
200 WinEH::Instruction &frameInst = info->Instructions[info->LastFrameInst]; in EmitUnwindInfo()
207 uint8_t numInst = info->Instructions.size(); in EmitUnwindInfo()
209 WinEH::Instruction inst = info->Instructions.back(); in EmitUnwindInfo()
210 info->Instructions.pop_back(); in EmitUnwindInfo()
211 EmitUnwindCode(streamer, info->Begin, inst); in EmitUnwindInfo()
223 EmitRuntimeFunction(streamer, info->ChainedParent); in EmitUnwindInfo()
226 streamer.emitValue(MCSymbolRefExpr::create(info->ExceptionHandler, in EmitUnwindInfo()
231 // a chained unwind info, if there is no handler, and if there are fewer in EmitUnwindInfo()
238 // Emit the unwind info structs first. in Emit()
254 WinEH::FrameInfo *info, in EmitUnwindInfo() argument
258 MCSection *XData = Streamer.getAssociatedXDataSection(info->TextSection); in EmitUnwindInfo()
261 ::EmitUnwindInfo(Streamer, info); in EmitUnwindInfo()
298 report_fatal_error("Failed to evaluate function length in SEH unwind info"); in GetAbsDifference()
653 const WinEH::FrameInfo *info) { in FindMatchingEpilog() argument
655 auto InstrsIter = info->EpilogMap.find(EpilogStart); in FindMatchingEpilog()
656 assert(InstrsIter != info->EpilogMap.end() && in FindMatchingEpilog()
706 // Update info about the previous instruction, for detecting if in simplifyARM64Opcodes()
761 static int checkARM64PackedEpilog(MCStreamer &streamer, WinEH::FrameInfo *info, in checkARM64PackedEpilog() argument
770 info->EpilogMap[Sym].Instructions; in checkARM64PackedEpilog()
788 int Offset = getARM64OffsetInProlog(info->Instructions, Epilog); in checkARM64PackedEpilog()
800 info->EpilogMap.erase(Sym); in checkARM64PackedEpilog()
804 static bool tryARM64PackedUnwind(WinEH::FrameInfo *info, uint32_t FuncLength, in tryARM64PackedUnwind() argument
816 if (info->Instructions.back().Operation != Win64EH::UOP_SetFP) in tryARM64PackedUnwind()
845 for (const WinEH::Instruction &Inst : info->Instructions) { in tryARM64PackedUnwind()
1041 // There's an inconsistency regarding packed unwind info with homed in tryARM64PackedUnwind()
1048 // To play it safe, don't produce packed unwind info with homed parameters. in tryARM64PackedUnwind()
1071 info->PackedInfo |= Flag << 0; in tryARM64PackedUnwind()
1072 info->PackedInfo |= (FuncLength & 0x7FF) << 2; in tryARM64PackedUnwind()
1073 info->PackedInfo |= (RegF & 0x7) << 13; in tryARM64PackedUnwind()
1074 info->PackedInfo |= (RegI & 0xF) << 16; in tryARM64PackedUnwind()
1075 info->PackedInfo |= (H & 0x1) << 20; in tryARM64PackedUnwind()
1076 info->PackedInfo |= (CR & 0x3) << 21; in tryARM64PackedUnwind()
1077 info->PackedInfo |= (FrameSize & 0x1FF) << 23; in tryARM64PackedUnwind()
1081 static void ARM64ProcessEpilogs(WinEH::FrameInfo *info, in ARM64ProcessEpilogs() argument
1094 auto &EpilogInstrs = info->EpilogMap[S].Instructions; in ARM64ProcessEpilogs()
1098 FindMatchingEpilog(EpilogInstrs, AddedEpilogs, info); in ARM64ProcessEpilogs()
1107 } else if ((PrologOffset = getARM64OffsetInProlog(info->Instructions, in ARM64ProcessEpilogs()
1126 WinEH::FrameInfo *info, in ARM64FindSegmentsInFunction() argument
1128 if (info->PrologEnd) in ARM64FindSegmentsInFunction()
1129 checkARM64Instructions(streamer, info->Instructions, info->Begin, in ARM64FindSegmentsInFunction()
1130 info->PrologEnd, info->Function->getName(), in ARM64FindSegmentsInFunction()
1139 for (auto &I : info->EpilogMap) { in ARM64FindSegmentsInFunction()
1142 int64_t Offset = GetAbsDifference(streamer, Start, info->Begin); in ARM64FindSegmentsInFunction()
1144 info->Function->getName(), "epilogue"); in ARM64FindSegmentsInFunction()
1189 info->Segments.push_back(Seg); in ARM64FindSegmentsInFunction()
1203 info->Segments.push_back(LastSeg); in ARM64FindSegmentsInFunction()
1207 WinEH::FrameInfo *info, in ARM64EmitUnwindInfoForSegment() argument
1218 info->Symbol = Label; in ARM64EmitUnwindInfoForSegment()
1224 uint32_t PrologCodeBytes = info->PrologCodeBytes; in ARM64EmitUnwindInfoForSegment()
1227 checkARM64PackedEpilog(streamer, info, &Seg, PrologCodeBytes) : -1; in ARM64EmitUnwindInfoForSegment()
1230 // 1. Enable packed unwind info (.pdata only) for multi-segment functions. in ARM64EmitUnwindInfoForSegment()
1231 // 2. Emit packed unwind info (.pdata only) for segments that have neithor in ARM64EmitUnwindInfoForSegment()
1233 if (info->Segments.size() == 1 && PackedEpilogOffset >= 0 && in ARM64EmitUnwindInfoForSegment()
1235 !info->HandlesExceptions && SegLength <= 0x7ff && TryPacked) { in ARM64EmitUnwindInfoForSegment()
1240 // info->Symbol was already set even if we didn't actually write any in ARM64EmitUnwindInfoForSegment()
1241 // unwind info there. Keep using that as indicator that this unwind in ARM64EmitUnwindInfoForSegment()
1242 // info has been generated already. in ARM64EmitUnwindInfoForSegment()
1243 if (tryARM64PackedUnwind(info, SegLength, PackedEpilogOffset)) in ARM64EmitUnwindInfoForSegment()
1267 ARM64ProcessEpilogs(info, &Seg, TotalCodeBytes, EpilogInfo); in ARM64EmitUnwindInfoForSegment()
1282 if (info->HandlesExceptions) // X in ARM64EmitUnwindInfoForSegment()
1291 // FIXME: We should be able to split unwind info into multiple sections. in ARM64EmitUnwindInfoForSegment()
1329 for (auto Inst : llvm::reverse(info->Instructions)) in ARM64EmitUnwindInfoForSegment()
1334 auto &EpilogInstrs = info->EpilogMap[I.first].Instructions; in ARM64EmitUnwindInfoForSegment()
1344 if (info->HandlesExceptions) in ARM64EmitUnwindInfoForSegment()
1346 MCSymbolRefExpr::create(info->ExceptionHandler, in ARM64EmitUnwindInfoForSegment()
1353 static void ARM64EmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info, in ARM64EmitUnwindInfo() argument
1356 if (info->Symbol) in ARM64EmitUnwindInfo()
1358 // If there's no unwind info here (not even a terminating UOP_End), the in ARM64EmitUnwindInfo()
1359 // unwind info is considered bogus and skipped. If this was done in in ARM64EmitUnwindInfo()
1362 if (info->empty()) { in ARM64EmitUnwindInfo()
1363 info->EmitAttempted = true; in ARM64EmitUnwindInfo()
1366 if (info->EmitAttempted) { in ARM64EmitUnwindInfo()
1367 // If we tried to emit unwind info before (due to an explicit in ARM64EmitUnwindInfo()
1373 SMLoc(), "Earlier .seh_handlerdata for " + info->Function->getName() + in ARM64EmitUnwindInfo()
1374 " skipped due to no unwind info at the time " in ARM64EmitUnwindInfo()
1376 "did get unwind info that can't be emitted"); in ARM64EmitUnwindInfo()
1380 simplifyARM64Opcodes(info->Instructions, false); in ARM64EmitUnwindInfo()
1381 for (auto &I : info->EpilogMap) in ARM64EmitUnwindInfo()
1385 if (!info->FuncletOrFuncEnd) { in ARM64EmitUnwindInfo()
1417 RawFuncLength = GetAbsDifference(streamer, info->FuncletOrFuncEnd, in ARM64EmitUnwindInfo()
1418 info->Begin); in ARM64EmitUnwindInfo()
1421 ARM64FindSegmentsInFunction(streamer, info, RawFuncLength); in ARM64EmitUnwindInfo()
1423 info->PrologCodeBytes = ARM64CountOfUnwindCodes(info->Instructions); in ARM64EmitUnwindInfo()
1424 for (auto &S : info->Segments) in ARM64EmitUnwindInfo()
1425 ARM64EmitUnwindInfoForSegment(streamer, info, S, TryPacked); in ARM64EmitUnwindInfo()
1427 // Clear prolog instructions after unwind info is emitted for all segments. in ARM64EmitUnwindInfo()
1428 info->Instructions.clear(); in ARM64EmitUnwindInfo()
1771 static int checkARMPackedEpilog(MCStreamer &streamer, WinEH::FrameInfo *info, in checkARMPackedEpilog() argument
1774 if (info->EpilogMap.size() != 1) in checkARMPackedEpilog()
1777 const WinEH::FrameInfo::Epilog &EpilogInfo = info->EpilogMap.begin()->second; in checkARMPackedEpilog()
1784 if (info->Instructions.empty() || Epilog.empty()) in checkARMPackedEpilog()
1790 streamer, info->FuncletOrFuncEnd, info->EpilogMap.begin()->first); in checkARMPackedEpilog()
1808 getARMOffsetInProlog(info->Instructions, Epilog, /*CanTweakProlog=*/true); in checkARMPackedEpilog()
1820 info->Instructions.front() = Epilog.back(); in checkARMPackedEpilog()
1824 info->EpilogMap.clear(); in checkARMPackedEpilog()
1868 static bool tryARMPackedUnwind(MCStreamer &streamer, WinEH::FrameInfo *info, in tryARMPackedUnwind() argument
1881 for (const WinEH::Instruction &Inst : info->Instructions) { in tryARMPackedUnwind()
1998 // Packed uneind info can't express multiple epilogues. in tryARMPackedUnwind()
1999 if (info->EpilogMap.size() > 1) in tryARMPackedUnwind()
2004 if (info->EpilogMap.size() == 0) { in tryARMPackedUnwind()
2011 info->EpilogMap.begin()->second; in tryARMPackedUnwind()
2016 streamer, info->FuncletOrFuncEnd, info->EpilogMap.begin()->first); in tryARMPackedUnwind()
2236 int Flag = info->Fragment ? 0x02 : 0x01; in tryARMPackedUnwind()
2255 info->PackedInfo |= Flag << 0; in tryARMPackedUnwind()
2256 info->PackedInfo |= (FuncLength & 0x7FF) << 2; in tryARMPackedUnwind()
2257 info->PackedInfo |= (Ret & 0x3) << 13; in tryARMPackedUnwind()
2258 info->PackedInfo |= H << 15; in tryARMPackedUnwind()
2259 info->PackedInfo |= Reg << 16; in tryARMPackedUnwind()
2260 info->PackedInfo |= R << 19; in tryARMPackedUnwind()
2261 info->PackedInfo |= L << 20; in tryARMPackedUnwind()
2262 info->PackedInfo |= C << 21; in tryARMPackedUnwind()
2264 info->PackedInfo |= StackAdjust << 22; in tryARMPackedUnwind()
2270 static void ARMEmitUnwindInfo(MCStreamer &streamer, WinEH::FrameInfo *info, in ARMEmitUnwindInfo() argument
2273 if (info->Symbol) in ARMEmitUnwindInfo()
2275 // If there's no unwind info here (not even a terminating UOP_End), the in ARMEmitUnwindInfo()
2276 // unwind info is considered bogus and skipped. If this was done in in ARMEmitUnwindInfo()
2279 if (info->empty()) { in ARMEmitUnwindInfo()
2280 info->EmitAttempted = true; in ARMEmitUnwindInfo()
2283 if (info->EmitAttempted) { in ARMEmitUnwindInfo()
2284 // If we tried to emit unwind info before (due to an explicit in ARMEmitUnwindInfo()
2290 SMLoc(), "Earlier .seh_handlerdata for " + info->Function->getName() + in ARMEmitUnwindInfo()
2291 " skipped due to no unwind info at the time " in ARMEmitUnwindInfo()
2293 "did get unwind info that can't be emitted"); in ARMEmitUnwindInfo()
2302 info->Symbol = Label; in ARMEmitUnwindInfo()
2304 if (!info->PrologEnd) in ARMEmitUnwindInfo()
2306 info->Function->getName() + in ARMEmitUnwindInfo()
2309 if (info->PrologEnd && !info->Fragment) in ARMEmitUnwindInfo()
2310 checkARMInstructions(streamer, info->Instructions, info->Begin, in ARMEmitUnwindInfo()
2311 info->PrologEnd, info->Function->getName(), in ARMEmitUnwindInfo()
2313 for (auto &I : info->EpilogMap) { in ARMEmitUnwindInfo()
2317 info->Function->getName(), "epilogue"); in ARMEmitUnwindInfo()
2321 SMLoc(), "Epilogue in " + info->Function->getName() + in ARMEmitUnwindInfo()
2327 if (!info->FuncletOrFuncEnd) { in ARMEmitUnwindInfo()
2336 // the unwind info would need to be split (but this isn't implemented in ARMEmitUnwindInfo()
2339 GetOptionalAbsDifference(streamer, info->FuncletOrFuncEnd, info->Begin); in ARMEmitUnwindInfo()
2342 GetSubDivExpr(streamer, info->FuncletOrFuncEnd, info->Begin, 2); in ARMEmitUnwindInfo()
2349 uint32_t PrologCodeBytes = ARMCountOfUnwindCodes(info->Instructions); in ARMEmitUnwindInfo()
2352 if (!info->HandlesExceptions && RawFuncLength && FuncLength <= 0x7ff && in ARMEmitUnwindInfo()
2358 // info->Symbol was already set even if we didn't actually write any in ARMEmitUnwindInfo()
2359 // unwind info there. Keep using that as indicator that this unwind in ARMEmitUnwindInfo()
2360 // info has been generated already. in ARMEmitUnwindInfo()
2362 if (tryARMPackedUnwind(streamer, info, FuncLength)) in ARMEmitUnwindInfo()
2367 checkARMPackedEpilog(streamer, info, PrologCodeBytes); in ARMEmitUnwindInfo()
2375 for (auto &I : info->EpilogMap) { in ARMEmitUnwindInfo()
2381 FindMatchingEpilog(EpilogInstrs, AddedEpilogs, info); in ARMEmitUnwindInfo()
2391 info->Instructions, EpilogInstrs, CanTweakProlog)) >= 0) { in ARMEmitUnwindInfo()
2395 info->Instructions.front() = EpilogInstrs.back(); in ARMEmitUnwindInfo()
2417 PackedEpilogOffset >= 0 ? PackedEpilogOffset : info->EpilogMap.size(); in ARMEmitUnwindInfo()
2423 if (info->HandlesExceptions) // X in ARMEmitUnwindInfo()
2427 if (info->Fragment) // F in ARMEmitUnwindInfo()
2440 // FIXME: We should be able to split unwind info into multiple sections. in ARMEmitUnwindInfo()
2456 GetOptionalAbsDifference(streamer, EpilogStart, info->Begin); in ARMEmitUnwindInfo()
2462 OffsetExpr = GetSubDivExpr(streamer, EpilogStart, info->Begin, 2); in ARMEmitUnwindInfo()
2464 assert(info->EpilogMap.contains(EpilogStart)); in ARMEmitUnwindInfo()
2465 unsigned Condition = info->EpilogMap[EpilogStart].Condition; in ARMEmitUnwindInfo()
2482 uint8_t numInst = info->Instructions.size(); in ARMEmitUnwindInfo()
2484 WinEH::Instruction inst = info->Instructions.back(); in ARMEmitUnwindInfo()
2485 info->Instructions.pop_back(); in ARMEmitUnwindInfo()
2490 for (auto &I : info->EpilogMap) { in ARMEmitUnwindInfo()
2501 if (info->HandlesExceptions) in ARMEmitUnwindInfo()
2503 MCSymbolRefExpr::create(info->ExceptionHandler, in ARMEmitUnwindInfo()
2509 const WinEH::FrameInfo *info) { in ARM64EmitRuntimeFunction() argument
2513 for (const auto &S : info->Segments) { in ARM64EmitRuntimeFunction()
2514 EmitSymbolRefWithOfs(streamer, info->Begin, S.Offset); in ARM64EmitRuntimeFunction()
2515 if (info->PackedInfo) in ARM64EmitRuntimeFunction()
2516 streamer.emitInt32(info->PackedInfo); in ARM64EmitRuntimeFunction()
2527 const WinEH::FrameInfo *info) { in ARMEmitRuntimeFunction() argument
2531 EmitSymbolRefWithOfs(streamer, info->Begin, info->Begin); in ARMEmitRuntimeFunction()
2532 if (info->PackedInfo) in ARMEmitRuntimeFunction()
2533 streamer.emitInt32(info->PackedInfo); in ARMEmitRuntimeFunction()
2536 MCSymbolRefExpr::create(info->Symbol, MCSymbolRefExpr::VK_COFF_IMGREL32, in ARMEmitRuntimeFunction()
2542 // Emit the unwind info structs first. in Emit()
2544 WinEH::FrameInfo *Info = CFI.get(); in Emit() local
2545 if (Info->empty()) in Emit()
2549 ARM64EmitUnwindInfo(Streamer, Info); in Emit()
2554 WinEH::FrameInfo *Info = CFI.get(); in Emit() local
2555 // ARM64EmitUnwindInfo above clears the info struct, so we can't check in Emit()
2558 if (!Info->Symbol) in Emit()
2562 ARM64EmitRuntimeFunction(Streamer, Info); in Emit()
2567 WinEH::FrameInfo *info, in EmitUnwindInfo() argument
2575 if (!info->FuncletOrFuncEnd) { in EmitUnwindInfo()
2576 Streamer.switchSection(info->TextSection); in EmitUnwindInfo()
2577 info->FuncletOrFuncEnd = Streamer.emitCFILabel(); in EmitUnwindInfo()
2581 MCSection *XData = Streamer.getAssociatedXDataSection(info->TextSection); in EmitUnwindInfo()
2583 ARM64EmitUnwindInfo(Streamer, info, /* TryPacked = */ !HandlerData); in EmitUnwindInfo()
2587 // Emit the unwind info structs first. in Emit()
2589 WinEH::FrameInfo *Info = CFI.get(); in Emit() local
2590 if (Info->empty()) in Emit()
2594 ARMEmitUnwindInfo(Streamer, Info); in Emit()
2599 WinEH::FrameInfo *Info = CFI.get(); in Emit() local
2600 // ARMEmitUnwindInfo above clears the info struct, so we can't check in Emit()
2603 if (!Info->Symbol) in Emit()
2607 ARMEmitRuntimeFunction(Streamer, Info); in Emit()
2612 WinEH::FrameInfo *info, in EmitUnwindInfo() argument
2620 if (!info->FuncletOrFuncEnd) { in EmitUnwindInfo()
2621 Streamer.switchSection(info->TextSection); in EmitUnwindInfo()
2622 info->FuncletOrFuncEnd = Streamer.emitCFILabel(); in EmitUnwindInfo()
2626 MCSection *XData = Streamer.getAssociatedXDataSection(info->TextSection); in EmitUnwindInfo()
2628 ARMEmitUnwindInfo(Streamer, info, /* TryPacked = */ !HandlerData); in EmitUnwindInfo()