blob: a0b3dbfa5c614613e736f7ceeebd50b25ecc169a [file] [log] [blame]
Nick Kledzikabb69812012-05-31 22:34:00 +00001//===- lib/FileFormat/MachO/ReferenceKinds.cpp ----------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10
11#include "ReferenceKinds.h"
12
13#include "llvm/ADT/StringRef.h"
14
15
16namespace lld {
17namespace mach_o {
18
19
20struct Mapping {
21 const char* string;
22 Reference::Kind value;
23 uint32_t flags;
24};
25
26enum {
27 flagsNone = 0x0000,
28 flagsIsCallSite = 0x0001,
29 flagsUsesGOT = 0x0002,
30 flagsisGOTLoad = 0x0006,
31 flags32RipRel = 0x1000,
32};
33
34
35static const Mapping sKindMappingsx86_64[] = {
36 { "none", ReferenceKind::x86_64_none, flagsNone },
37 { "call32", ReferenceKind::x86_64_call32, flagsIsCallSite | flags32RipRel },
38 { "pcrel32", ReferenceKind::x86_64_pcRel32, flags32RipRel },
39 { "gotLoad32", ReferenceKind::x86_64_gotLoad32, flagsisGOTLoad | flags32RipRel },
40 { "gotUse32", ReferenceKind::x86_64_gotUse32, flagsUsesGOT | flags32RipRel },
41 { "lea32wasGot", ReferenceKind::x86_64_lea32WasGot, flags32RipRel },
42 { "lazyTarget", ReferenceKind::x86_64_lazyTarget, flagsNone },
43 { "lazyImm", ReferenceKind::x86_64_lazyImm, flagsNone },
44 { "gotTarget", ReferenceKind::x86_64_gotTarget, flagsNone },
45 { "pointer64", ReferenceKind::x86_64_pointer64, flagsNone },
46 { NULL, ReferenceKind::x86_64_none, flagsNone }
47};
48
49
50Reference::Kind ReferenceKind::fromString(StringRef kindName) {
51 for (const Mapping* p = sKindMappingsx86_64; p->string != NULL; ++p) {
52 if ( kindName.equals(p->string) )
53 return p->value;
54 }
55 assert(0 && "unknown darwin reference kind");
56 return 0;
57}
58
59StringRef ReferenceKind::toString(Reference::Kind kindValue) {
60 for (const Mapping* p = sKindMappingsx86_64; p->string != NULL; ++p) {
61 if ( kindValue == p->value)
62 return p->string;
63 }
64 return StringRef("???");
65}
66
67static const Mapping* mappingsForArch(WriterOptionsMachO::Architecture arch) {
68 switch ( arch ) {
69 case WriterOptionsMachO::arch_x86_64:
70 return sKindMappingsx86_64;
71 case WriterOptionsMachO::arch_x86:
72 case WriterOptionsMachO::arch_arm:
73 assert(0 && "references table not yet implemented for arch");
74 return nullptr;
75 }
76}
77
78bool ReferenceKind::isCallSite(WriterOptionsMachO::Architecture arch,
79 Reference::Kind kindValue) {
80 for (const Mapping* p = mappingsForArch(arch); p->string != NULL; ++p) {
81 if ( kindValue == p->value )
82 return (p->flags & flagsIsCallSite);
83 }
84 return false;
85}
86
87bool ReferenceKind::isRipRel32(Reference::Kind kindValue) {
88 for (const Mapping* p = sKindMappingsx86_64; p->string != NULL; ++p) {
89 if ( kindValue == p->value )
90 return (p->flags & flags32RipRel);
91 }
92 return false;
93}
94
95
96
97
98
99} // namespace mach_o
100} // namespace lld
101
102
103