@@ -395,6 +395,7 @@ Expected<int64_t> readAddendData(LinkGraph &G, Block &B, Edge::OffsetT Offset,
395
395
switch (Kind) {
396
396
case Data_Delta32:
397
397
case Data_Pointer32:
398
+ case Data_RequestGOTAndTransformToDelta32:
398
399
return SignExtend64<32 >(support::endian::read32 (FixupPtr, Endian));
399
400
default :
400
401
return make_error<JITLinkError>(
@@ -464,15 +465,6 @@ Error applyFixupData(LinkGraph &G, Block &B, const Edge &E) {
464
465
char *BlockWorkingMem = B.getAlreadyMutableContent ().data ();
465
466
char *FixupPtr = BlockWorkingMem + E.getOffset ();
466
467
467
- auto Write32 = [FixupPtr, Endian = G.getEndianness ()](int64_t Value) {
468
- assert (isInt<32 >(Value) && " Must be in signed 32-bit range" );
469
- uint32_t Imm = static_cast <int32_t >(Value);
470
- if (LLVM_LIKELY (Endian == endianness::little))
471
- endian::write32<endianness::little>(FixupPtr, Imm);
472
- else
473
- endian::write32<endianness::big>(FixupPtr, Imm);
474
- };
475
-
476
468
Edge::Kind Kind = E.getKind ();
477
469
uint64_t FixupAddress = (B.getAddress () + E.getOffset ()).getValue ();
478
470
int64_t Addend = E.getAddend ();
@@ -487,16 +479,24 @@ Error applyFixupData(LinkGraph &G, Block &B, const Edge &E) {
487
479
int64_t Value = TargetAddress - FixupAddress + Addend;
488
480
if (!isInt<32 >(Value))
489
481
return makeTargetOutOfRangeError (G, B, E);
490
- Write32 (Value);
482
+ if (LLVM_LIKELY (G.getEndianness () == endianness::little))
483
+ endian::write32le (FixupPtr, Value);
484
+ else
485
+ endian::write32be (FixupPtr, Value);
491
486
return Error::success ();
492
487
}
493
488
case Data_Pointer32: {
494
489
int64_t Value = TargetAddress + Addend;
495
- if (!isInt <32 >(Value))
490
+ if (!isUInt <32 >(Value))
496
491
return makeTargetOutOfRangeError (G, B, E);
497
- Write32 (Value);
492
+ if (LLVM_LIKELY (G.getEndianness () == endianness::little))
493
+ endian::write32le (FixupPtr, Value);
494
+ else
495
+ endian::write32be (FixupPtr, Value);
498
496
return Error::success ();
499
497
}
498
+ case Data_RequestGOTAndTransformToDelta32:
499
+ llvm_unreachable (" Should be transformed" );
500
500
default :
501
501
return make_error<JITLinkError>(
502
502
" In graph " + G.getName () + " , section " + B.getSection ().getName () +
@@ -678,6 +678,52 @@ Error applyFixupThumb(LinkGraph &G, Block &B, const Edge &E,
678
678
}
679
679
}
680
680
681
+ const uint8_t GOTEntryInit[] = {
682
+ 0x00 ,
683
+ 0x00 ,
684
+ 0x00 ,
685
+ 0x00 ,
686
+ };
687
+
688
+ // / Create a new node in the link-graph for the given pointer value.
689
+ template <size_t Size>
690
+ static Block &allocPointer (LinkGraph &G, Section &S,
691
+ const uint8_t (&Content)[Size]) {
692
+ static_assert (Size == 4 , " Pointers are 32-bit" );
693
+ constexpr uint64_t Alignment = 4 ;
694
+ ArrayRef<char > Init (reinterpret_cast <const char *>(Content), Size);
695
+ return G.createContentBlock (S, Init, orc::ExecutorAddr (), Alignment, 0 );
696
+ }
697
+
698
+ Symbol &GOTBuilder::createEntry (LinkGraph &G, Symbol &Target) {
699
+ if (!GOTSection)
700
+ GOTSection = &G.createSection (getSectionName (), orc::MemProt::Read);
701
+ Block &B = allocPointer (G, *GOTSection, GOTEntryInit);
702
+ constexpr int64_t GOTEntryAddend = 0 ;
703
+ B.addEdge (Data_Pointer32, 0 , Target, GOTEntryAddend);
704
+ return G.addAnonymousSymbol (B, 0 , B.getSize (), false , false );
705
+ }
706
+
707
+ bool GOTBuilder::visitEdge (LinkGraph &G, Block *B, Edge &E) {
708
+ Edge::Kind KindToSet = Edge::Invalid;
709
+ switch (E.getKind ()) {
710
+ case aarch32::Data_RequestGOTAndTransformToDelta32: {
711
+ KindToSet = aarch32::Data_Delta32;
712
+ break ;
713
+ }
714
+ default :
715
+ return false ;
716
+ }
717
+ LLVM_DEBUG (dbgs () << " Transforming " << G.getEdgeKindName (E.getKind ())
718
+ << " edge at " << B->getFixupAddress (E) << " ("
719
+ << B->getAddress () << " + "
720
+ << formatv (" {0:x}" , E.getOffset ()) << " ) into "
721
+ << G.getEdgeKindName (KindToSet) << " \n " );
722
+ E.setKind (KindToSet);
723
+ E.setTarget (getEntryForTarget (G, E.getTarget ()));
724
+ return true ;
725
+ }
726
+
681
727
const uint8_t Thumbv7ABS[] = {
682
728
0x40 , 0xf2 , 0x00 , 0x0c , // movw r12, #0x0000 ; lower 16-bit
683
729
0xc0 , 0xf2 , 0x00 , 0x0c , // movt r12, #0x0000 ; upper 16-bit
@@ -709,6 +755,7 @@ const char *getEdgeKindName(Edge::Kind K) {
709
755
switch (K) {
710
756
KIND_NAME_CASE (Data_Delta32)
711
757
KIND_NAME_CASE (Data_Pointer32)
758
+ KIND_NAME_CASE (Data_RequestGOTAndTransformToDelta32)
712
759
KIND_NAME_CASE (Arm_Call)
713
760
KIND_NAME_CASE (Arm_Jump24)
714
761
KIND_NAME_CASE (Arm_MovwAbsNC)
0 commit comments