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