@@ -154,18 +154,22 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
154
154
std::unique_ptr<LinkGraph> G, PassConfiguration PassConfig)
155
155
: JITLinker(std::move(Ctx), std::move(G), std::move(PassConfig)) {
156
156
JITLinkerBase::getPassConfig ().PostAllocationPasses .push_back (
157
- [this ](LinkGraph &G) { return gatherRISCVPCRelHi20 (G); });
157
+ [this ](LinkGraph &G) { return gatherRISCVPairs (G); });
158
158
}
159
159
160
160
private:
161
161
DenseMap<std::pair<const Block *, orc::ExecutorAddrDiff>, const Edge *>
162
162
RelHi20;
163
+ DenseMap<std::pair<const Block *, orc::ExecutorAddrDiff>, const Edge *>
164
+ SetULEB128;
163
165
164
- Error gatherRISCVPCRelHi20 (LinkGraph &G) {
166
+ Error gatherRISCVPairs (LinkGraph &G) {
165
167
for (Block *B : G.blocks ())
166
168
for (Edge &E : B->edges ())
167
169
if (E.getKind () == R_RISCV_PCREL_HI20)
168
170
RelHi20[{B, E.getOffset ()}] = &E;
171
+ else if (E.getKind () == R_RISCV_SET_ULEB128)
172
+ SetULEB128[{B, E.getOffset ()}] = &E;
169
173
170
174
return Error::success ();
171
175
}
@@ -189,6 +193,20 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
189
193
" for LO12 PCREL relocation type" );
190
194
}
191
195
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
+
192
210
Error applyFixup (LinkGraph &G, Block &B, const Edge &E) const {
193
211
using namespace riscv ;
194
212
using namespace llvm ::support;
@@ -467,6 +485,21 @@ class ELFJITLinker_riscv : public JITLinker<ELFJITLinker_riscv> {
467
485
*(little32_t *)FixupPtr = static_cast <uint32_t >(Value);
468
486
break ;
469
487
}
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
+ }
470
503
}
471
504
return Error::success ();
472
505
}
@@ -843,6 +876,10 @@ class ELFLinkGraphBuilder_riscv : public ELFLinkGraphBuilder<ELFT> {
843
876
return EdgeKind_riscv::R_RISCV_32_PCREL;
844
877
case ELF::R_RISCV_ALIGN:
845
878
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;
846
883
}
847
884
848
885
return make_error<JITLinkError>(
0 commit comments