Lines Matching refs:sec
509 for (InputSection *sec : getInputSections(*osec, storage)) { in initSymbolAnchors()
510 sec->relaxAux = make<RISCVRelaxAux>(); in initSymbolAnchors()
511 if (sec->relocations.size()) { in initSymbolAnchors()
512 sec->relaxAux->relocDeltas = in initSymbolAnchors()
513 std::make_unique<uint32_t[]>(sec->relocations.size()); in initSymbolAnchors()
514 sec->relaxAux->relocTypes = in initSymbolAnchors()
515 std::make_unique<RelType[]>(sec->relocations.size()); in initSymbolAnchors()
526 if (auto *sec = dyn_cast_or_null<InputSection>(d->section)) in initSymbolAnchors() local
527 if (sec->flags & SHF_EXECINSTR && sec->relaxAux) { in initSymbolAnchors()
529 sec->relaxAux->anchors.push_back({d->value, d, false}); in initSymbolAnchors()
530 sec->relaxAux->anchors.push_back({d->value + d->size, d, true}); in initSymbolAnchors()
540 for (InputSection *sec : getInputSections(*osec, storage)) { in initSymbolAnchors()
541 llvm::sort(sec->relaxAux->anchors, [](auto &a, auto &b) { in initSymbolAnchors()
550 static void relaxCall(const InputSection &sec, size_t i, uint64_t loc, in relaxCall() argument
554 const uint64_t insnPair = read64le(sec.rawData.data() + r.offset); in relaxCall()
561 sec.relaxAux->relocTypes[i] = R_RISCV_RVC_JUMP; in relaxCall()
562 sec.relaxAux->writes.push_back(0xa001); // c.j in relaxCall()
566 sec.relaxAux->relocTypes[i] = R_RISCV_RVC_JUMP; in relaxCall()
567 sec.relaxAux->writes.push_back(0x2001); // c.jal in relaxCall()
570 sec.relaxAux->relocTypes[i] = R_RISCV_JAL; in relaxCall()
571 sec.relaxAux->writes.push_back(0x6f | rd << 7); // jal in relaxCall()
577 static void relaxTlsLe(const InputSection &sec, size_t i, uint64_t loc, in relaxTlsLe() argument
582 uint32_t insn = read32le(sec.rawData.data() + r.offset); in relaxTlsLe()
587 sec.relaxAux->relocTypes[i] = R_RISCV_RELAX; in relaxTlsLe()
592 sec.relaxAux->relocTypes[i] = R_RISCV_32; in relaxTlsLe()
594 sec.relaxAux->writes.push_back(setLO12_I(insn, val)); in relaxTlsLe()
598 sec.relaxAux->relocTypes[i] = R_RISCV_32; in relaxTlsLe()
600 sec.relaxAux->writes.push_back(setLO12_S(insn, val)); in relaxTlsLe()
605 static bool relax(InputSection &sec) { in relax() argument
606 const uint64_t secAddr = sec.getVA(); in relax()
607 auto &aux = *sec.relaxAux; in relax()
615 for (auto it : llvm::enumerate(sec.relocations)) { in relax()
627 std::fill_n(aux.relocTypes.get(), sec.relocations.size(), R_RISCV_NONE); in relax()
629 for (auto it : llvm::enumerate(sec.relocations)) { in relax()
646 if (i + 1 != sec.relocations.size() && in relax()
647 sec.relocations[i + 1].type == R_RISCV_RELAX) in relax()
648 relaxCall(sec, i, loc, r, remove); in relax()
654 if (i + 1 != sec.relocations.size() && in relax()
655 sec.relocations[i + 1].type == R_RISCV_RELAX) in relax()
656 relaxTlsLe(sec, i, loc, r, remove); in relax()
685 sec.bytesDropped = delta; in relax()
709 for (InputSection *sec : getInputSections(*osec, storage)) in relaxOnce()
710 changed |= relax(*sec); in relaxOnce()
722 for (InputSection *sec : getInputSections(*osec, storage)) { in riscvFinalizeRelax()
723 RISCVRelaxAux &aux = *sec->relaxAux; in riscvFinalizeRelax()
727 auto &rels = sec->relocations; in riscvFinalizeRelax()
728 ArrayRef<uint8_t> old = sec->rawData; in riscvFinalizeRelax()
730 old.size() - aux.relocDeltas[sec->relocations.size() - 1]; in riscvFinalizeRelax()
735 sec->rawData = makeArrayRef(p, newSize); in riscvFinalizeRelax()
736 sec->bytesDropped = 0; in riscvFinalizeRelax()