/src/keystone/llvm/include/llvm/MC/MCSymbolMachO.h
Line | Count | Source |
1 | | //===- MCSymbolMachO.h - ---------------------------------------*- C++ -*-===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | #ifndef LLVM_MC_MCSYMBOLMACHO_H |
10 | | #define LLVM_MC_MCSYMBOLMACHO_H |
11 | | |
12 | | #include "llvm/MC/MCSymbol.h" |
13 | | |
14 | | namespace llvm_ks { |
15 | | class MCSymbolMachO : public MCSymbol { |
16 | | /// \brief We store the value for the 'desc' symbol field in the |
17 | | /// lowest 16 bits of the implementation defined flags. |
18 | | enum MachOSymbolFlags : uint16_t { // See <mach-o/nlist.h>. |
19 | | SF_DescFlagsMask = 0xFFFF, |
20 | | |
21 | | // Reference type flags. |
22 | | SF_ReferenceTypeMask = 0x0007, |
23 | | SF_ReferenceTypeUndefinedNonLazy = 0x0000, |
24 | | SF_ReferenceTypeUndefinedLazy = 0x0001, |
25 | | SF_ReferenceTypeDefined = 0x0002, |
26 | | SF_ReferenceTypePrivateDefined = 0x0003, |
27 | | SF_ReferenceTypePrivateUndefinedNonLazy = 0x0004, |
28 | | SF_ReferenceTypePrivateUndefinedLazy = 0x0005, |
29 | | |
30 | | // Other 'desc' flags. |
31 | | SF_ThumbFunc = 0x0008, |
32 | | SF_NoDeadStrip = 0x0020, |
33 | | SF_WeakReference = 0x0040, |
34 | | SF_WeakDefinition = 0x0080, |
35 | | SF_SymbolResolver = 0x0100, |
36 | | |
37 | | // Common alignment |
38 | | SF_CommonAlignmentMask = 0xF0FF, |
39 | | SF_CommonAlignmentShift = 8 |
40 | | }; |
41 | | |
42 | | public: |
43 | | MCSymbolMachO(const StringMapEntry<bool> *Name, bool isTemporary) |
44 | 0 | : MCSymbol(SymbolKindMachO, Name, isTemporary) {} |
45 | | |
46 | | // Reference type methods. |
47 | | |
48 | 0 | void clearReferenceType() const { |
49 | 0 | modifyFlags(0, SF_ReferenceTypeMask); |
50 | 0 | } |
51 | | |
52 | 0 | void setReferenceTypeUndefinedLazy(bool Value) const { |
53 | 0 | modifyFlags(Value ? SF_ReferenceTypeUndefinedLazy : 0, |
54 | 0 | SF_ReferenceTypeUndefinedLazy); |
55 | 0 | } |
56 | | |
57 | | // Other 'desc' methods. |
58 | | |
59 | 0 | void setThumbFunc() const { |
60 | 0 | modifyFlags(SF_ThumbFunc, SF_ThumbFunc); |
61 | 0 | } |
62 | | |
63 | 0 | bool isNoDeadStrip() const { |
64 | 0 | return getFlags() & SF_NoDeadStrip; |
65 | 0 | } |
66 | 0 | void setNoDeadStrip() const { |
67 | 0 | modifyFlags(SF_NoDeadStrip, SF_NoDeadStrip); |
68 | 0 | } |
69 | | |
70 | 0 | bool isWeakReference() const { |
71 | 0 | return getFlags() & SF_WeakReference; |
72 | 0 | } |
73 | 0 | void setWeakReference() const { |
74 | 0 | modifyFlags(SF_WeakReference, SF_WeakReference); |
75 | 0 | } |
76 | | |
77 | 0 | bool isWeakDefinition() const { |
78 | 0 | return getFlags() & SF_WeakDefinition; |
79 | 0 | } |
80 | 0 | void setWeakDefinition() const { |
81 | 0 | modifyFlags(SF_WeakDefinition, SF_WeakDefinition); |
82 | 0 | } |
83 | | |
84 | 0 | bool isSymbolResolver() const { |
85 | 0 | return getFlags() & SF_SymbolResolver; |
86 | 0 | } |
87 | 0 | void setSymbolResolver() const { |
88 | 0 | modifyFlags(SF_SymbolResolver, SF_SymbolResolver); |
89 | 0 | } |
90 | | |
91 | 0 | void setDesc(unsigned Value) const { |
92 | 0 | assert(Value == (Value & SF_DescFlagsMask) && |
93 | 0 | "Invalid .desc value!"); |
94 | 0 | setFlags(Value & SF_DescFlagsMask); |
95 | 0 | } |
96 | | |
97 | | /// \brief Get the encoded value of the flags as they will be emitted in to |
98 | | /// the MachO binary |
99 | 0 | uint16_t getEncodedFlags() const { |
100 | 0 | uint16_t Flags = getFlags(); |
101 | 0 |
|
102 | 0 | // Common alignment is packed into the 'desc' bits. |
103 | 0 | if (isCommon()) { |
104 | 0 | if (unsigned Align = getCommonAlignment()) { |
105 | 0 | unsigned Log2Size = Log2_32(Align); |
106 | 0 | assert((1U << Log2Size) == Align && "Invalid 'common' alignment!"); |
107 | 0 | if (Log2Size > 15) |
108 | 0 | report_fatal_error("invalid 'common' alignment '" + |
109 | 0 | Twine(Align) + "' for '" + getName() + "'", |
110 | 0 | false); |
111 | 0 | Flags = (Flags & SF_CommonAlignmentMask) | |
112 | 0 | (Log2Size << SF_CommonAlignmentShift); |
113 | 0 | } |
114 | 0 | } |
115 | 0 |
|
116 | 0 | return Flags; |
117 | 0 | } |
118 | | |
119 | 0 | static bool classof(const MCSymbol *S) { return S->isMachO(); } |
120 | | }; |
121 | | } |
122 | | |
123 | | #endif |