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
16namespace llvm {
17
18class MCSectionXCOFF;
19
20class MCSymbolXCOFF : public MCSymbol {
21public:
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  void setStorageClass(XCOFF::StorageClass SC) {
28    assert((!StorageClass.hasValue() || StorageClass.getValue() == SC) &&
29           "Redefining StorageClass of XCOFF MCSymbol.");
30    StorageClass = SC;
31  };
32
33  XCOFF::StorageClass getStorageClass() const {
34    assert(StorageClass.hasValue() &&
35           "StorageClass not set on XCOFF MCSymbol.");
36    return StorageClass.getValue();
37  }
38
39  void setContainingCsect(MCSectionXCOFF *C) {
40    assert((!ContainingCsect || ContainingCsect == C) &&
41           "Trying to set a containing csect that doesn't match the one that"
42           "this symbol is already mapped to.");
43    ContainingCsect = C;
44  }
45
46  MCSectionXCOFF *getContainingCsect() const {
47    assert(ContainingCsect &&
48           "Trying to get containing csect but none was set.");
49    return ContainingCsect;
50  }
51
52  bool hasContainingCsect() const { return ContainingCsect != nullptr; }
53
54  StringRef getUnqualifiedName() const {
55    const StringRef name = getName();
56    if (name.back() == ']') {
57      StringRef lhs, rhs;
58      std::tie(lhs, rhs) = name.rsplit('[');
59      assert(!rhs.empty() && "Invalid SMC format in XCOFF symbol.");
60      return lhs;
61    }
62    return name;
63  }
64
65private:
66  Optional<XCOFF::StorageClass> StorageClass;
67  MCSectionXCOFF *ContainingCsect = nullptr;
68};
69
70} // end namespace llvm
71
72#endif // LLVM_MC_MCSYMBOLXCOFF_H
73