1 //===- MCSymbolXCOFF.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 #ifndef LLVM_MC_MCSYMBOLXCOFF_H 9 #define LLVM_MC_MCSYMBOLXCOFF_H 10 11 #include "llvm/ADT/StringRef.h" 12 #include "llvm/BinaryFormat/XCOFF.h" 13 #include "llvm/MC/MCSymbol.h" 14 15 namespace llvm { 16 17 class MCSectionXCOFF; 18 19 class MCSymbolXCOFF : public MCSymbol { 20 21 enum XCOFFSymbolFlags : uint16_t { SF_EHInfo = 0x0001 }; 22 23 public: MCSymbolXCOFF(const StringMapEntry<bool> * Name,bool isTemporary)24 MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary) 25 : MCSymbol(SymbolKindXCOFF, Name, isTemporary) {} 26 classof(const MCSymbol * S)27 static bool classof(const MCSymbol *S) { return S->isXCOFF(); } 28 getUnqualifiedName(StringRef Name)29 static StringRef getUnqualifiedName(StringRef Name) { 30 if (Name.back() == ']') { 31 StringRef Lhs, Rhs; 32 std::tie(Lhs, Rhs) = Name.rsplit('['); 33 assert(!Rhs.empty() && "Invalid SMC format in XCOFF symbol."); 34 return Lhs; 35 } 36 return Name; 37 } 38 setStorageClass(XCOFF::StorageClass SC)39 void setStorageClass(XCOFF::StorageClass SC) { 40 StorageClass = SC; 41 }; 42 getStorageClass()43 XCOFF::StorageClass getStorageClass() const { 44 assert(StorageClass && "StorageClass not set on XCOFF MCSymbol."); 45 return *StorageClass; 46 } 47 getUnqualifiedName()48 StringRef getUnqualifiedName() const { return getUnqualifiedName(getName()); } 49 50 MCSectionXCOFF *getRepresentedCsect() const; 51 52 void setRepresentedCsect(MCSectionXCOFF *C); 53 setVisibilityType(XCOFF::VisibilityType SVT)54 void setVisibilityType(XCOFF::VisibilityType SVT) { VisibilityType = SVT; }; 55 getVisibilityType()56 XCOFF::VisibilityType getVisibilityType() const { return VisibilityType; } 57 hasRename()58 bool hasRename() const { return HasRename; } 59 setSymbolTableName(StringRef STN)60 void setSymbolTableName(StringRef STN) { 61 SymbolTableName = STN; 62 HasRename = true; 63 } 64 getSymbolTableName()65 StringRef getSymbolTableName() const { 66 if (hasRename()) 67 return SymbolTableName; 68 return getUnqualifiedName(); 69 } 70 isEHInfo()71 bool isEHInfo() const { return getFlags() & SF_EHInfo; } 72 setEHInfo()73 void setEHInfo() const { modifyFlags(SF_EHInfo, SF_EHInfo); } 74 75 private: 76 std::optional<XCOFF::StorageClass> StorageClass; 77 MCSectionXCOFF *RepresentedCsect = nullptr; 78 XCOFF::VisibilityType VisibilityType = XCOFF::SYM_V_UNSPECIFIED; 79 StringRef SymbolTableName; 80 bool HasRename = false; 81 }; 82 83 } // end namespace llvm 84 85 #endif // LLVM_MC_MCSYMBOLXCOFF_H 86