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