1 //===- MCSymbolCOFF.h - ----------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_MC_MCSYMBOLCOFF_H 10 #define LLVM_MC_MCSYMBOLCOFF_H 11 12 #include "llvm/MC/MCSymbol.h" 13 #include <cstdint> 14 15 namespace llvm { 16 17 class MCSymbolCOFF : public MCSymbol { 18 /// This corresponds to the e_type field of the COFF symbol. 19 mutable uint16_t Type = 0; 20 21 enum SymbolFlags : uint16_t { 22 SF_ClassMask = 0x00FF, 23 SF_ClassShift = 0, 24 25 SF_WeakExternal = 0x0100, 26 SF_SafeSEH = 0x0200, 27 }; 28 29 public: MCSymbolCOFF(const StringMapEntry<bool> * Name,bool isTemporary)30 MCSymbolCOFF(const StringMapEntry<bool> *Name, bool isTemporary) 31 : MCSymbol(SymbolKindCOFF, Name, isTemporary) {} 32 getType()33 uint16_t getType() const { 34 return Type; 35 } setType(uint16_t Ty)36 void setType(uint16_t Ty) const { 37 Type = Ty; 38 } 39 getClass()40 uint16_t getClass() const { 41 return (getFlags() & SF_ClassMask) >> SF_ClassShift; 42 } setClass(uint16_t StorageClass)43 void setClass(uint16_t StorageClass) const { 44 modifyFlags(StorageClass << SF_ClassShift, SF_ClassMask); 45 } 46 isWeakExternal()47 bool isWeakExternal() const { 48 return getFlags() & SF_WeakExternal; 49 } setIsWeakExternal()50 void setIsWeakExternal() const { 51 modifyFlags(SF_WeakExternal, SF_WeakExternal); 52 } 53 isSafeSEH()54 bool isSafeSEH() const { 55 return getFlags() & SF_SafeSEH; 56 } setIsSafeSEH()57 void setIsSafeSEH() const { 58 modifyFlags(SF_SafeSEH, SF_SafeSEH); 59 } 60 classof(const MCSymbol * S)61 static bool classof(const MCSymbol *S) { return S->isCOFF(); } 62 }; 63 64 } // end namespace llvm 65 66 #endif // LLVM_MC_MCSYMBOLCOFF_H 67