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