Files
gps/tools/local/circt/include/llvm/MC/MCSectionGOFF.h
T
2026-07-12 11:01:51 +03:00

130 lines
4.5 KiB
C++

//===-- llvm/MC/MCSectionGOFF.h - GOFF Machine Code Sections ----*- 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
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This file declares the MCSectionGOFF class, which contains all of the
/// necessary machine code sections for the GOFF file format.
///
//===----------------------------------------------------------------------===//
#ifndef LLVM_MC_MCSECTIONGOFF_H
#define LLVM_MC_MCSECTIONGOFF_H
#include "llvm/BinaryFormat/GOFF.h"
#include "llvm/MC/MCGOFFAttributes.h"
#include "llvm/MC/MCSection.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
namespace llvm {
class MCExpr;
class LLVM_ABI MCSectionGOFF final : public MCSection {
StringRef ExternalName; // Alternate external name.
// Parent of this section. Implies that the parent is emitted first.
MCSectionGOFF *Parent;
// The attributes of the GOFF symbols.
union {
GOFF::SDAttr SDAttributes;
GOFF::EDAttr EDAttributes;
GOFF::PRAttr PRAttributes;
};
// The type of this section.
GOFF::ESDSymbolType SymbolType;
// This section is a BSS section.
unsigned IsBSS : 1;
// Indicates that the PR symbol needs to set the length of the section to a
// non-zero value. This is only a problem with the ADA PR - the binder will
// generate an error in this case.
unsigned RequiresNonZeroLength : 1;
// Set to true if the section definition was already emitted.
mutable unsigned Emitted : 1;
friend class MCContext;
friend class MCAsmInfoGOFF;
friend class MCSymbolGOFF;
MCSectionGOFF(StringRef Name, SectionKind K, bool IsVirtual,
GOFF::SDAttr SDAttributes, MCSectionGOFF *Parent)
: MCSection(Name, K.isText(), IsVirtual, nullptr), Parent(Parent),
SDAttributes(SDAttributes), SymbolType(GOFF::ESD_ST_SectionDefinition),
IsBSS(K.isBSS()), RequiresNonZeroLength(0), Emitted(0) {}
MCSectionGOFF(StringRef Name, SectionKind K, bool IsVirtual,
GOFF::EDAttr EDAttributes, MCSectionGOFF *Parent)
: MCSection(Name, K.isText(), IsVirtual, nullptr), Parent(Parent),
EDAttributes(EDAttributes), SymbolType(GOFF::ESD_ST_ElementDefinition),
IsBSS(K.isBSS()), RequiresNonZeroLength(0), Emitted(0) {}
MCSectionGOFF(StringRef Name, SectionKind K, bool IsVirtual,
GOFF::PRAttr PRAttributes, MCSectionGOFF *Parent)
: MCSection(Name, K.isText(), IsVirtual, nullptr), Parent(Parent),
PRAttributes(PRAttributes), SymbolType(GOFF::ESD_ST_PartReference),
IsBSS(K.isBSS()), RequiresNonZeroLength(0), Emitted(0) {}
public:
// Return the parent section.
MCSectionGOFF *getParent() const { return Parent; }
// Returns true if this is a BSS section.
bool isBSS() const { return IsBSS; }
// Returns the type of this section.
GOFF::ESDSymbolType getSymbolType() const { return SymbolType; }
bool isSD() const { return SymbolType == GOFF::ESD_ST_SectionDefinition; }
bool isED() const { return SymbolType == GOFF::ESD_ST_ElementDefinition; }
bool isPR() const { return SymbolType == GOFF::ESD_ST_PartReference; }
// Accessors to the attributes.
GOFF::SDAttr getSDAttributes() const {
assert(isSD() && "Not a SD section");
return SDAttributes;
}
GOFF::EDAttr getEDAttributes() const {
assert(isED() && "Not a ED section");
return EDAttributes;
}
GOFF::PRAttr getPRAttributes() const {
assert(isPR() && "Not a PR section");
return PRAttributes;
}
// Returns the text style for a section. Only defined for ED and PR sections.
GOFF::ESDTextStyle getTextStyle() const {
assert((isED() || isPR() || isBssSection()) && "Expect ED or PR section");
if (isED())
return EDAttributes.TextStyle;
if (isPR())
return getParent()->getEDAttributes().TextStyle;
// Virtual sections have no data, so byte orientation is fine.
return GOFF::ESD_TS_ByteOriented;
}
bool requiresNonZeroLength() const { return RequiresNonZeroLength; }
void setName(StringRef SectionName) { Name = SectionName; }
bool hasExternalName() const { return !ExternalName.empty(); }
void setExternalName(StringRef Name) { ExternalName = Name; }
StringRef getExternalName() const {
return hasExternalName() ? ExternalName : getName();
}
};
} // end namespace llvm
#endif