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