summaryrefslogtreecommitdiffstats
path: root/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp')
-rw-r--r--lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp101
1 files changed, 52 insertions, 49 deletions
diff --git a/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp b/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
index c4fc87986a6..e30dd4dede0 100644
--- a/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
+++ b/lld/lib/ReaderWriter/MachO/ArchHandler_arm.cpp
@@ -13,6 +13,8 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
+
+#include "llvm/Support/Endian.h"
#include "llvm/Support/ErrorHandling.h"
using namespace llvm::MachO;
@@ -21,6 +23,10 @@ using namespace lld::mach_o::normalized;
namespace lld {
namespace mach_o {
+using llvm::support::ulittle32_t;
+using llvm::support::little32_t;
+
+
class ArchHandler_arm : public ArchHandler {
public:
ArchHandler_arm();
@@ -191,16 +197,13 @@ private:
uint64_t targetAddress,
uint64_t inAtomAddress, bool &thumbMode,
bool targetIsThumb);
-
- const bool _swap;
};
//===----------------------------------------------------------------------===//
// ArchHandler_arm
//===----------------------------------------------------------------------===//
-ArchHandler_arm::ArchHandler_arm() :
- _swap(!MachOLinkingContext::isHostEndian(MachOLinkingContext::arch_armv7)) {}
+ArchHandler_arm::ArchHandler_arm() { }
ArchHandler_arm::~ArchHandler_arm() { }
@@ -511,14 +514,14 @@ uint32_t ArchHandler_arm::clearThumbBit(uint32_t value, const Atom *target) {
std::error_code ArchHandler_arm::getReferenceInfo(
const Relocation &reloc, const DefinedAtom *inAtom, uint32_t offsetInAtom,
- uint64_t fixupAddress, bool swap,
+ uint64_t fixupAddress, bool isBig,
FindAtomBySectionAndAddress atomFromAddress,
FindAtomBySymbolIndex atomFromSymbolIndex, Reference::KindValue *kind,
const lld::Atom **target, Reference::Addend *addend) {
typedef std::error_code E;
const uint8_t *fixupContent = &inAtom->rawContent()[offsetInAtom];
uint64_t targetAddress;
- uint32_t instruction = readU32(swap, fixupContent);
+ uint32_t instruction = *(ulittle32_t *)fixupContent;
int32_t displacement;
switch (relocPattern(reloc)) {
case ARM_THUMB_RELOC_BR22 | rPcRel | rExtern | rLength4:
@@ -626,7 +629,7 @@ ArchHandler_arm::getPairReferenceInfo(const normalized::Relocation &reloc1,
const normalized::Relocation &reloc2,
const DefinedAtom *inAtom,
uint32_t offsetInAtom,
- uint64_t fixupAddress, bool swap,
+ uint64_t fixupAddress, bool isBig,
bool scatterable,
FindAtomBySectionAndAddress atomFromAddr,
FindAtomBySymbolIndex atomFromSymbolIndex,
@@ -778,7 +781,7 @@ ArchHandler_arm::getPairReferenceInfo(const normalized::Relocation &reloc1,
}
const uint8_t *fixupContent = &inAtom->rawContent()[offsetInAtom];
std::error_code ec;
- uint32_t instruction = readU32(swap, fixupContent);
+ uint32_t instruction = *(ulittle32_t *)fixupContent;
uint32_t value;
uint32_t fromAddress;
uint32_t toAddress;
@@ -898,7 +901,7 @@ ArchHandler_arm::getPairReferenceInfo(const normalized::Relocation &reloc1,
return std::error_code();
}
-void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,
+void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *loc,
uint64_t fixupAddress,
uint64_t targetAddress,
uint64_t inAtomAddress,
@@ -906,7 +909,7 @@ void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,
if (ref.kindNamespace() != Reference::KindNamespace::mach_o)
return;
assert(ref.kindArch() == Reference::KindArch::ARM);
- int32_t *loc32 = reinterpret_cast<int32_t *>(location);
+ ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);
int32_t displacement;
uint16_t value16;
uint32_t value32;
@@ -923,76 +926,76 @@ void ArchHandler_arm::applyFixupFinal(const Reference &ref, uint8_t *location,
case thumb_bl22:
assert(thumbMode);
displacement = (targetAddress - (fixupAddress + 4)) + ref.addend();
- value32 = setDisplacementInThumbBranch(*loc32, fixupAddress, displacement,
- targetIsThumb);
- write32(*loc32, _swap, value32);
+ value32 = setDisplacementInThumbBranch(*loc32, fixupAddress,
+ displacement, targetIsThumb);
+ *loc32 = value32;
break;
case thumb_movw:
assert(thumbMode);
value16 = (targetAddress + ref.addend()) & 0xFFFF;
if (targetIsThumb)
value16 |= 1;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movt:
assert(thumbMode);
value16 = (targetAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movw_funcRel:
assert(thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;
if (targetIsThumb)
value16 |= 1;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movt_funcRel:
assert(thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case arm_b24:
case arm_bl24:
assert(!thumbMode);
displacement = (targetAddress - (fixupAddress + 8)) + ref.addend();
value32 = setDisplacementInArmBranch(*loc32, displacement, targetIsThumb);
- write32(*loc32, _swap, value32);
+ *loc32 = value32;
break;
case arm_movw:
assert(!thumbMode);
value16 = (targetAddress + ref.addend()) & 0xFFFF;
if (targetIsThumb)
value16 |= 1;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movt:
assert(!thumbMode);
value16 = (targetAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movw_funcRel:
assert(!thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;
if (targetIsThumb)
value16 |= 1;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movt_funcRel:
assert(!thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case pointer32:
if (targetIsThumb)
- write32(*loc32, _swap, targetAddress + ref.addend() + 1);
+ *loc32 = targetAddress + ref.addend() + 1;
else
- write32(*loc32, _swap, targetAddress + ref.addend());
+ *loc32 = targetAddress + ref.addend();
break;
case delta32:
if (targetIsThumb)
- write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend() + 1);
+ *loc32 = targetAddress - fixupAddress + ref.addend() + 1;
else
- write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());
+ *loc32 = targetAddress - fixupAddress + ref.addend();
break;
case lazyPointer:
case lazyImmediateLocation:
@@ -1058,15 +1061,14 @@ bool ArchHandler_arm::useExternalRelocationTo(const Atom &target) {
return false;
}
-void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
- uint8_t *location,
- uint64_t fixupAddress,
- uint64_t targetAddress,
- uint64_t inAtomAddress,
- bool &thumbMode,
- bool targetIsThumb) {
+void ArchHandler_arm::applyFixupRelocatable(const Reference &ref, uint8_t *loc,
+ uint64_t fixupAddress,
+ uint64_t targetAddress,
+ uint64_t inAtomAddress,
+ bool &thumbMode,
+ bool targetIsThumb) {
bool useExternalReloc = useExternalRelocationTo(*ref.target());
- int32_t *loc32 = reinterpret_cast<int32_t *>(location);
+ ulittle32_t *loc32 = reinterpret_cast<ulittle32_t *>(loc);
int32_t displacement;
uint16_t value16;
uint32_t value32;
@@ -1086,9 +1088,9 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
displacement = (ref.addend() - (fixupAddress + 4));
else
displacement = (targetAddress - (fixupAddress + 4)) + ref.addend();
- value32 = setDisplacementInThumbBranch(*loc32, fixupAddress, displacement,
- targetIsThumb);
- write32(*loc32, _swap, value32);
+ value32 = setDisplacementInThumbBranch(*loc32, fixupAddress,
+ displacement, targetIsThumb);
+ *loc32 = value32;
break;
case thumb_movw:
assert(thumbMode);
@@ -1096,7 +1098,7 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
value16 = ref.addend() & 0xFFFF;
else
value16 = (targetAddress + ref.addend()) & 0xFFFF;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movt:
assert(thumbMode);
@@ -1104,17 +1106,17 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
value16 = ref.addend() >> 16;
else
value16 = (targetAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movw_funcRel:
assert(thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case thumb_movt_funcRel:
assert(thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromThumbMov(*loc32, value16));
+ *loc32 = setWordFromThumbMov(*loc32, value16);
break;
case arm_b24:
case arm_bl24:
@@ -1123,8 +1125,9 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
displacement = (ref.addend() - (fixupAddress + 8));
else
displacement = (targetAddress - (fixupAddress + 8)) + ref.addend();
- value32 = setDisplacementInArmBranch(*loc32, displacement, targetIsThumb);
- write32(*loc32, _swap, value32);
+ value32 = setDisplacementInArmBranch(*loc32, displacement,
+ targetIsThumb);
+ *loc32 = value32;
break;
case arm_movw:
assert(!thumbMode);
@@ -1132,7 +1135,7 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
value16 = ref.addend() & 0xFFFF;
else
value16 = (targetAddress + ref.addend()) & 0xFFFF;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movt:
assert(!thumbMode);
@@ -1140,23 +1143,23 @@ void ArchHandler_arm::applyFixupRelocatable(const Reference &ref,
value16 = ref.addend() >> 16;
else
value16 = (targetAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movw_funcRel:
assert(!thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) & 0xFFFF;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case arm_movt_funcRel:
assert(!thumbMode);
value16 = (targetAddress - inAtomAddress + ref.addend()) >> 16;
- write32(*loc32, _swap, setWordFromArmMov(*loc32, value16));
+ *loc32 = setWordFromArmMov(*loc32, value16);
break;
case pointer32:
- write32(*loc32, _swap, targetAddress + ref.addend());
+ *loc32 = targetAddress + ref.addend();
break;
case delta32:
- write32(*loc32, _swap, targetAddress - fixupAddress + ref.addend());
+ *loc32 = targetAddress - fixupAddress + ref.addend();
break;
case lazyPointer:
case lazyImmediateLocation:
OpenPOWER on IntegriCloud