1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00
llvm-mirror/include/llvm/MC/MCSymbolXCOFF.h
jasonliu 2a832bbb5f [NFC][XCOFF][AIX] Refactor get/setContainingCsect
Summary:
For current architect, we always require setContainingCsect to be
called on every MCSymbol got used in XCOFF context.
This is very hard to achieve because symbols gets created everywhere
 and other MCSymbol types(ELF, COFF) do not have similar rules.
It's very easy to miss setting the containing csect, and we would
need to add a lot of XCOFF specialized code around some common code area.

This patch intendeds to do
1. Rely on getFragment().getParent() to get csect from labels.
2. Only use get/setRepresentedCsect (was get/setContainingCsect)
if symbol itself represents a csect.

Reviewers: DiggerLin, hubert.reinterpretcast, daltenty

Differential Revision: https://reviews.llvm.org/D77080
2020-04-03 13:33:12 +00:00

64 lines
1.8 KiB
C++

//===- MCSymbolXCOFF.h - ----------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_MC_MCSYMBOLXCOFF_H
#define LLVM_MC_MCSYMBOLXCOFF_H
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/BinaryFormat/XCOFF.h"
#include "llvm/MC/MCSymbol.h"
namespace llvm {
class MCSectionXCOFF;
class MCSymbolXCOFF : public MCSymbol {
public:
MCSymbolXCOFF(const StringMapEntry<bool> *Name, bool isTemporary)
: MCSymbol(SymbolKindXCOFF, Name, isTemporary) {}
static bool classof(const MCSymbol *S) { return S->isXCOFF(); }
void setStorageClass(XCOFF::StorageClass SC) {
assert((!StorageClass.hasValue() || StorageClass.getValue() == SC) &&
"Redefining StorageClass of XCOFF MCSymbol.");
StorageClass = SC;
};
XCOFF::StorageClass getStorageClass() const {
assert(StorageClass.hasValue() &&
"StorageClass not set on XCOFF MCSymbol.");
return StorageClass.getValue();
}
StringRef getUnqualifiedName() const {
const StringRef name = getName();
if (name.back() == ']') {
StringRef lhs, rhs;
std::tie(lhs, rhs) = name.rsplit('[');
assert(!rhs.empty() && "Invalid SMC format in XCOFF symbol.");
return lhs;
}
return name;
}
bool hasRepresentedCsectSet() const { return RepresentedCsect != nullptr; }
MCSectionXCOFF *getRepresentedCsect() const;
void setRepresentedCsect(MCSectionXCOFF *C);
private:
Optional<XCOFF::StorageClass> StorageClass;
MCSectionXCOFF *RepresentedCsect = nullptr;
};
} // end namespace llvm
#endif // LLVM_MC_MCSYMBOLXCOFF_H