Lines Matching defs:pReloc

30 typedef Relocator::Result (*ApplyFunctionType)(Relocation& pReloc,
145 void ARMRelocator::checkValidReloc(Relocation& pReloc) const
151 switch(pReloc.type()) {
165 error(diag::non_pic_relocation) << (int)pReloc.type()
166 << pReloc.symInfo()->name();
172 ARMRelocator::scanLocalReloc(Relocation& pReloc, const LDSection& pSection)
175 ResolveInfo* rsym = pReloc.symInfo();
177 switch(pReloc.type()){
184 pReloc.setType(llvm::ELF::R_ARM_ABS32);
210 error(diag::non_pic_relocation) << (int)pReloc.type()
211 << pReloc.symInfo()->name();
225 pReloc.setType(llvm::ELF::R_ARM_GOT_PREL);
252 fatal(diag::base_relocation) << (int)pReloc.type() << rsym->name()
262 fatal(diag::dynamic_relocation) << (int)pReloc.type();
271 void ARMRelocator::scanGlobalReloc(Relocation& pReloc,
276 ResolveInfo* rsym = pReloc.symInfo();
278 switch(pReloc.type()) {
285 pReloc.setType(llvm::ELF::R_ARM_ABS32);
316 if (getTarget().symbolNeedsCopyReloc(pReloc, *rsym)) {
321 checkValidReloc(pReloc);
343 fatal(diag::base_relocation) << (int)pReloc.type() << rsym->name()
391 if (getTarget().symbolNeedsCopyReloc(pReloc, *rsym)) {
396 checkValidReloc(pReloc);
450 pReloc.setType(llvm::ELF::R_ARM_GOT_PREL);
478 fatal(diag::dynamic_relocation) << (int)pReloc.type();
487 void ARMRelocator::scanRelocation(Relocation& pReloc,
493 ResolveInfo* rsym = pReloc.symInfo();
497 pReloc.updateAddend();
508 scanLocalReloc(pReloc, pSection);
512 scanGlobalReloc(pReloc, pBuilder, pSection);
523 static Relocator::DWord getThumbBit(const Relocation& pReloc)
528 ((!pReloc.symInfo()->isUndef() || pReloc.symInfo()->isDyn()) &&
529 (pReloc.symInfo()->type() == ResolveInfo::Function) &&
530 ((pReloc.symValue() & 0x1) != 0))?
580 ARMGOTEntry& helper_get_GOT_and_init(Relocation& pReloc,
584 ResolveInfo* rsym = pReloc.symInfo();
594 got_entry->setValue(pReloc.symValue());
603 got_entry->setValue(pReloc.symValue());
630 ARMRelocator::Address helper_GOT(Relocation& pReloc, ARMRelocator& pParent)
632 ARMGOTEntry& got_entry = helper_get_GOT_and_init(pReloc, pParent);
638 ARMPLT1& helper_get_PLT_and_init(Relocation& pReloc, ARMRelocator& pParent)
641 ResolveInfo* rsym = pReloc.symInfo();
679 ARMRelocator::Address helper_PLT(Relocation& pReloc, ARMRelocator& pParent)
681 ARMPLT1& plt_entry = helper_get_PLT_and_init(pReloc, pParent);
686 // its FragmentRef to pReloc->targetFrag() and its ResolveInfo to
687 // pReloc->symInfo()
689 void helper_DynRel(Relocation& pReloc,
694 ResolveInfo* rsym = pReloc.symInfo();
699 rel_entry.targetRef() = pReloc.targetRef();
809 ARMRelocator::Result none(Relocation& pReloc, ARMRelocator& pParent)
815 ARMRelocator::Result abs32(Relocation& pReloc, ARMRelocator& pParent)
817 ResolveInfo* rsym = pReloc.symInfo();
818 ARMRelocator::DWord T = getThumbBit(pReloc);
819 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
820 ARMRelocator::DWord S = pReloc.symValue();
824 LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
829 pReloc.target() = (S + A) | T;
835 helper_DynRel(pReloc, llvm::ELF::R_ARM_RELATIVE, pParent);
836 pReloc.target() = (S + A) | T ;
843 S = helper_PLT(pReloc, pParent);
851 helper_DynRel(pReloc, llvm::ELF::R_ARM_RELATIVE, pParent);
854 helper_DynRel(pReloc, pReloc.type(), pParent);
862 pReloc.target() = (S + A) | T;
867 ARMRelocator::Result rel32(Relocation& pReloc, ARMRelocator& pParent)
870 ARMRelocator::Address S = pReloc.symValue();
871 ARMRelocator::DWord T = getThumbBit(pReloc);
872 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
877 if (!pReloc.symInfo()->isLocal()) {
878 if (pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT) {
879 S = helper_PLT(pReloc, pParent);
885 pReloc.target() = ((S + A) | T) - pReloc.place();
891 ARMRelocator::Result base_prel(Relocation& pReloc, ARMRelocator& pParent)
894 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
895 pReloc.target() = pReloc.symValue() + A - pReloc.place();
900 ARMRelocator::Result gotoff32(Relocation& pReloc, ARMRelocator& pParent)
902 ARMRelocator::DWord T = getThumbBit(pReloc);
903 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
905 ARMRelocator::Address S = pReloc.symValue();
909 pReloc.target() = ((S + A) | T) - GOT_ORG;
914 ARMRelocator::Result got_brel(Relocation& pReloc, ARMRelocator& pParent)
916 if (!(pReloc.symInfo()->reserved() &
920 ARMRelocator::Address GOT_S = helper_GOT(pReloc, pParent);
921 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
924 pReloc.target() = GOT_S + A - GOT_ORG;
929 ARMRelocator::Result got_prel(Relocation& pReloc, ARMRelocator& pParent)
931 if (!(pReloc.symInfo()->reserved() &
935 ARMRelocator::Address GOT_S = helper_GOT(pReloc, pParent);
936 ARMRelocator::DWord A = pReloc.target() + pReloc.addend();
937 ARMRelocator::Address P = pReloc.place();
940 pReloc.target() = GOT_S + A - P;
945 ARMRelocator::Result thm_jump11(Relocation& pReloc, ARMRelocator& pParent)
947 ARMRelocator::DWord P = pReloc.place();
949 helper_sign_extend((pReloc.target() & 0x07ff) << 1, 11) +
950 pReloc.addend();
952 ARMRelocator::Address S = pReloc.symValue();
953 if (pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT)
954 S = helper_PLT(pReloc, pParent);
960 pReloc.target() = (pReloc.target() & 0xFFFFF800u) | ((X & 0x0FFEu) >> 1);
968 ARMRelocator::Result call(Relocation& pReloc, ARMRelocator& pParent)
973 if (pReloc.symInfo()->isWeak() &&
974 pReloc.symInfo()->isUndef() &&
975 !pReloc.symInfo()->isDyn() &&
976 !(pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT)) {
978 pReloc.target() = (pReloc.target() & 0xf0000000U) | 0x01a00000;
982 ARMRelocator::DWord T = getThumbBit(pReloc);
984 helper_sign_extend((pReloc.target() & 0x00FFFFFFu) << 2, 26) +
985 pReloc.addend();
986 ARMRelocator::Address P = pReloc.place();
987 ARMRelocator::Address S = pReloc.symValue();
992 if (pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT) {
993 S = helper_PLT(pReloc, pParent);
1003 if (pReloc.type() == llvm::ELF::R_ARM_JUMP24)
1005 if (pReloc.type() == llvm::ELF::R_ARM_PC24)
1008 pReloc.target() = (pReloc.target() & 0xffffff) |
1018 pReloc.target() = (pReloc.target() & 0xFF000000u) | ((X & 0x03FFFFFEu) >> 2);
1024 ARMRelocator::Result thm_call(Relocation& pReloc, ARMRelocator& pParent)
1029 if (pReloc.symInfo()->isWeak() &&
1030 pReloc.symInfo()->isUndef() &&
1031 !pReloc.symInfo()->isDyn() &&
1032 !(pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT)) {
1033 pReloc.target() = (0xe000U << 16) | 0xbf00U;
1038 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1039 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1041 ARMRelocator::DWord T = getThumbBit(pReloc);
1044 ARMRelocator::Address P = pReloc.place();
1048 if (pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT) {
1049 S = helper_PLT(pReloc, pParent);
1053 S = pReloc.symValue();
1066 if (pReloc.type() == llvm::ELF::R_ARM_THM_JUMP24)
1090 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = upper_inst;
1091 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = lower_inst;
1097 ARMRelocator::Result movw_abs_nc(Relocation& pReloc, ARMRelocator& pParent)
1099 ResolveInfo* rsym = pReloc.symInfo();
1100 ARMRelocator::Address S = pReloc.symValue();
1101 ARMRelocator::DWord T = getThumbBit(pReloc);
1103 helper_extract_movw_movt_addend(pReloc.target()) + pReloc.addend();
1107 LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
1114 S = helper_PLT(pReloc, pParent);
1121 pReloc.target() = helper_insert_val_movw_movt_inst(
1122 pReloc.target() + pReloc.addend(), X);
1127 ARMRelocator::Result movw_prel_nc(Relocation& pReloc, ARMRelocator& pParent)
1129 ARMRelocator::Address S = pReloc.symValue();
1130 ARMRelocator::DWord T = getThumbBit(pReloc);
1131 ARMRelocator::DWord P = pReloc.place();
1133 helper_extract_movw_movt_addend(pReloc.target()) + pReloc.addend();
1141 pReloc.target() = helper_insert_val_movw_movt_inst(pReloc.target(), X);
1147 ARMRelocator::Result movt_abs(Relocation& pReloc, ARMRelocator& pParent)
1149 ResolveInfo* rsym = pReloc.symInfo();
1150 ARMRelocator::Address S = pReloc.symValue();
1152 helper_extract_movw_movt_addend(pReloc.target()) + pReloc.addend();
1154 LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
1161 S = helper_PLT(pReloc, pParent);
1168 pReloc.target() = helper_insert_val_movw_movt_inst(pReloc.target(), X);
1173 ARMRelocator::Result movt_prel(Relocation& pReloc, ARMRelocator& pParent)
1175 ARMRelocator::Address S = pReloc.symValue();
1176 ARMRelocator::DWord P = pReloc.place();
1178 helper_extract_movw_movt_addend(pReloc.target()) + pReloc.addend();
1182 pReloc.target() = helper_insert_val_movw_movt_inst(pReloc.target(), X);
1187 ARMRelocator::Result thm_movw_abs_nc(Relocation& pReloc, ARMRelocator& pParent)
1189 ResolveInfo* rsym = pReloc.symInfo();
1190 ARMRelocator::Address S = pReloc.symValue();
1191 ARMRelocator::DWord T = getThumbBit(pReloc);
1196 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1197 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1200 helper_extract_thumb_movw_movt_addend(val) + pReloc.addend();
1202 LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
1208 S = helper_PLT(pReloc, pParent);
1215 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = val >> 16;
1216 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = val & 0xFFFFu;
1222 ARMRelocator::Result thm_movw_prel_nc(Relocation& pReloc, ARMRelocator& pParent)
1224 ARMRelocator::Address S = pReloc.symValue();
1225 ARMRelocator::DWord T = getThumbBit(pReloc);
1226 ARMRelocator::DWord P = pReloc.place();
1231 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1232 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1235 helper_extract_thumb_movw_movt_addend(val) + pReloc.addend();
1239 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = val >> 16;
1240 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = val & 0xFFFFu;
1247 ARMRelocator::Result thm_movw_brel(Relocation& pReloc, ARMRelocator& pParent)
1249 ARMRelocator::Address S = pReloc.symValue();
1250 ARMRelocator::DWord T = getThumbBit(pReloc);
1251 ARMRelocator::DWord P = pReloc.place();
1256 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1257 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1260 helper_extract_thumb_movw_movt_addend(val) + pReloc.addend();
1265 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = val >> 16;
1266 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = val & 0xFFFFu;
1272 ARMRelocator::Result thm_movt_abs(Relocation& pReloc, ARMRelocator& pParent)
1274 ResolveInfo* rsym = pReloc.symInfo();
1275 ARMRelocator::Address S = pReloc.symValue();
1278 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1279 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1282 helper_extract_thumb_movw_movt_addend(val) + pReloc.addend();
1284 LDSection& target_sect = pReloc.targetRef().frag()->getParent()->getSection();
1290 S = helper_PLT(pReloc, pParent);
1301 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = val >> 16;
1302 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = val & 0xFFFFu;
1309 ARMRelocator::Result thm_movt_prel(Relocation& pReloc, ARMRelocator& pParent)
1311 ARMRelocator::Address S = pReloc.symValue();
1312 ARMRelocator::DWord P = pReloc.place();
1315 uint16_t upper_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()));
1316 uint16_t lower_inst = *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1);
1319 helper_extract_thumb_movw_movt_addend(val) + pReloc.addend();
1324 *(reinterpret_cast<uint16_t*>(&pReloc.target())) = val >> 16;
1325 *(reinterpret_cast<uint16_t*>(&pReloc.target()) + 1) = val & 0xFFFFu;
1331 ARMRelocator::Result prel31(Relocation& pReloc, ARMRelocator& pParent)
1333 ARMRelocator::DWord target = pReloc.target();
1334 ARMRelocator::DWord T = getThumbBit(pReloc);
1335 ARMRelocator::DWord A = helper_sign_extend(target, 31) + pReloc.addend();
1336 ARMRelocator::DWord P = pReloc.place();
1337 ARMRelocator::Address S = pReloc.symValue();
1342 if ( pReloc.symInfo()->reserved() & ARMRelocator::ReservePLT) {
1343 S = helper_PLT(pReloc, pParent);
1348 pReloc.target() = helper_bit_select(target, X, 0x7fffffffU);
1357 ARMRelocator::Result tls(Relocation& pReloc, ARMRelocator& pParent)
1362 ARMRelocator::Result unsupport(Relocation& pReloc, ARMRelocator& pParent)