blob: d1d56b2860c66f036be1e503a3591e604373c538 [file] [log] [blame]
//===- Platforms/Darwin/DarwinReferenceKinds.cpp --------------------------===//
//
// The LLVM Linker
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "DarwinReferenceKinds.h"
#include "llvm/ADT/StringRef.h"
namespace lld {
namespace darwin {
struct Mapping {
const char* string;
Reference::Kind value;
uint32_t flags;
};
enum {
flagsNone = 0x0000,
flagsIsCallSite = 0x0001,
flagsUsesGOT = 0x0002,
flagsisGOTLoad = 0x0006,
flags32RipRel = 0x1000,
};
static const Mapping sKindMappings[] = {
{ "call32", ReferenceKind::call32, flagsIsCallSite | flags32RipRel },
{ "pcrel32", ReferenceKind::pcRel32, flags32RipRel },
{ "gotLoad32", ReferenceKind::gotLoad32, flagsisGOTLoad | flags32RipRel },
{ "gotUse32", ReferenceKind::gotUse32, flagsUsesGOT | flags32RipRel },
{ "lea32wasGot", ReferenceKind::lea32WasGot, flags32RipRel },
{ "lazyTarget", ReferenceKind::lazyTarget, flagsNone },
{ "lazyImm", ReferenceKind::lazyImm, flagsNone },
{ "gotTarget", ReferenceKind::gotTarget, flagsNone },
{ "pointer64", ReferenceKind::pointer64, flagsNone },
{ NULL, ReferenceKind::none, flagsNone }
};
Reference::Kind ReferenceKind::fromString(StringRef kindName) {
for (const Mapping* p = sKindMappings; p->string != NULL; ++p) {
if ( kindName.equals(p->string) )
return p->value;
}
assert(0 && "unknown darwin reference kind");
return ReferenceKind::none;
}
StringRef ReferenceKind::toString(Reference::Kind kindValue) {
for (const Mapping* p = sKindMappings; p->string != NULL; ++p) {
if ( kindValue == p->value)
return p->string;
}
return StringRef("???");
}
bool ReferenceKind::isCallSite(Reference::Kind kindValue) {
for (const Mapping* p = sKindMappings; p->string != NULL; ++p) {
if ( kindValue == p->value )
return (p->flags & flagsIsCallSite);
}
return false;
}
bool ReferenceKind::isRipRel32(Reference::Kind kindValue) {
for (const Mapping* p = sKindMappings; p->string != NULL; ++p) {
if ( kindValue == p->value )
return (p->flags & flags32RipRel);
}
return false;
}
} // namespace darwin
} // namespace lld