mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
2a832bbb5f
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
64 lines
1.8 KiB
C++
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
|