| //===- MCSymbolXCOFF.h - ----------------------------------------*- C++ -*-===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #ifndef LLVM_MC_MCSYMBOLXCOFF_H | |
| #define LLVM_MC_MCSYMBOLXCOFF_H | |
| #include "llvm/ADT/StringRef.h" | |
| #include "llvm/BinaryFormat/XCOFF.h" | |
| #include "llvm/MC/MCSymbol.h" | |
| namespace llvm { | |
| class MCSectionXCOFF; | |
| class MCSymbolXCOFF : public MCSymbol { | |
| enum XCOFFSymbolFlags : uint16_t { SF_EHInfo = 0x0001 }; | |
| public: | |
| MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary) | |
| : MCSymbol(SymbolKindXCOFF, Name, isTemporary) {} | |
| static bool classof(const MCSymbol *S) { return S->isXCOFF(); } | |
| enum CodeModel : uint8_t { CM_Small, CM_Large }; | |
| static StringRef getUnqualifiedName(StringRef Name) { | |
| if (Name.back() == ']') { | |
| StringRef Lhs, Rhs; | |
| std::tie(Lhs, Rhs) = Name.rsplit('['); | |
| assert(!Rhs.empty() && "Invalid SMC format in XCOFF symbol."); | |
| return Lhs; | |
| } | |
| return Name; | |
| } | |
| void setStorageClass(XCOFF::StorageClass SC) { | |
| StorageClass = SC; | |
| }; | |
| XCOFF::StorageClass getStorageClass() const { | |
| assert(StorageClass && "StorageClass not set on XCOFF MCSymbol."); | |
| return *StorageClass; | |
| } | |
| StringRef getUnqualifiedName() const { return getUnqualifiedName(getName()); } | |
| MCSectionXCOFF *getRepresentedCsect() const; | |
| void setRepresentedCsect(MCSectionXCOFF *C); | |
| void setVisibilityType(XCOFF::VisibilityType SVT) { VisibilityType = SVT; }; | |
| XCOFF::VisibilityType getVisibilityType() const { return VisibilityType; } | |
| bool hasRename() const { return HasRename; } | |
| void setSymbolTableName(StringRef STN) { | |
| SymbolTableName = STN; | |
| HasRename = true; | |
| } | |
| StringRef getSymbolTableName() const { | |
| if (hasRename()) | |
| return SymbolTableName; | |
| return getUnqualifiedName(); | |
| } | |
| bool isEHInfo() const { return getFlags() & SF_EHInfo; } | |
| void setEHInfo() const { modifyFlags(SF_EHInfo, SF_EHInfo); } | |
| bool hasPerSymbolCodeModel() const { return PerSymbolCodeModel.has_value(); } | |
| CodeModel getPerSymbolCodeModel() const { | |
| assert(hasPerSymbolCodeModel() && | |
| "Requested code model for symbol without one"); | |
| return *PerSymbolCodeModel; | |
| } | |
| void setPerSymbolCodeModel(MCSymbolXCOFF::CodeModel Model) { | |
| PerSymbolCodeModel = Model; | |
| } | |
| private: | |
| std::optional<XCOFF::StorageClass> StorageClass; | |
| std::optional<CodeModel> PerSymbolCodeModel; | |
| MCSectionXCOFF *RepresentedCsect = nullptr; | |
| XCOFF::VisibilityType VisibilityType = XCOFF::SYM_V_UNSPECIFIED; | |
| StringRef SymbolTableName; | |
| bool HasRename = false; | |
| }; | |
| } // end namespace llvm | |
| #endif // LLVM_MC_MCSYMBOLXCOFF_H |