mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 21:00:29 +00:00
make isVirtualSection a virtual method on MCSection. Chris' suggestion.
llvm-svn: 119547
This commit is contained in:
parent
d88cfe5453
commit
7fc5cd0a58
@ -64,6 +64,10 @@ namespace llvm {
|
||||
// "optimized nops" to fill instead of 0s.
|
||||
virtual bool UseCodeAlign() const = 0;
|
||||
|
||||
/// isVirtualSection - Check whether this section is "virtual", that is
|
||||
/// has no actual object file contents.
|
||||
virtual bool isVirtualSection() const = 0;
|
||||
|
||||
static bool classof(const MCSection *) { return true; }
|
||||
};
|
||||
|
||||
|
@ -56,6 +56,7 @@ namespace llvm {
|
||||
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||
raw_ostream &OS) const;
|
||||
virtual bool UseCodeAlign() const;
|
||||
virtual bool isVirtualSection() const;
|
||||
|
||||
static bool classof(const MCSection *S) {
|
||||
return S->getVariant() == SV_COFF;
|
||||
|
@ -188,6 +188,7 @@ public:
|
||||
void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||
raw_ostream &OS) const;
|
||||
virtual bool UseCodeAlign() const;
|
||||
virtual bool isVirtualSection() const;
|
||||
|
||||
/// isBaseAddressKnownZero - We know that non-allocatable sections (like
|
||||
/// debug info) have a base of zero.
|
||||
|
@ -166,6 +166,7 @@ public:
|
||||
virtual void PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||
raw_ostream &OS) const;
|
||||
virtual bool UseCodeAlign() const;
|
||||
virtual bool isVirtualSection() const;
|
||||
|
||||
static bool classof(const MCSection *S) {
|
||||
return S->getVariant() == SV_MachO;
|
||||
|
@ -86,10 +86,6 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
/// isVirtualSection - Check whether the given section is "virtual", that is
|
||||
/// has no actual object file contents.
|
||||
virtual bool isVirtualSection(const MCSection &Section) const = 0;
|
||||
|
||||
/// getPointerSize - Get the pointer size in bytes.
|
||||
virtual unsigned getPointerSize() const = 0;
|
||||
|
||||
|
@ -54,10 +54,10 @@ MCAsmLayout::MCAsmLayout(MCAssembler &Asm)
|
||||
{
|
||||
// Compute the section layout order. Virtual sections must go last.
|
||||
for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
|
||||
if (!Asm.getBackend().isVirtualSection(it->getSection()))
|
||||
if (!it->getSection().isVirtualSection())
|
||||
SectionOrder.push_back(&*it);
|
||||
for (MCAssembler::iterator it = Asm.begin(), ie = Asm.end(); it != ie; ++it)
|
||||
if (Asm.getBackend().isVirtualSection(it->getSection()))
|
||||
if (it->getSection().isVirtualSection())
|
||||
SectionOrder.push_back(&*it);
|
||||
}
|
||||
|
||||
@ -157,7 +157,7 @@ uint64_t MCAsmLayout::getSectionAddressSize(const MCSectionData *SD) const {
|
||||
|
||||
uint64_t MCAsmLayout::getSectionFileSize(const MCSectionData *SD) const {
|
||||
// Virtual sections have no file size.
|
||||
if (getAssembler().getBackend().isVirtualSection(SD->getSection()))
|
||||
if (SD->getSection().isVirtualSection())
|
||||
return 0;
|
||||
|
||||
// Otherwise, the file size is the same as the address space size.
|
||||
@ -541,7 +541,7 @@ void MCAssembler::WriteSectionData(const MCSectionData *SD,
|
||||
const MCAsmLayout &Layout,
|
||||
MCObjectWriter *OW) const {
|
||||
// Ignore virtual sections.
|
||||
if (getBackend().isVirtualSection(SD->getSection())) {
|
||||
if (SD->getSection().isVirtualSection()) {
|
||||
assert(Layout.getSectionFileSize(SD) == 0 && "Invalid size for section!");
|
||||
|
||||
// Check that contents are only things legal inside a virtual section.
|
||||
@ -630,7 +630,7 @@ void MCAssembler::Finish(MCObjectWriter *Writer) {
|
||||
continue;
|
||||
|
||||
// Ignore virtual sections, they don't cause file size modifications.
|
||||
if (getBackend().isVirtualSection(SD->getSection()))
|
||||
if (SD->getSection().isVirtualSection())
|
||||
continue;
|
||||
|
||||
// Otherwise, create a new align fragment at the end of the previous
|
||||
|
@ -78,3 +78,7 @@ void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
|
||||
bool MCSectionCOFF::UseCodeAlign() const {
|
||||
return getKind().isText();
|
||||
}
|
||||
|
||||
bool MCSectionCOFF::isVirtualSection() const {
|
||||
return getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
|
||||
}
|
||||
|
@ -107,6 +107,10 @@ bool MCSectionELF::UseCodeAlign() const {
|
||||
return getFlags() & MCSectionELF::SHF_EXECINSTR;
|
||||
}
|
||||
|
||||
bool MCSectionELF::isVirtualSection() const {
|
||||
return getType() == MCSectionELF::SHT_NOBITS;
|
||||
}
|
||||
|
||||
// HasCommonSymbols - True if this section holds common symbols, this is
|
||||
// indicated on the ELF object file by a symbol with SHN_COMMON section
|
||||
// header index.
|
||||
|
@ -152,6 +152,12 @@ bool MCSectionMachO::UseCodeAlign() const {
|
||||
return hasAttribute(MCSectionMachO::S_ATTR_PURE_INSTRUCTIONS);
|
||||
}
|
||||
|
||||
bool MCSectionMachO::isVirtualSection() const {
|
||||
return (getType() == MCSectionMachO::S_ZEROFILL ||
|
||||
getType() == MCSectionMachO::S_GB_ZEROFILL ||
|
||||
getType() == MCSectionMachO::S_THREAD_LOCAL_ZEROFILL);
|
||||
}
|
||||
|
||||
/// StripSpaces - This removes leading and trailing spaces from the StringRef.
|
||||
static void StripSpaces(StringRef &Str) {
|
||||
while (!Str.empty() && isspace(Str[0]))
|
||||
|
@ -371,7 +371,7 @@ public:
|
||||
uint64_t SectionSize = Layout.getSectionSize(&SD);
|
||||
|
||||
// The offset is unused for virtual sections.
|
||||
if (Asm.getBackend().isVirtualSection(SD.getSection())) {
|
||||
if (SD.getSection().isVirtualSection()) {
|
||||
assert(Layout.getSectionFileSize(&SD) == 0 && "Invalid file size!");
|
||||
FileOffset = 0;
|
||||
}
|
||||
@ -1191,7 +1191,7 @@ public:
|
||||
|
||||
VMSize = std::max(VMSize, Address + Size);
|
||||
|
||||
if (Asm.getBackend().isVirtualSection(SD.getSection()))
|
||||
if (SD.getSection().isVirtualSection())
|
||||
continue;
|
||||
|
||||
SectionDataSize = std::max(SectionDataSize, Address + Size);
|
||||
|
@ -83,11 +83,6 @@ public:
|
||||
void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
|
||||
uint64_t Value) const;
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
|
||||
return SE.getType() == MCSectionELF::SHT_NOBITS;
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createELFObjectWriter(OS, /*Is64Bit=*/false,
|
||||
OSType, ELF::EM_ARM,
|
||||
@ -118,13 +113,6 @@ public:
|
||||
void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
|
||||
uint64_t Value) const;
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
|
||||
return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_GB_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_THREAD_LOCAL_ZEROFILL);
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
// FIXME: Subtarget info should be derived. Force v7 for now.
|
||||
return createMachObjectWriter(OS, /*Is64Bit=*/false, MachO::CPUTypeARM,
|
||||
|
@ -96,11 +96,6 @@ public:
|
||||
void ApplyFixup(const MCFixup &Fixup, MCDataFragment &DF,
|
||||
uint64_t Value) const;
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
|
||||
return SE.getType() == MCSectionELF::SHT_NOBITS;
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createELFObjectWriter(OS, /*Is64Bit=*/false,
|
||||
OSType, ELF::EM_MBLAZE,
|
||||
|
@ -68,13 +68,6 @@ namespace {
|
||||
assert(0 && "UNIMP");
|
||||
}
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
|
||||
return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_GB_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_THREAD_LOCAL_ZEROFILL);
|
||||
}
|
||||
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
bool is64 = getPointerSize() == 8;
|
||||
return createMachObjectWriter(OS, /*Is64Bit=*/is64,
|
||||
|
@ -289,11 +289,6 @@ public:
|
||||
const MCSectionELF &ES = static_cast<const MCSectionELF&>(Section);
|
||||
return ES.getFlags() & MCSectionELF::SHF_MERGE;
|
||||
}
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionELF &SE = static_cast<const MCSectionELF&>(Section);
|
||||
return SE.getType() == MCSectionELF::SHT_NOBITS;
|
||||
}
|
||||
};
|
||||
|
||||
class ELFX86_32AsmBackend : public ELFX86AsmBackend {
|
||||
@ -355,11 +350,6 @@ public:
|
||||
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
|
||||
return createWinCOFFObjectWriter(OS, Is64Bit);
|
||||
}
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionCOFF &SE = static_cast<const MCSectionCOFF&>(Section);
|
||||
return SE.getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
|
||||
}
|
||||
};
|
||||
|
||||
class DarwinX86AsmBackend : public X86AsmBackend {
|
||||
@ -374,13 +364,6 @@ public:
|
||||
virtual const MCObjectFormat &getObjectFormat() const {
|
||||
return Format;
|
||||
}
|
||||
|
||||
bool isVirtualSection(const MCSection &Section) const {
|
||||
const MCSectionMachO &SMO = static_cast<const MCSectionMachO&>(Section);
|
||||
return (SMO.getType() == MCSectionMachO::S_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_GB_ZEROFILL ||
|
||||
SMO.getType() == MCSectionMachO::S_THREAD_LOCAL_ZEROFILL);
|
||||
}
|
||||
};
|
||||
|
||||
class DarwinX86_32AsmBackend : public DarwinX86AsmBackend {
|
||||
|
Loading…
Reference in New Issue
Block a user