1351278Sdim//===- MCSymbolXCOFF.h -  ----------------------------------------*- C++ -*-===//
2351278Sdim//
3351278Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4351278Sdim// See https://llvm.org/LICENSE.txt for license information.
5351278Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6351278Sdim//
7351278Sdim//===----------------------------------------------------------------------===//
8351278Sdim#ifndef LLVM_MC_MCSYMBOLXCOFF_H
9351278Sdim#define LLVM_MC_MCSYMBOLXCOFF_H
10351278Sdim
11360784Sdim#include "llvm/ADT/Optional.h"
12360784Sdim#include "llvm/ADT/StringRef.h"
13351278Sdim#include "llvm/BinaryFormat/XCOFF.h"
14351278Sdim#include "llvm/MC/MCSymbol.h"
15351278Sdim
16351278Sdimnamespace llvm {
17351278Sdim
18360784Sdimclass MCSectionXCOFF;
19360784Sdim
20351278Sdimclass MCSymbolXCOFF : public MCSymbol {
21351278Sdimpublic:
22351278Sdim  MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary)
23351278Sdim      : MCSymbol(SymbolKindXCOFF, Name, isTemporary) {}
24351278Sdim
25351278Sdim  static bool classof(const MCSymbol *S) { return S->isXCOFF(); }
26360784Sdim
27360784Sdim  void setStorageClass(XCOFF::StorageClass SC) {
28360784Sdim    assert((!StorageClass.hasValue() || StorageClass.getValue() == SC) &&
29360784Sdim           "Redefining StorageClass of XCOFF MCSymbol.");
30360784Sdim    StorageClass = SC;
31360784Sdim  };
32360784Sdim
33360784Sdim  XCOFF::StorageClass getStorageClass() const {
34360784Sdim    assert(StorageClass.hasValue() &&
35360784Sdim           "StorageClass not set on XCOFF MCSymbol.");
36360784Sdim    return StorageClass.getValue();
37360784Sdim  }
38360784Sdim
39360784Sdim  void setContainingCsect(MCSectionXCOFF *C) {
40360784Sdim    assert((!ContainingCsect || ContainingCsect == C) &&
41360784Sdim           "Trying to set a containing csect that doesn't match the one that"
42360784Sdim           "this symbol is already mapped to.");
43360784Sdim    ContainingCsect = C;
44360784Sdim  }
45360784Sdim
46360784Sdim  MCSectionXCOFF *getContainingCsect() const {
47360784Sdim    assert(ContainingCsect &&
48360784Sdim           "Trying to get containing csect but none was set.");
49360784Sdim    return ContainingCsect;
50360784Sdim  }
51360784Sdim
52360784Sdim  bool hasContainingCsect() const { return ContainingCsect != nullptr; }
53360784Sdim
54360784Sdim  StringRef getUnqualifiedName() const {
55360784Sdim    const StringRef name = getName();
56360784Sdim    if (name.back() == ']') {
57360784Sdim      StringRef lhs, rhs;
58360784Sdim      std::tie(lhs, rhs) = name.rsplit('[');
59360784Sdim      assert(!rhs.empty() && "Invalid SMC format in XCOFF symbol.");
60360784Sdim      return lhs;
61360784Sdim    }
62360784Sdim    return name;
63360784Sdim  }
64360784Sdim
65360784Sdimprivate:
66360784Sdim  Optional<XCOFF::StorageClass> StorageClass;
67360784Sdim  MCSectionXCOFF *ContainingCsect = nullptr;
68351278Sdim};
69351278Sdim
70351278Sdim} // end namespace llvm
71351278Sdim
72351278Sdim#endif // LLVM_MC_MCSYMBOLXCOFF_H
73