diff --git a/llvm/tools/objwriter/objwriter.cpp b/llvm/tools/objwriter/objwriter.cpp index c4b1c68c2a873..6e3346150b567 100644 --- a/llvm/tools/objwriter/objwriter.cpp +++ b/llvm/tools/objwriter/objwriter.cpp @@ -243,11 +243,16 @@ MCSection *ObjectWriter::GetSpecificSection(const char *SectionName, const char *ComdatName) { Triple TheTriple(TripleName); MCSection *Section = nullptr; - SectionKind Kind = (attributes & CustomSectionAttributes_Executable) - ? SectionKind::getText() - : (attributes & CustomSectionAttributes_Writeable) - ? SectionKind::getData() - : SectionKind::getReadOnly(); + SectionKind Kind; + if (attributes & CustomSectionAttributes_Executable) + Kind = SectionKind::getText(); + else if (attributes & CustomSectionAttributes_Uninitialized) + Kind = SectionKind::getBSS(); + else if (attributes & CustomSectionAttributes_Writeable) + Kind = SectionKind::getData(); + else + Kind = SectionKind::getReadOnly(); + switch (TheTriple.getObjectFormat()) { case Triple::MachO: { unsigned typeAndAttributes = 0; @@ -260,6 +265,9 @@ MCSection *ObjectWriter::GetSpecificSection(const char *SectionName, // boundaries. typeAndAttributes |= MachO::S_ATTR_PURE_INSTRUCTIONS; } + if (attributes & CustomSectionAttributes_Uninitialized) { + typeAndAttributes |= MachO::S_ZEROFILL; + } Section = OutContext->getMachOSection( (attributes & CustomSectionAttributes_Executable) ? "__TEXT" : "__DATA", SectionName, typeAndAttributes, Kind); @@ -271,8 +279,11 @@ MCSection *ObjectWriter::GetSpecificSection(const char *SectionName, if (attributes & CustomSectionAttributes_Executable) { Characteristics |= COFF::IMAGE_SCN_CNT_CODE | COFF::IMAGE_SCN_MEM_EXECUTE; } else if (attributes & CustomSectionAttributes_Writeable) { - Characteristics |= - COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_WRITE; + Characteristics |= COFF::IMAGE_SCN_MEM_WRITE; + if (attributes & CustomSectionAttributes_Uninitialized) + Characteristics |= COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA; + else + Characteristics |= COFF::IMAGE_SCN_CNT_INITIALIZED_DATA; } else { Characteristics |= COFF::IMAGE_SCN_CNT_INITIALIZED_DATA; } @@ -299,8 +310,11 @@ MCSection *ObjectWriter::GetSpecificSection(const char *SectionName, } else if (attributes & CustomSectionAttributes_Writeable) { Flags |= ELF::SHF_WRITE; } + unsigned SectionType = (attributes & CustomSectionAttributes_Uninitialized) + ? ELF::SHT_NOBITS + : ELF::SHT_PROGBITS; Section = - OutContext->getELFSection(SectionName, ELF::SHT_PROGBITS, Flags, 0, + OutContext->getELFSection(SectionName, SectionType, Flags, 0, ComdatName != nullptr ? ComdatName : ""); break; } diff --git a/llvm/tools/objwriter/objwriter.h b/llvm/tools/objwriter/objwriter.h index 92d1bf61f5e88..860312f92a13e 100644 --- a/llvm/tools/objwriter/objwriter.h +++ b/llvm/tools/objwriter/objwriter.h @@ -44,6 +44,7 @@ enum CustomSectionAttributes : int32_t { CustomSectionAttributes_ReadOnly = 0x0000, CustomSectionAttributes_Writeable = 0x0001, CustomSectionAttributes_Executable = 0x0002, + CustomSectionAttributes_Uninitialized = 0x0004, CustomSectionAttributes_MachO_Init_Func_Pointers = 0x0100, };