@@ -154,18 +154,22 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
154154 std::unique_ptr<LinkGraph> G, PassConfiguration PassConfig)
155155 : JITLinker(std::move(Ctx), std::move(G), std::move(PassConfig)) {
156156 JITLinkerBase::getPassConfig ().PostAllocationPasses .push_back (
157- [this ](LinkGraph &G) { return gatherRISCVPCRelHi20 (G); });
157+ [this ](LinkGraph &G) { return gatherRISCVPairs (G); });
158158 }
159159
160160private:
161161 DenseMap<std::pair<const Block *, orc::ExecutorAddrDiff>, const Edge *>
162162 RelHi20;
163+ DenseMap<std::pair<const Block *, orc::ExecutorAddrDiff>, const Edge *>
164+ SetULEB128;
163165
164- Error gatherRISCVPCRelHi20 (LinkGraph &G) {
166+ Error gatherRISCVPairs (LinkGraph &G) {
165167 for (Block *B : G.blocks ())
166168 for (Edge &E : B->edges ())
167169 if (E.getKind () == R_RISCV_PCREL_HI20)
168170 RelHi20[{B, E.getOffset ()}] = &E;
171+ else if (E.getKind () == R_RISCV_SET_ULEB128)
172+ SetULEB128[{B, E.getOffset ()}] = &E;
169173
170174 return Error::success ();
171175 }
@@ -189,6 +193,20 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
189193 " for LO12 PCREL relocation type" );
190194 }
191195
196+ Expected<const Edge &> getRISCVSetULEB128 (const Block &B,
197+ const Edge &E) const {
198+ using namespace riscv ;
199+ assert (E.getKind () == R_RISCV_SUB_ULEB128 &&
200+ " Can only have pair relocation for R_RISCV_SUB_ULEB128" );
201+
202+ auto It = SetULEB128.find ({&B, E.getOffset ()});
203+ if (It != SetULEB128.end ())
204+ return *It->second ;
205+
206+ return make_error<JITLinkError>(
207+ " No RISCV_SET_ULEB128 relocation type be found" );
208+ }
209+
192210 Error applyFixup (LinkGraph &G, Block &B, const Edge &E) const {
193211 using namespace riscv ;
194212 using namespace llvm ::support;
@@ -467,6 +485,21 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
467485 *(little32_t *)FixupPtr = static_cast <uint32_t >(Value);
468486 break ;
469487 }
488+ case R_RISCV_SET_ULEB128:
489+ break ;
490+ case R_RISCV_SUB_ULEB128: {
491+ auto SetULEB128 = getRISCVSetULEB128 (B, E);
492+ if (!SetULEB128)
493+ return SetULEB128.takeError ();
494+ uint64_t Value = SetULEB128->getTarget ().getAddress () +
495+ SetULEB128->getAddend () - E.getTarget ().getAddress () -
496+ E.getAddend ();
497+ if (overwriteULEB128 (reinterpret_cast <uint8_t *>(FixupPtr), Value) >=
498+ 0x80 )
499+ return make_error<StringError>(" ULEB128 value exceeds available space" ,
500+ inconvertibleErrorCode ());
501+ break ;
502+ }
470503 }
471504 return Error::success ();
472505 }
@@ -843,6 +876,10 @@ class ELFLinkGraphBuilder_riscv : public ELFLinkGraphBuilder<ELFT> {
843876 return EdgeKind_riscv::R_RISCV_32_PCREL;
844877 case ELF::R_RISCV_ALIGN:
845878 return EdgeKind_riscv::AlignRelaxable;
879+ case ELF::R_RISCV_SET_ULEB128:
880+ return EdgeKind_riscv::R_RISCV_SET_ULEB128;
881+ case ELF::R_RISCV_SUB_ULEB128:
882+ return EdgeKind_riscv::R_RISCV_SUB_ULEB128;
846883 }
847884
848885 return make_error<JITLinkError>(
0 commit comments