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