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 15namespace llvm { 16 17class MCSectionXCOFF; 18 19class MCSymbolXCOFF : public MCSymbol { 20 21 enum XCOFFSymbolFlags : uint16_t { SF_EHInfo = 0x0001 }; 22 23public: 24 MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary) 25 : MCSymbol(SymbolKindXCOFF, Name, isTemporary) {} 26 27 static bool classof(const MCSymbol *S) { return S->isXCOFF(); } 28 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 39 void setStorageClass(XCOFF::StorageClass SC) { 40 StorageClass = SC; 41 }; 42 43 XCOFF::StorageClass getStorageClass() const { 44 assert(StorageClass && "StorageClass not set on XCOFF MCSymbol."); 45 return *StorageClass; 46 } 47 48 StringRef getUnqualifiedName() const { return getUnqualifiedName(getName()); } 49 50 MCSectionXCOFF *getRepresentedCsect() const; 51 52 void setRepresentedCsect(MCSectionXCOFF *C); 53 54 void setVisibilityType(XCOFF::VisibilityType SVT) { VisibilityType = SVT; }; 55 56 XCOFF::VisibilityType getVisibilityType() const { return VisibilityType; } 57 58 bool hasRename() const { return HasRename; } 59 60 void setSymbolTableName(StringRef STN) { 61 SymbolTableName = STN; 62 HasRename = true; 63 } 64 65 StringRef getSymbolTableName() const { 66 if (hasRename()) 67 return SymbolTableName; 68 return getUnqualifiedName(); 69 } 70 71 bool isEHInfo() const { return getFlags() & SF_EHInfo; } 72 73 void setEHInfo() const { modifyFlags(SF_EHInfo, SF_EHInfo); } 74 75private: 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