Avoids some code duplication.
/// only
const char *getEdgeKindName(Edge::Kind K);
-/// Returns true if the given uint32_t value is in range for a uint16_t.
-inline bool isInRangeForImmU16(uint32_t Value) {
- return Value <= std::numeric_limits<uint16_t>::max();
-}
-
-/// Returns true if the given int32_t value is in range for an int16_t.
-inline bool isInRangeForImmS16(int32_t Value) {
- return (Value >= std::numeric_limits<int16_t>::min() &&
- Value <= std::numeric_limits<int16_t>::max());
-}
-
-/// Returns true if the given int64_t value is in range for an int32_t.
-inline bool isInRangeForImmS32(int64_t Value) {
- return (Value >= std::numeric_limits<int32_t>::min() &&
- Value <= std::numeric_limits<int32_t>::max());
-}
-
/// Apply fixup expression for edge to block content.
inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E,
const Symbol *GOTSymbol) {
case i386::Pointer16: {
uint32_t Value = E.getTarget().getAddress().getValue() + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmU16(Value)))
+ if (LLVM_LIKELY(isUInt<16>(Value)))
*(ulittle16_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
case i386::PCRel16: {
int32_t Value =
E.getTarget().getAddress() - (FixupAddress + 4) + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmS16(Value)))
+ if (LLVM_LIKELY(isInt<16>(Value)))
*(little16_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
#include "llvm/ExecutionEngine/JITLink/JITLink.h"
#include "llvm/ExecutionEngine/JITLink/TableManager.h"
-#include <limits>
-
namespace llvm {
namespace jitlink {
namespace x86_64 {
/// only.
const char *getEdgeKindName(Edge::Kind K);
-/// Returns true if the given uint64_t value is in range for a uint32_t.
-inline bool isInRangeForImmU32(uint64_t Value) {
- return Value <= std::numeric_limits<uint32_t>::max();
-}
-
-/// Returns true if the given int64_t value is in range for an int32_t.
-inline bool isInRangeForImmS32(int64_t Value) {
- return (Value >= std::numeric_limits<int32_t>::min() &&
- Value <= std::numeric_limits<int32_t>::max());
-}
-
/// Apply fixup expression for edge to block content.
inline Error applyFixup(LinkGraph &G, Block &B, const Edge &E,
const Symbol *GOTSymbol) {
case Pointer32: {
uint64_t Value = E.getTarget().getAddress().getValue() + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmU32(Value)))
+ if (LLVM_LIKELY(isUInt<32>(Value)))
*(ulittle32_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
}
case Pointer32Signed: {
int64_t Value = E.getTarget().getAddress().getValue() + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmS32(Value)))
+ if (LLVM_LIKELY(isInt<32>(Value)))
*(little32_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
case PCRel32TLVPLoadREXRelaxable: {
int64_t Value =
E.getTarget().getAddress() - (FixupAddress + 4) + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmS32(Value)))
+ if (LLVM_LIKELY(isInt<32>(Value)))
*(little32_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
case Delta32: {
int64_t Value = E.getTarget().getAddress() - FixupAddress + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmS32(Value)))
+ if (LLVM_LIKELY(isInt<32>(Value)))
*(little32_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
case NegDelta32: {
int64_t Value = FixupAddress - E.getTarget().getAddress() + E.getAddend();
- if (LLVM_LIKELY(isInRangeForImmS32(Value)))
+ if (LLVM_LIKELY(isInt<32>(Value)))
*(little32_t *)FixupPtr = Value;
else
return makeTargetOutOfRangeError(G, B, E);
orc::ExecutorAddr TargetAddr = GOTTarget.getAddress();
int64_t Displacement = TargetAddr - EdgeAddr + 4;
- if (isInRangeForImmS32(Displacement)) {
+ if (isInt<32>(Displacement)) {
E.setKind(i386::BranchPCRel32);
E.setTarget(GOTTarget);
LLVM_DEBUG({
orc::ExecutorAddr TargetAddr = GOTTarget.getAddress();
orc::ExecutorAddr EdgeAddr = B->getFixupAddress(E);
int64_t Displacement = TargetAddr - EdgeAddr + 4;
- bool TargetInRangeForImmU32 = isInRangeForImmU32(TargetAddr.getValue());
- bool DisplacementInRangeForImmS32 = isInRangeForImmS32(Displacement);
+ bool TargetInRangeForImmU32 = isUInt<32>(TargetAddr.getValue());
+ bool DisplacementInRangeForImmS32 = isInt<32>(Displacement);
// If both of the Target and displacement is out of range, then
// there isn't optimization chance.
orc::ExecutorAddr TargetAddr = GOTTarget.getAddress();
int64_t Displacement = TargetAddr - EdgeAddr + 4;
- if (isInRangeForImmS32(Displacement)) {
+ if (isInt<32>(Displacement)) {
E.setKind(x86_64::BranchPCRel32);
E.setTarget(GOTTarget);
LLVM_DEBUG({