Skip to content

[MC] Make MCSection::isVirtualSection non-virtual #96920

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions llvm/include/llvm/MC/MCSection.h
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ class MCSection {

bool IsText : 1;

bool IsVirtual : 1;

MCDummyFragment DummyFragment;

// Mapping from subsection number to fragment list. At layout time, the
Expand All @@ -127,7 +129,8 @@ class MCSection {
StringRef Name;
SectionVariant Variant;

MCSection(SectionVariant V, StringRef Name, bool IsText, MCSymbol *Begin);
MCSection(SectionVariant V, StringRef Name, bool IsText, bool IsVirtual,
MCSymbol *Begin);
~MCSection();

public:
Expand Down Expand Up @@ -219,7 +222,7 @@ class MCSection {

/// Check whether this section is "virtual", that is has no actual object
/// file contents.
virtual bool isVirtualSection() const = 0;
bool isVirtualSection() const { return IsVirtual; }

virtual StringRef getVirtualSectionKind() const;

Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/MC/MCSectionCOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ class MCSectionCOFF final : public MCSection {
MCSectionCOFF(StringRef Name, unsigned Characteristics,
MCSymbol *COMDATSymbol, int Selection, MCSymbol *Begin)
: MCSection(SV_COFF, Name, Characteristics & COFF::IMAGE_SCN_CNT_CODE,
Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA,
Begin),
Characteristics(Characteristics), COMDATSymbol(COMDATSymbol),
Selection(Selection) {
Expand All @@ -75,7 +76,6 @@ class MCSectionCOFF final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override;
bool useCodeAlign() const override;
bool isVirtualSection() const override;
StringRef getVirtualSectionKind() const override;

unsigned getOrAssignWinCFISectionID(unsigned *NextID) const {
Expand Down
4 changes: 2 additions & 2 deletions llvm/include/llvm/MC/MCSectionDXContainer.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,13 @@ class MCSectionDXContainer final : public MCSection {
friend class MCContext;

MCSectionDXContainer(StringRef Name, SectionKind K, MCSymbol *Begin)
: MCSection(SV_DXContainer, Name, K.isText(), Begin) {}
: MCSection(SV_DXContainer, Name, K.isText(), /*IsVirtual=*/false,
Begin) {}

public:
void printSwitchToSection(const MCAsmInfo &, const Triple &, raw_ostream &,
uint32_t) const override;
bool useCodeAlign() const override { return false; }
bool isVirtualSection() const override { return false; }
};

} // end namespace llvm
Expand Down
6 changes: 3 additions & 3 deletions llvm/include/llvm/MC/MCSectionELF.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,9 @@ class MCSectionELF final : public MCSection {
unsigned entrySize, const MCSymbolELF *group, bool IsComdat,
unsigned UniqueID, MCSymbol *Begin,
const MCSymbolELF *LinkedToSym)
: MCSection(SV_ELF, Name, flags & ELF::SHF_EXECINSTR, Begin), Type(type),
Flags(flags), UniqueID(UniqueID), EntrySize(entrySize),
: MCSection(SV_ELF, Name, flags & ELF::SHF_EXECINSTR,
type == ELF::SHT_NOBITS, Begin),
Type(type), Flags(flags), UniqueID(UniqueID), EntrySize(entrySize),
Group(group, IsComdat), LinkedToSym(LinkedToSym) {
if (Group.getPointer())
Group.getPointer()->setIsSignature();
Expand All @@ -81,7 +82,6 @@ class MCSectionELF final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override;
bool useCodeAlign() const override;
bool isVirtualSection() const override;
StringRef getVirtualSectionKind() const override;

bool isUnique() const { return UniqueID != NonUniqueID; }
Expand Down
6 changes: 2 additions & 4 deletions llvm/include/llvm/MC/MCSectionGOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ class MCSectionGOFF final : public MCSection {

friend class MCContext;
MCSectionGOFF(StringRef Name, SectionKind K, MCSection *P, uint32_t Sub)
: MCSection(SV_GOFF, Name, K.isText(), nullptr), Parent(P),
Subsection(Sub) {}
: MCSection(SV_GOFF, Name, K.isText(), /*IsVirtual=*/false, nullptr),
Parent(P), Subsection(Sub) {}

public:
void printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
Expand All @@ -42,8 +42,6 @@ class MCSectionGOFF final : public MCSection {

bool useCodeAlign() const override { return false; }

bool isVirtualSection() const override { return false; }

MCSection *getParent() const { return Parent; }
uint32_t getSubsection() const { return Subsection; }

Expand Down
1 change: 0 additions & 1 deletion llvm/include/llvm/MC/MCSectionMachO.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ class MCSectionMachO final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override;
bool useCodeAlign() const override;
bool isVirtualSection() const override;

void allocAtoms();
const MCSymbol *getAtom(size_t I) const;
Expand Down
4 changes: 2 additions & 2 deletions llvm/include/llvm/MC/MCSectionSPIRV.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ class MCSectionSPIRV final : public MCSection {
friend class MCContext;

MCSectionSPIRV()
: MCSection(SV_SPIRV, "", /*IsText=*/true, /*Begin=*/nullptr) {}
: MCSection(SV_SPIRV, "", /*IsText=*/true, /*IsVirtual=*/false,
/*Begin=*/nullptr) {}
// TODO: Add StringRef Name to MCSectionSPIRV.

public:
Expand All @@ -33,7 +34,6 @@ class MCSectionSPIRV final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override {}
bool useCodeAlign() const override { return false; }
bool isVirtualSection() const override { return false; }
};

} // end namespace llvm
Expand Down
6 changes: 3 additions & 3 deletions llvm/include/llvm/MC/MCSectionWasm.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@ class MCSectionWasm final : public MCSection {
friend class MCContext;
MCSectionWasm(StringRef Name, SectionKind K, unsigned SegmentFlags,
const MCSymbolWasm *Group, unsigned UniqueID, MCSymbol *Begin)
: MCSection(SV_Wasm, Name, K.isText(), Begin), UniqueID(UniqueID),
Group(Group), IsWasmData(K.isReadOnly() || K.isWriteable()),
: MCSection(SV_Wasm, Name, K.isText(), /*IsVirtual=*/false, Begin),
UniqueID(UniqueID), Group(Group),
IsWasmData(K.isReadOnly() || K.isWriteable()),
IsMetadata(K.isMetadata()), SegmentFlags(SegmentFlags) {}

public:
Expand All @@ -67,7 +68,6 @@ class MCSectionWasm final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override;
bool useCodeAlign() const override;
bool isVirtualSection() const override;

bool isWasmData() const { return IsWasmData; }
bool isMetadata() const { return IsMetadata; }
Expand Down
12 changes: 8 additions & 4 deletions llvm/include/llvm/MC/MCSectionXCOFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,14 @@ class MCSectionXCOFF final : public MCSection {
static constexpr unsigned DefaultAlignVal = 4;
static constexpr unsigned DefaultTextAlignVal = 32;

// XTY_CM sections are virtual except for toc-data symbols.
MCSectionXCOFF(StringRef Name, XCOFF::StorageMappingClass SMC,
XCOFF::SymbolType ST, SectionKind K, MCSymbolXCOFF *QualName,
MCSymbol *Begin, StringRef SymbolTableName,
bool MultiSymbolsAllowed)
: MCSection(SV_XCOFF, Name, K.isText(), Begin),
: MCSection(SV_XCOFF, Name, K.isText(),
/*IsVirtual=*/ST == XCOFF::XTY_CM && SMC != XCOFF::XMC_TD,
Begin),
CsectProp(XCOFF::CsectProperties(SMC, ST)), QualName(QualName),
SymbolTableName(SymbolTableName), DwarfSubtypeFlags(std::nullopt),
MultiSymbolsAllowed(MultiSymbolsAllowed), Kind(K) {
Expand All @@ -69,12 +72,14 @@ class MCSectionXCOFF final : public MCSection {
}
}

// DWARF sections are never virtual.
MCSectionXCOFF(StringRef Name, SectionKind K, MCSymbolXCOFF *QualName,
XCOFF::DwarfSectionSubtypeFlags DwarfSubtypeFlags,
MCSymbol *Begin, StringRef SymbolTableName,
bool MultiSymbolsAllowed)
: MCSection(SV_XCOFF, Name, K.isText(), Begin), QualName(QualName),
SymbolTableName(SymbolTableName), DwarfSubtypeFlags(DwarfSubtypeFlags),
: MCSection(SV_XCOFF, Name, K.isText(), /*IsVirtual=*/false, Begin),
QualName(QualName), SymbolTableName(SymbolTableName),
DwarfSubtypeFlags(DwarfSubtypeFlags),
MultiSymbolsAllowed(MultiSymbolsAllowed), Kind(K) {
assert(QualName != nullptr && "QualName is needed.");

Expand Down Expand Up @@ -114,7 +119,6 @@ class MCSectionXCOFF final : public MCSection {
raw_ostream &OS,
uint32_t Subsection) const override;
bool useCodeAlign() const override;
bool isVirtualSection() const override;
StringRef getSymbolTableName() const { return SymbolTableName; }
void setSymbolTableName(StringRef STN) { SymbolTableName = STN; }
bool isMultiSymbolsAllowed() const { return MultiSymbolsAllowed; }
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/MC/MCSection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
using namespace llvm;

MCSection::MCSection(SectionVariant V, StringRef Name, bool IsText,
MCSymbol *Begin)
bool IsVirtual, MCSymbol *Begin)
: Begin(Begin), BundleGroupBeforeFirstInst(false), HasInstructions(false),
HasLayout(false), IsRegistered(false), IsText(IsText), Name(Name),
Variant(V) {
HasLayout(false), IsRegistered(false), IsText(IsText),
IsVirtual(IsVirtual), Name(Name), Variant(V) {
DummyFragment.setParent(this);
// The initial subsection number is 0. Create a fragment list.
CurFragList = &Subsections.emplace_back(0u, FragList{}).second;
Expand Down
4 changes: 0 additions & 4 deletions llvm/lib/MC/MCSectionCOFF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -108,10 +108,6 @@ void MCSectionCOFF::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,

bool MCSectionCOFF::useCodeAlign() const { return isText(); }

bool MCSectionCOFF::isVirtualSection() const {
return getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
}

StringRef MCSectionCOFF::getVirtualSectionKind() const {
return "IMAGE_SCN_CNT_UNINITIALIZED_DATA";
}
4 changes: 0 additions & 4 deletions llvm/lib/MC/MCSectionELF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,4 @@ bool MCSectionELF::useCodeAlign() const {
return getFlags() & ELF::SHF_EXECINSTR;
}

bool MCSectionELF::isVirtualSection() const {
return getType() == ELF::SHT_NOBITS;
}

StringRef MCSectionELF::getVirtualSectionKind() const { return "SHT_NOBITS"; }
11 changes: 3 additions & 8 deletions llvm/lib/MC/MCSectionMachO.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,9 @@ ENTRY("" /*FIXME*/, S_ATTR_LOC_RELOC)
MCSectionMachO::MCSectionMachO(StringRef Segment, StringRef Section,
unsigned TAA, unsigned reserved2, SectionKind K,
MCSymbol *Begin)
: MCSection(SV_MachO, Section, K.isText(), Begin), TypeAndAttributes(TAA),
Reserved2(reserved2) {
: MCSection(SV_MachO, Section, K.isText(),
MachO::isVirtualSection(TAA & MachO::SECTION_TYPE), Begin),
TypeAndAttributes(TAA), Reserved2(reserved2) {
assert(Segment.size() <= 16 && Section.size() <= 16 &&
"Segment or section string too long");
for (unsigned i = 0; i != 16; ++i) {
Expand Down Expand Up @@ -172,12 +173,6 @@ bool MCSectionMachO::useCodeAlign() const {
return hasAttribute(MachO::S_ATTR_PURE_INSTRUCTIONS);
}

bool MCSectionMachO::isVirtualSection() const {
return (getType() == MachO::S_ZEROFILL ||
getType() == MachO::S_GB_ZEROFILL ||
getType() == MachO::S_THREAD_LOCAL_ZEROFILL);
}

/// ParseSectionSpecifier - Parse the section specifier indicated by "Spec".
/// This is a string that can appear after a .section directive in a mach-o
/// flavored .s file. If successful, this fills in the specified Out
Expand Down
2 changes: 0 additions & 2 deletions llvm/lib/MC/MCSectionWasm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,5 +99,3 @@ void MCSectionWasm::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
}

bool MCSectionWasm::useCodeAlign() const { return false; }

bool MCSectionWasm::isVirtualSection() const { return false; }
11 changes: 0 additions & 11 deletions llvm/lib/MC/MCSectionXCOFF.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -132,14 +132,3 @@ void MCSectionXCOFF::printSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
}

bool MCSectionXCOFF::useCodeAlign() const { return getKind().isText(); }

bool MCSectionXCOFF::isVirtualSection() const {
// DWARF sections are always not virtual.
if (isDwarfSect())
return false;
assert(isCsect() &&
"Handling for isVirtualSection not implemented for this section!");
// XTY_CM sections are virtual except for toc-data symbols.
return (XCOFF::XTY_CM == CsectProp->Type) &&
(getMappingClass() != XCOFF::XMC_TD);
}
Loading