Link Register — funksiya chaqiruvida qaytish manzilini saqlash uchun ajratilgan maxsus yoki kelishuv bo‘yicha belgilangan protsessor registri. Call-ga teng branch-and-link buyrug‘i keyingi instruction manzilini link registerga yozib, nishonga o‘tadi. Funksiya yakunida return shu qiymatni Instruction Pointer’ga qaytaradi.
Leaf funksiya
Boshqa funksiya chaqirmaydigan leaf function link register qiymatini o‘zgartirmaydi va return’da undan bevosita foydalanadi. Bu stackga return address yozish va qayta o‘qish xarajatini kamaytiradi. Compiler lokal registrlar va stack joyiga ehtiyoj bo‘lmasa prologni butunlay olib tashlashi mumkin.
Non-leaf funksiya yangi call qilsa, o‘sha instruction link registerga yangi qaytish manzilini yozadi. Tashqi chaqiruv manzili yo‘qolmasligi uchun prolog uni stack yoki boshqa callee-saved registrga saqlaydi. Epilogda eski qiymat tiklanib return bajariladi.
ISA shakllari
Ayrim arxitektura bitta qat’iy link register belgilaydi. Boshqasida branch-and-link natija registrini operand sifatida tanlaydi; oddiy jump uchun natija nol registriga yo‘naltirilishi mumkin. Calling Convention qaysi registr odatiy return address ekanini standartlashtiradi.
Exception va interrupt odatiy call emas. Ular alohida exception link register yoki himoyalangan stackda qaytish holatini saqlashi mumkin. Maxsus exception-return status bayroqlari va privilege darajasini ham tiklaydi.
Tail call va coroutine
Tail call joriy funksiya natijasini bevosita boshqa funksiyadan qaytarsa, yangi link yaratmasdan mavjud return address saqlanadi va callee’ga jump qilinadi. Bu stack chuqurligini oshirmaydi. ABI argument joylashuvi va stackni yangi callee talabiga moslashni talab qiladi.
Coroutine yoki continuation link register’ni oddiy LIFO tartibidan tashqari kontekst obyektiga saqlashi mumkin. Runtime boshqa stackga o‘tganda debugger va garbage collector uchun unwind metadata’ni ham boshqaradi.
Bashorat va himoya
Protsessor call’da return address stack predictor’iga manzil qo‘shishi mumkin. Return link registerdan haqiqiy nishonni oladi, predictor esa fetchni oldindan yo‘naltiradi. Call/return jufti buzilsa bashorat xato qiladi, lekin me’moriy manzil o‘zgarmaydi.
Link register xotiraga saqlanganda stack overflow bilan buzilishi mumkin. Pointer authentication ayrim arxitekturalarda registerdagi qaytish manzilini stack konteksti bilan imzolaydi; return oldidan tekshiriladi. Shadow stack esa alohida ishonchli nusxani saqlaydi.
Link register umumiy registrga o‘xshab arifmetikada ishlatilishi mumkin bo‘lsa ham, faol return address mavjud paytda uni ehtiyotsiz o‘zgartirish nazorat oqimini buzadi. Compiler register allocator uning live range’ini maxsus qoidada yuritadi.
Arxitektura tafsilotlari
Ba’zi ISA link registerga joriy instruction’dan keyingi aniq byte manzilini, boshqasi pipeline yoki instruction-set holati bitlarini qo‘shib yozadi. Return oddiy arifmetik +4 kabi taxmin bilan emas, ABI ko‘rsatgan semantika bilan bajariladi. Siqilgan va to‘liq instruction rejimi o‘rtasida holat biti nishonning past qismida kodlanishi mumkin.
Link register debuggerda call stackning eng yangi, hali stackka saqlanmagan qaytish manzilini beradi. Unwinder prolog qaysi nuqtada uni xotiraga ko‘chirganini instruction manziliga qarab aniqlaydi. Bir xil funksiyaning prolog oldi, o‘rtasi va tanasida recovery qoidasi turlicha bo‘lishi mumkin.
Interrupt kirishi link registerdan foydalanadigan bo‘lsa, apparat eski qiymatni maxsus exception registriga yoki stackka saqlaydi. Nested interrupt uchun har darajaning qaytish manzili alohida himoyalanmasa, tashqi handlerga qaytish yo‘li yo‘qoladi.
Bog‘liq tushunchalar
call instruction, return instruction, return address, leaf function, tail call, shadow stack