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(args&: Lhs, args&: Rhs) = Name.rsplit(Separator: '[');
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(Name: 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(Value: SF_EHInfo, Mask: 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

source code of llvm/include/llvm/MC/MCSymbolXCOFF.h