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