From deb1346d14d21401774c8f6e41c9e7cdd96f34d9 Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Mon, 8 Jan 2024 19:09:31 -0500 Subject: [PATCH 1/6] Add support for dwarf section headers --- llvm/include/llvm/Object/XCOFFObjectFile.h | 1 + llvm/include/llvm/ObjectYAML/XCOFFYAML.h | 5 +++++ llvm/lib/ObjectYAML/XCOFFEmitter.cpp | 10 +++++++--- llvm/lib/ObjectYAML/XCOFFYAML.cpp | 18 ++++++++++++++++++ llvm/tools/obj2yaml/xcoff2yaml.cpp | 7 +++++++ 5 files changed, 38 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h index 47926ab3ae401..7831c3d18dd73 100644 --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -158,6 +158,7 @@ template struct XCOFFSectionHeader { // The low order 16 bits of section flags denotes the section type. static constexpr unsigned SectionFlagsTypeMask = 0xffffu; + static constexpr unsigned SectionDwarfSubflagsTypeMask = 0xffff0000u; public: StringRef getName() const; diff --git a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h index dd359ac8e53dd..f9f5fa8c9c0f3 100644 --- a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h +++ b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h @@ -79,6 +79,7 @@ struct Section { llvm::yaml::Hex16 NumberOfRelocations; llvm::yaml::Hex16 NumberOfLineNumbers; // Line number counts. Not supported yet. uint32_t Flags; + std::optional DwarfSectionSubtype; yaml::BinaryRef SectionData; std::vector Relocations; }; @@ -232,6 +233,10 @@ template <> struct ScalarBitSetTraits { static void bitset(IO &IO, XCOFF::SectionTypeFlags &Value); }; +template <> struct ScalarEnumerationTraits { + static void enumeration(IO &IO, XCOFF::DwarfSectionSubtypeFlags &Value); +}; + template <> struct ScalarEnumerationTraits { static void enumeration(IO &IO, XCOFF::StorageClass &Value); }; diff --git a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp index f68c571da9fa0..7d38c635e35fd 100644 --- a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp @@ -513,8 +513,12 @@ void XCOFFWriter::writeSectionHeaders() { for (uint16_t I = 0, E = Obj.Sections.size(); I < E; ++I) { XCOFFYAML::Section DerivedSec = InitSections[I]; writeName(DerivedSec.SectionName, W); + int32_t DwarfSubtype = 0; + if (YamlSec.DwarfSectionSubtype) + DwarfSubtype = static_cast(*YamlSec.DwarfSectionSubtype); + + // Virtual address is the same as physical address. if (Is64Bit) { - // Virtual address is the same as physical address. W.write(DerivedSec.Address); // Physical address W.write(DerivedSec.Address); // Virtual address W.write(DerivedSec.Size); @@ -523,7 +527,7 @@ void XCOFFWriter::writeSectionHeaders() { W.write(DerivedSec.FileOffsetToLineNumbers); W.write(DerivedSec.NumberOfRelocations); W.write(DerivedSec.NumberOfLineNumbers); - W.write(DerivedSec.Flags); + W.write(DerivedSec.Flags | DwarfSubtype); W.OS.write_zeros(4); } else { // Virtual address is the same as physical address. @@ -535,7 +539,7 @@ void XCOFFWriter::writeSectionHeaders() { W.write(DerivedSec.FileOffsetToLineNumbers); W.write(DerivedSec.NumberOfRelocations); W.write(DerivedSec.NumberOfLineNumbers); - W.write(DerivedSec.Flags); + W.write(DerivedSec.Flags | DwarfSubtype); } } } diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp index 83bf61301387f..0c69f14aa9916 100644 --- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp @@ -44,6 +44,23 @@ void ScalarBitSetTraits::bitset( #undef ECase } +void ScalarEnumerationTraits::enumeration( + IO &IO, XCOFF::DwarfSectionSubtypeFlags &Value) { +#define ECase(X) IO.enumCase(Value, #X, XCOFF::X) + ECase(SSUBTYP_DWINFO); + ECase(SSUBTYP_DWLINE); + ECase(SSUBTYP_DWPBNMS); + ECase(SSUBTYP_DWPBTYP); + ECase(SSUBTYP_DWARNGE); + ECase(SSUBTYP_DWABREV); + ECase(SSUBTYP_DWSTR); + ECase(SSUBTYP_DWRNGES); + ECase(SSUBTYP_DWLOC); + ECase(SSUBTYP_DWFRAME); + ECase(SSUBTYP_DWMAC); +#undef ECase +} + void ScalarEnumerationTraits::enumeration( IO &IO, XCOFF::StorageClass &Value) { #define ECase(X) IO.enumCase(Value, #X, XCOFF::X) @@ -232,6 +249,7 @@ void MappingTraits::mapping(IO &IO, IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations); IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers); IO.mapOptional("Flags", NC->Flags); + IO.mapOptional("DwarfSectionSubtype", Sec.DwarfSectionSubtype); IO.mapOptional("SectionData", Sec.SectionData); IO.mapOptional("Relocations", Sec.Relocations); } diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp index e426b645cbeff..990634f5e3991 100644 --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -95,6 +95,13 @@ Error XCOFFDumper::dumpSections(ArrayRef Sections) { YamlSec.FileOffsetToRelocations = S.FileOffsetToRelocationInfo; YamlSec.FileOffsetToLineNumbers = S.FileOffsetToLineNumberInfo; YamlSec.Flags = S.Flags; + if (YamlSec.Flags & XCOFF::STYP_DWARF) { + YamlSec.DwarfSectionSubtype = + static_cast( + S.Flags & + XCOFFSectionHeader< + XCOFFSectionHeader32>::SectionDwarfSubflagsTypeMask); + } // Dump section data. if (S.FileOffsetToRawData) { From 77bdb9f1fad7a55f9b33a11331969d0399013657 Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Tue, 13 Feb 2024 12:43:18 -0500 Subject: [PATCH 2/6] Support Dwarf sections in yaml2obj/obj2yaml/llvm-readobj. --- llvm/include/llvm/Object/XCOFFObjectFile.h | 9 +- llvm/include/llvm/ObjectYAML/XCOFFYAML.h | 2 +- llvm/lib/Object/XCOFFObjectFile.cpp | 9 +- llvm/lib/ObjectYAML/XCOFFEmitter.cpp | 25 +++-- llvm/lib/ObjectYAML/XCOFFYAML.cpp | 3 +- llvm/test/CodeGen/PowerPC/aix-dwarf.ll | 3 + llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml | 108 +++++++++++++++++++++ llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml | 104 ++++++++++++++++++++ llvm/tools/llvm-readobj/XCOFFDumper.cpp | 20 +++- llvm/tools/obj2yaml/xcoff2yaml.cpp | 10 +- 10 files changed, 275 insertions(+), 18 deletions(-) create mode 100644 llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml create mode 100644 llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h index 7831c3d18dd73..7a6542ac6723b 100644 --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -153,16 +153,21 @@ struct XCOFFAuxiliaryHeader64 : XCOFFAuxiliaryHeader { }; template struct XCOFFSectionHeader { - // Least significant 3 bits are reserved. + // The section flags definitions are the same in both 32- and 64-bit objects. + // Least significant 3 bits are reserved. static constexpr unsigned SectionFlagsReservedMask = 0x7; // The low order 16 bits of section flags denotes the section type. static constexpr unsigned SectionFlagsTypeMask = 0xffffu; - static constexpr unsigned SectionDwarfSubflagsTypeMask = 0xffff0000u; + + // The high order 16 bits of section flags denotes the section subtype. + // For now, this is only used for dwarf sections. + static constexpr unsigned SectionFlagsSubtypeMask = 0xffff0000u; public: StringRef getName() const; uint16_t getSectionType() const; + int32_t getSectionSubtype() const; bool isReservedSectionType() const; }; diff --git a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h index f9f5fa8c9c0f3..2874c998d6903 100644 --- a/llvm/include/llvm/ObjectYAML/XCOFFYAML.h +++ b/llvm/include/llvm/ObjectYAML/XCOFFYAML.h @@ -79,7 +79,7 @@ struct Section { llvm::yaml::Hex16 NumberOfRelocations; llvm::yaml::Hex16 NumberOfLineNumbers; // Line number counts. Not supported yet. uint32_t Flags; - std::optional DwarfSectionSubtype; + std::optional SectionSubtype; yaml::BinaryRef SectionData; std::vector Relocations; }; diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 3fbd51887831e..3138860c7e7ca 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -64,6 +64,11 @@ template uint16_t XCOFFSectionHeader::getSectionType() const { return DerivedXCOFFSectionHeader.Flags & SectionFlagsTypeMask; } +template int32_t XCOFFSectionHeader::getSectionSubtype() const { + const T &DerivedXCOFFSectionHeader = static_cast(*this); + return DerivedXCOFFSectionHeader.Flags & SectionFlagsSubtypeMask; +} + template bool XCOFFSectionHeader::isReservedSectionType() const { return getSectionType() & SectionFlagsReservedMask; @@ -757,8 +762,8 @@ size_t XCOFFObjectFile::getFileHeaderSize() const { } size_t XCOFFObjectFile::getSectionHeaderSize() const { - return is64Bit() ? sizeof(XCOFFSectionHeader64) : - sizeof(XCOFFSectionHeader32); + return is64Bit() ? sizeof(XCOFFSectionHeader64) + : sizeof(XCOFFSectionHeader32); } bool XCOFFObjectFile::is64Bit() const { diff --git a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp index 7d38c635e35fd..284e8a3b1b359 100644 --- a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp @@ -210,7 +210,23 @@ bool XCOFFWriter::initSectionHeaders(uint64_t &CurrentOffset) { return false; } } + if (InitSections[I].SectionSubtype) { + uint32_t DwarfSubtype = + static_cast(*InitSections[I].SectionSubtype); + if (InitSections[I].Flags != XCOFF::STYP_DWARF) { + ErrHandler("a DwarfSectionSubtype is only allowed for a dwarf section"); + return false; + } + unsigned mask = Is64Bit ? XCOFFSectionHeader64::SectionFlagsSubtypeMask + : XCOFFSectionHeader32::SectionFlagsSubtypeMask; + if (DwarfSubtype & ~mask) { + ErrHandler("the low-order bits of DwarfSectionSubtype must be 0"); + return false; + } + InitSections[I].Flags |= DwarfSubtype; + } } + return initRelocations(CurrentOffset); } @@ -513,12 +529,9 @@ void XCOFFWriter::writeSectionHeaders() { for (uint16_t I = 0, E = Obj.Sections.size(); I < E; ++I) { XCOFFYAML::Section DerivedSec = InitSections[I]; writeName(DerivedSec.SectionName, W); - int32_t DwarfSubtype = 0; - if (YamlSec.DwarfSectionSubtype) - DwarfSubtype = static_cast(*YamlSec.DwarfSectionSubtype); - // Virtual address is the same as physical address. if (Is64Bit) { + // Virtual address is the same as physical address. W.write(DerivedSec.Address); // Physical address W.write(DerivedSec.Address); // Virtual address W.write(DerivedSec.Size); @@ -527,7 +540,7 @@ void XCOFFWriter::writeSectionHeaders() { W.write(DerivedSec.FileOffsetToLineNumbers); W.write(DerivedSec.NumberOfRelocations); W.write(DerivedSec.NumberOfLineNumbers); - W.write(DerivedSec.Flags | DwarfSubtype); + W.write(DerivedSec.Flags); W.OS.write_zeros(4); } else { // Virtual address is the same as physical address. @@ -539,7 +552,7 @@ void XCOFFWriter::writeSectionHeaders() { W.write(DerivedSec.FileOffsetToLineNumbers); W.write(DerivedSec.NumberOfRelocations); W.write(DerivedSec.NumberOfLineNumbers); - W.write(DerivedSec.Flags | DwarfSubtype); + W.write(DerivedSec.Flags); } } } diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp index 0c69f14aa9916..97cb46eeb1674 100644 --- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp @@ -59,6 +59,7 @@ void ScalarEnumerationTraits::enumeration( ECase(SSUBTYP_DWFRAME); ECase(SSUBTYP_DWMAC); #undef ECase + IO.enumFallback(Value); } void ScalarEnumerationTraits::enumeration( @@ -249,7 +250,7 @@ void MappingTraits::mapping(IO &IO, IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations); IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers); IO.mapOptional("Flags", NC->Flags); - IO.mapOptional("DwarfSectionSubtype", Sec.DwarfSectionSubtype); + IO.mapOptional("DwarfSectionSubtype", Sec.SectionSubtype); IO.mapOptional("SectionData", Sec.SectionData); IO.mapOptional("Relocations", Sec.Relocations); } diff --git a/llvm/test/CodeGen/PowerPC/aix-dwarf.ll b/llvm/test/CodeGen/PowerPC/aix-dwarf.ll index eaa7c493ee6ae..5b176e30ab1ed 100644 --- a/llvm/test/CodeGen/PowerPC/aix-dwarf.ll +++ b/llvm/test/CodeGen/PowerPC/aix-dwarf.ll @@ -84,6 +84,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 0 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) +; SEC-NEXT: DwarfSubType: SSUBTYP_DWABREV (0x60000) ; SEC-NEXT: } ; SEC-NEXT: Section { ; SEC-NEXT: Index: 4 @@ -100,6 +101,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 4 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) +; SEC-NEXT: DwarfSubType: SSUBTYP_DWINFO (0x10000) ; SEC-NEXT: } ; SEC-NEXT: Section { ; SEC-NEXT: Index: 5 @@ -116,6 +118,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 1 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) +; SEC-NEXT: DwarfSubType: SSUBTYP_DWLINE (0x20000) ; SEC-NEXT: } ; SEC-NEXT: ] diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml new file mode 100644 index 0000000000000..7896aa9e9fa87 --- /dev/null +++ b/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml @@ -0,0 +1,108 @@ +## Test that we can generate and read DWARF section headers +# RUN: yaml2obj %s -o %t32 +# RUN: llvm-readobj --section-headers %t32 | \ +# RUN FileCheck -check-prefixes=HDRS,HDRS32 %s +# RUN: obj2yaml %t32 | FileCheck -check-prefix=YAML %s + +# RUN: yaml2obj -DMAGIC=0x01F7 -DSectionOrLength=SectionOrLengthLo %s -o %t64 +# RUN: llvm-readobj --section-headers %t64 | \ +# RUN FileCheck -check-prefixes=HDRS,HDRS64 %s +# RUN: obj2yaml %t64 | FileCheck -check-prefix=YAML %s + +# YAML: - Name: .dwabrev +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWABREV +# YAML: - Name: .dwinfo +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWINFO +# YAML: - Name: .dwline +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWLINE + +# HDRS32: Format: aixcoff-rs6000 +# HDRS64: Format: aix5coff64-rs6000 +# HDRS: Arch: powerpc +# HDRS-NEXT: AddressSize: 32bit +# HDRS-NEXT: Sections [ +# HDRS-NEXT: Section { +# HDRS: Index: 1 +# HDRS-NEXT: Name: .data +# HDRS: Type: STYP_DATA (0x40) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 2 +# HDRS-NEXT: Name: .dwabrev +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DwarfSubType: SSUBTYP_DWABREV (0x60000) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 3 +# HDRS-NEXT: Name: .dwinfo +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DwarfSubType: SSUBTYP_DWINFO (0x10000) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 4 +# HDRS-NEXT: Name: .dwline +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DwarfSubType: SSUBTYP_DWLINE (0x20000) + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x01DF]] + NumberOfSections: 4 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DwarfSectionSubtype: SSUBTYP_DWABREV + SectionData: 01110125 + - Name: .dwinfo + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DwarfSectionSubtype: SSUBTYP_DWINFO + SectionData: 00000080 + - Name: .dwline + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DwarfSectionSubtype: SSUBTYP_DWLINE + SectionData: 00000021 +Symbols: + - Name: .file + Value: 0x0 + Section: N_DEBUG + Type: 0x3 + StorageClass: C_FILE + NumberOfAuxEntries: 2 + AuxEntries: + - Type: AUX_FILE + FileNameOrString: d2.c + FileStringType: XFT_FN + - Type: AUX_FILE + FileNameOrString: LLVM version 17.0.6 + FileStringType: XFT_CV + - Name: foo + Value: 0x0 + Section: .data + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + SymbolType: XTY_SD + SymbolAlignment: 2 + StorageMappingClass: XMC_RW + [[SectionOrLength=SectionOrLength]]: 4 +StringTable: {} +... diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml new file mode 100644 index 0000000000000..2ab95a95b3d6f --- /dev/null +++ b/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml @@ -0,0 +1,104 @@ +## Test that we can generate and read DWARF section headers +# RUN: not yaml2obj --docnum=1 %s -o %t 2>&1 | FileCheck -check-prefix=ERR1 %s + +# ERR1: the low-order bits of DwarfSectionSubtype must be 0 + +--- !XCOFF +FileHeader: + MagicNumber: 0x01DF + NumberOfSections: 2 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DwarfSectionSubtype: 0x12345 + SectionData: 01110125 +Symbols: + - Name: .file + Value: 0x0 + Section: N_DEBUG + Type: 0x3 + StorageClass: C_FILE + NumberOfAuxEntries: 2 + AuxEntries: + - Type: AUX_FILE + FileNameOrString: d2.c + FileStringType: XFT_FN + - Type: AUX_FILE + FileNameOrString: LLVM version 17 + FileStringType: XFT_CV + - Name: foo + Value: 0x0 + Section: .data + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + SymbolType: XTY_SD + SymbolAlignment: 2 + StorageMappingClass: XMC_RW + SectionOrLength: 4 +StringTable: {} +... + +# RUN: not yaml2obj --docnum=2 %s -o %t 2>&1 | FileCheck -check-prefix=ERR2 %s + +# ERR2: a DwarfSectionSubtype is only allowed for a dwarf section + +--- !XCOFF +FileHeader: + MagicNumber: 0x01DF + NumberOfSections: 2 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + DwarfSectionSubtype: SSUBTYP_DWABREV + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + SectionData: 01110125 +Symbols: + - Name: .file + Value: 0x0 + Section: N_DEBUG + Type: 0x3 + StorageClass: C_FILE + NumberOfAuxEntries: 2 + AuxEntries: + - Type: AUX_FILE + FileNameOrString: d2.c + FileStringType: XFT_FN + - Type: AUX_FILE + FileNameOrString: LLVM version 17 + FileStringType: XFT_CV + - Name: foo + Value: 0x0 + Section: .data + Type: 0x0 + StorageClass: C_EXT + NumberOfAuxEntries: 1 + AuxEntries: + - Type: AUX_CSECT + SymbolType: XTY_SD + SymbolAlignment: 2 + StorageMappingClass: XMC_RW + SectionOrLength: 4 +StringTable: {} +... diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index 8ebd670d5d56a..edc844be68a16 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -111,6 +111,7 @@ void XCOFFDumper::printFileHeaders() { TimeStamp); } + // The number of symbol table entries is an unsigned value in 64-bit objects // and a signed value (with negative values being 'reserved') in 32-bit // objects. @@ -983,6 +984,17 @@ const EnumEntry SectionTypeFlagsNames[] = { #undef ECase }; +const EnumEntry + DwarfSectionSubtypeFlagsNames[] = { +#define ECase(X) \ + { #X, XCOFF::X } + ECase(SSUBTYP_DWINFO), ECase(SSUBTYP_DWLINE), ECase(SSUBTYP_DWPBNMS), + ECase(SSUBTYP_DWPBTYP), ECase(SSUBTYP_DWARNGE), ECase(SSUBTYP_DWABREV), + ECase(SSUBTYP_DWSTR), ECase(SSUBTYP_DWRNGES), ECase(SSUBTYP_DWLOC), + ECase(SSUBTYP_DWFRAME), ECase(SSUBTYP_DWMAC) +#undef ECase +}; + template void XCOFFDumper::printOverflowSectionHeader(T &Sec) const { if (Obj.is64Bit()) { @@ -1180,6 +1192,7 @@ void XCOFFDumper::printSectionHeaders(ArrayRef Sections) { W.printNumber("Index", Index++); uint16_t SectionType = Sec.getSectionType(); + int32_t SectionSubtype = Sec.getSectionSubtype(); switch (SectionType) { case XCOFF::STYP_OVRFLO: printOverflowSectionHeader(Sec); @@ -1197,8 +1210,13 @@ void XCOFFDumper::printSectionHeaders(ArrayRef Sections) { } if (Sec.isReservedSectionType()) W.printHex("Flags", "Reserved", SectionType); - else + else { W.printEnum("Type", SectionType, ArrayRef(SectionTypeFlagsNames)); + if (SectionType == XCOFF::STYP_DWARF) { + W.printEnum("DwarfSubType", SectionSubtype, + ArrayRef(DwarfSectionSubtypeFlagsNames)); + } + } } if (opts::SectionRelocations) diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp index 990634f5e3991..1d04fc2902ea3 100644 --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -96,11 +96,11 @@ Error XCOFFDumper::dumpSections(ArrayRef Sections) { YamlSec.FileOffsetToLineNumbers = S.FileOffsetToLineNumberInfo; YamlSec.Flags = S.Flags; if (YamlSec.Flags & XCOFF::STYP_DWARF) { - YamlSec.DwarfSectionSubtype = - static_cast( - S.Flags & - XCOFFSectionHeader< - XCOFFSectionHeader32>::SectionDwarfSubflagsTypeMask); + unsigned mask = Obj.is64Bit() + ? XCOFFSectionHeader64::SectionFlagsSubtypeMask + : XCOFFSectionHeader32::SectionFlagsSubtypeMask; + YamlSec.SectionSubtype = + static_cast(S.Flags & mask); } // Dump section data. From aa8856afa67f94811f69aca3b9ad4914673432c8 Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Tue, 13 Feb 2024 16:41:25 -0500 Subject: [PATCH 3/6] Formatting --- llvm/tools/llvm-readobj/XCOFFDumper.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index edc844be68a16..9b8fe442607f7 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -111,7 +111,6 @@ void XCOFFDumper::printFileHeaders() { TimeStamp); } - // The number of symbol table entries is an unsigned value in 64-bit objects // and a signed value (with negative values being 'reserved') in 32-bit // objects. From 0620eee3fb2c09eda7e9ca20a8bea90062371359 Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Wed, 14 Feb 2024 10:56:24 -0500 Subject: [PATCH 4/6] Formatting --- llvm/lib/Object/XCOFFObjectFile.cpp | 4 ++-- llvm/lib/ObjectYAML/XCOFFEmitter.cpp | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 3138860c7e7ca..7dd0cf52aaa89 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -762,8 +762,8 @@ size_t XCOFFObjectFile::getFileHeaderSize() const { } size_t XCOFFObjectFile::getSectionHeaderSize() const { - return is64Bit() ? sizeof(XCOFFSectionHeader64) - : sizeof(XCOFFSectionHeader32); + return is64Bit() ? sizeof(XCOFFSectionHeader64) : + sizeof(XCOFFSectionHeader32); } bool XCOFFObjectFile::is64Bit() const { diff --git a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp index 284e8a3b1b359..c8e64fa3da04f 100644 --- a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp @@ -226,7 +226,6 @@ bool XCOFFWriter::initSectionHeaders(uint64_t &CurrentOffset) { InitSections[I].Flags |= DwarfSubtype; } } - return initRelocations(CurrentOffset); } @@ -529,7 +528,6 @@ void XCOFFWriter::writeSectionHeaders() { for (uint16_t I = 0, E = Obj.Sections.size(); I < E; ++I) { XCOFFYAML::Section DerivedSec = InitSections[I]; writeName(DerivedSec.SectionName, W); - if (Is64Bit) { // Virtual address is the same as physical address. W.write(DerivedSec.Address); // Physical address From 38c1d5ed7c15f6c89ddefec584f12d4edf0d0c32 Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Thu, 15 Feb 2024 18:03:56 -0500 Subject: [PATCH 5/6] Updates based on review comments. --- llvm/include/llvm/Object/XCOFFObjectFile.h | 8 +- llvm/lib/Object/XCOFFObjectFile.cpp | 5 +- llvm/lib/ObjectYAML/XCOFFEmitter.cpp | 14 +- llvm/lib/ObjectYAML/XCOFFYAML.cpp | 2 +- .../tools/llvm-readobj/XCOFF/sections.test | 146 ++++++++++-------- .../XCOFF/dwarf-subsection-types.yaml | 138 +++++++++++++++++ llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml | 108 ------------- llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml | 104 ------------- llvm/tools/llvm-readobj/XCOFFDumper.cpp | 6 +- llvm/tools/obj2yaml/xcoff2yaml.cpp | 8 +- 10 files changed, 240 insertions(+), 299 deletions(-) create mode 100644 llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml delete mode 100644 llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml delete mode 100644 llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml diff --git a/llvm/include/llvm/Object/XCOFFObjectFile.h b/llvm/include/llvm/Object/XCOFFObjectFile.h index 7a6542ac6723b..fa23aa9c5d3f4 100644 --- a/llvm/include/llvm/Object/XCOFFObjectFile.h +++ b/llvm/include/llvm/Object/XCOFFObjectFile.h @@ -158,16 +158,14 @@ template struct XCOFFSectionHeader { static constexpr unsigned SectionFlagsReservedMask = 0x7; // The low order 16 bits of section flags denotes the section type. - static constexpr unsigned SectionFlagsTypeMask = 0xffffu; - // The high order 16 bits of section flags denotes the section subtype. - // For now, this is only used for dwarf sections. - static constexpr unsigned SectionFlagsSubtypeMask = 0xffff0000u; + // For now, this is only used for DWARF sections. + static constexpr unsigned SectionFlagsTypeMask = 0xffffu; public: StringRef getName() const; uint16_t getSectionType() const; - int32_t getSectionSubtype() const; + uint32_t getSectionSubtype() const; bool isReservedSectionType() const; }; diff --git a/llvm/lib/Object/XCOFFObjectFile.cpp b/llvm/lib/Object/XCOFFObjectFile.cpp index 7dd0cf52aaa89..d09e7b0698ca0 100644 --- a/llvm/lib/Object/XCOFFObjectFile.cpp +++ b/llvm/lib/Object/XCOFFObjectFile.cpp @@ -64,9 +64,10 @@ template uint16_t XCOFFSectionHeader::getSectionType() const { return DerivedXCOFFSectionHeader.Flags & SectionFlagsTypeMask; } -template int32_t XCOFFSectionHeader::getSectionSubtype() const { +template +uint32_t XCOFFSectionHeader::getSectionSubtype() const { const T &DerivedXCOFFSectionHeader = static_cast(*this); - return DerivedXCOFFSectionHeader.Flags & SectionFlagsSubtypeMask; + return DerivedXCOFFSectionHeader.Flags & ~SectionFlagsTypeMask; } template diff --git a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp index c8e64fa3da04f..0f03d3c48a317 100644 --- a/llvm/lib/ObjectYAML/XCOFFEmitter.cpp +++ b/llvm/lib/ObjectYAML/XCOFFEmitter.cpp @@ -211,19 +211,19 @@ bool XCOFFWriter::initSectionHeaders(uint64_t &CurrentOffset) { } } if (InitSections[I].SectionSubtype) { - uint32_t DwarfSubtype = + uint32_t DWARFSubtype = static_cast(*InitSections[I].SectionSubtype); if (InitSections[I].Flags != XCOFF::STYP_DWARF) { - ErrHandler("a DwarfSectionSubtype is only allowed for a dwarf section"); + ErrHandler("a DWARFSectionSubtype is only allowed for a DWARF section"); return false; } - unsigned mask = Is64Bit ? XCOFFSectionHeader64::SectionFlagsSubtypeMask - : XCOFFSectionHeader32::SectionFlagsSubtypeMask; - if (DwarfSubtype & ~mask) { - ErrHandler("the low-order bits of DwarfSectionSubtype must be 0"); + unsigned Mask = Is64Bit ? XCOFFSectionHeader64::SectionFlagsTypeMask + : XCOFFSectionHeader32::SectionFlagsTypeMask; + if (DWARFSubtype & Mask) { + ErrHandler("the low-order bits of DWARFSectionSubtype must be 0"); return false; } - InitSections[I].Flags |= DwarfSubtype; + InitSections[I].Flags |= DWARFSubtype; } } return initRelocations(CurrentOffset); diff --git a/llvm/lib/ObjectYAML/XCOFFYAML.cpp b/llvm/lib/ObjectYAML/XCOFFYAML.cpp index 97cb46eeb1674..575334ee980e8 100644 --- a/llvm/lib/ObjectYAML/XCOFFYAML.cpp +++ b/llvm/lib/ObjectYAML/XCOFFYAML.cpp @@ -250,7 +250,7 @@ void MappingTraits::mapping(IO &IO, IO.mapOptional("NumberOfRelocations", Sec.NumberOfRelocations); IO.mapOptional("NumberOfLineNumbers", Sec.NumberOfLineNumbers); IO.mapOptional("Flags", NC->Flags); - IO.mapOptional("DwarfSectionSubtype", Sec.SectionSubtype); + IO.mapOptional("DWARFSectionSubtype", Sec.SectionSubtype); IO.mapOptional("SectionData", Sec.SectionData); IO.mapOptional("Relocations", Sec.Relocations); } diff --git a/llvm/test/tools/llvm-readobj/XCOFF/sections.test b/llvm/test/tools/llvm-readobj/XCOFF/sections.test index 36e85d6033652..c281a09917c78 100644 --- a/llvm/test/tools/llvm-readobj/XCOFF/sections.test +++ b/llvm/test/tools/llvm-readobj/XCOFF/sections.test @@ -2,39 +2,79 @@ # RUN: yaml2obj %s -o %t1 # RUN: llvm-readobj --section-headers %t1 | \ -# RUN: FileCheck --strict-whitespace --match-full-lines --check-prefix=SEC32 %s +# RUN: FileCheck --strict-whitespace --match-full-lines --check-prefixes=SEC,SEC32 %s + +# RUN: yaml2obj -DMAGIC=0x01F7 %s -o %t2 +# RUN: llvm-readobj --section-headers %t2 | \ +# RUN: FileCheck --strict-whitespace --match-full-lines --check-prefixes=SEC,SEC64 %s # SEC32:Format: aixcoff-rs6000 +# SEC64:Format: aix5coff64-rs6000 # SEC32-NEXT:Arch: powerpc +# SEC64-NEXT:Arch: powerpc64 # SEC32-NEXT:AddressSize: 32bit -# SEC32-NEXT:Sections [ -# SEC32-NEXT: Section { -# SEC32-NEXT: Index: 1 -# SEC32-NEXT: Name: .text -# SEC32-NEXT: PhysicalAddress: 0x0 -# SEC32-NEXT: VirtualAddress: 0x0 -# SEC32-NEXT: Size: 0x2 -# SEC32-NEXT: RawDataOffset: 0x64 -# SEC32-NEXT: RelocationPointer: 0x0 -# SEC32-NEXT: LineNumberPointer: 0x0 -# SEC32-NEXT: NumberOfRelocations: 0 -# SEC32-NEXT: NumberOfLineNumbers: 0 -# SEC32-NEXT: Type: STYP_TEXT (0x20) -# SEC32-NEXT: } -# SEC32-NEXT: Section { -# SEC32-NEXT: Index: 2 -# SEC32-NEXT: Name: .data -# SEC32-NEXT: PhysicalAddress: 0x0 -# SEC32-NEXT: VirtualAddress: 0x0 -# SEC32-NEXT: Size: 0x2 -# SEC32-NEXT: RawDataOffset: 0x68 -# SEC32-NEXT: RelocationPointer: 0x6A -# SEC32-NEXT: LineNumberPointer: 0x0 -# SEC32-NEXT: NumberOfRelocations: 1 -# SEC32-NEXT: NumberOfLineNumbers: 0 -# SEC32-NEXT: Type: STYP_DATA (0x40) -# SEC32-NEXT: } -# SEC32-NEXT:] +# SEC64-NEXT:AddressSize: 64bit +# SEC-NEXT:Sections [ +# SEC-NEXT: Section { +# SEC-NEXT: Index: 1 +# SEC-NEXT: Name: .text +# SEC-NEXT: PhysicalAddress: 0x0 +# SEC-NEXT: VirtualAddress: 0x0 +# SEC-NEXT: Size: 0x2 +# SEC32-NEXT: RawDataOffset: 0xB4 +# SEC64-NEXT: RawDataOffset: 0x138 +# SEC-NEXT: RelocationPointer: 0x0 +# SEC-NEXT: LineNumberPointer: 0x0 +# SEC-NEXT: NumberOfRelocations: 0 +# SEC-NEXT: NumberOfLineNumbers: 0 +# SEC-NEXT: Type: STYP_TEXT (0x20) +# SEC-NEXT: } +# SEC-NEXT: Section { +# SEC-NEXT: Index: 2 +# SEC-NEXT: Name: .data +# SEC-NEXT: PhysicalAddress: 0x0 +# SEC-NEXT: VirtualAddress: 0x0 +# SEC-NEXT: Size: 0x2 +# SEC32-NEXT: RawDataOffset: 0xB8 +# SEC64-NEXT: RawDataOffset: 0x13C +# SEC32-NEXT: RelocationPointer: 0xC4 +# SEC64-NEXT: RelocationPointer: 0x148 +# SEC-NEXT: LineNumberPointer: 0x0 +# SEC-NEXT: NumberOfRelocations: 1 +# SEC-NEXT: NumberOfLineNumbers: 0 +# SEC-NEXT: Type: STYP_DATA (0x40) +# SEC-NEXT: } +# SEC-NEXT: Section { +# SEC-NEXT: Index: 3 +# SEC-NEXT: Name: .dwabrev +# SEC-NEXT: PhysicalAddress: 0x0 +# SEC-NEXT: VirtualAddress: 0x0 +# SEC-NEXT: Size: 0x4 +# SEC32-NEXT: RawDataOffset: 0xBC +# SEC64-NEXT: RawDataOffset: 0x140 +# SEC-NEXT: RelocationPointer: 0x0 +# SEC-NEXT: LineNumberPointer: 0x0 +# SEC-NEXT: NumberOfRelocations: 0 +# SEC-NEXT: NumberOfLineNumbers: 0 +# SEC-NEXT: Type: STYP_DWARF (0x10) +# SEC-NEXT: DWARFSubType: SSUBTYP_DWABREV (0x60000) +# SEC-NEXT: } +# SEC-NEXT: Section { +# SEC-NEXT: Index: 4 +# SEC-NEXT: Name: .dwinfo +# SEC-NEXT: PhysicalAddress: 0x0 +# SEC-NEXT: VirtualAddress: 0x0 +# SEC-NEXT: Size: 0x4 +# SEC32-NEXT: RawDataOffset: 0xC0 +# SEC64-NEXT: RawDataOffset: 0x144 +# SEC-NEXT: RelocationPointer: 0x0 +# SEC-NEXT: LineNumberPointer: 0x0 +# SEC-NEXT: NumberOfRelocations: 0 +# SEC-NEXT: NumberOfLineNumbers: 0 +# SEC-NEXT: Type: STYP_DWARF (0x10) +# SEC-NEXT: DWARFSubType: SSUBTYP_DWINFO (0x10000) +# SEC-NEXT: } +# SEC-NEXT:] --- !XCOFF FileHeader: @@ -51,39 +91,15 @@ Sections: Symbol: 0x21 Info: 0x1F Type: 0x0 - -# RUN: yaml2obj -DMAGIC=0x01F7 %s -o %t2 -# RUN: llvm-readobj --section-headers %t2 | \ -# RUN: FileCheck --strict-whitespace --match-full-lines --check-prefix=SEC64 %s - -# SEC64:Format: aix5coff64-rs6000 -# SEC64-NEXT:Arch: powerpc64 -# SEC64-NEXT:AddressSize: 64bit -# SEC64-NEXT:Sections [ -# SEC64-NEXT: Section { -# SEC64-NEXT: Index: 1 -# SEC64-NEXT: Name: .text -# SEC64-NEXT: PhysicalAddress: 0x0 -# SEC64-NEXT: VirtualAddress: 0x0 -# SEC64-NEXT: Size: 0x2 -# SEC64-NEXT: RawDataOffset: 0xA8 -# SEC64-NEXT: RelocationPointer: 0x0 -# SEC64-NEXT: LineNumberPointer: 0x0 -# SEC64-NEXT: NumberOfRelocations: 0 -# SEC64-NEXT: NumberOfLineNumbers: 0 -# SEC64-NEXT: Type: STYP_TEXT (0x20) -# SEC64-NEXT: } -# SEC64-NEXT: Section { -# SEC64-NEXT: Index: 2 -# SEC64-NEXT: Name: .data -# SEC64-NEXT: PhysicalAddress: 0x0 -# SEC64-NEXT: VirtualAddress: 0x0 -# SEC64-NEXT: Size: 0x2 -# SEC64-NEXT: RawDataOffset: 0xAC -# SEC64-NEXT: RelocationPointer: 0xAE -# SEC64-NEXT: LineNumberPointer: 0x0 -# SEC64-NEXT: NumberOfRelocations: 1 -# SEC64-NEXT: NumberOfLineNumbers: 0 -# SEC64-NEXT: Type: STYP_DATA (0x40) -# SEC64-NEXT: } -# SEC64-NEXT:] + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: SSUBTYP_DWABREV + SectionData: 01110125 + - Name: .dwinfo + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: SSUBTYP_DWINFO + SectionData: 00000080 diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml new file mode 100644 index 0000000000000..424da0ec09090 --- /dev/null +++ b/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml @@ -0,0 +1,138 @@ +## Test that we can generate and read DWARF section headers. + +# RUN: yaml2obj --docnum=1 %s -o %t32 +# RUN: llvm-readobj --section-headers %t32 | \ +# RUN FileCheck --check-prefixes=HDRS,HDRS32 %s +# RUN: obj2yaml %t32 | FileCheck --check-prefix=YAML %s + +# RUN: yaml2obj --docnum=1 -DMAGIC=0x01F7 %s -o %t64 +# RUN: llvm-readobj --section-headers %t64 | \ +# RUN FileCheck --check-prefixes=HDRS,HDRS64 %s +# RUN: obj2yaml %t64 | FileCheck --check-prefix=YAML %s + +# YAML: - Name: .dwabrev +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DWARFSectionSubtype: SSUBTYP_DWABREV +# YAML: - Name: .dwinfo +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DWARFSectionSubtype: SSUBTYP_DWINFO +# YAML: - Name: .dwline +# YAML: Flags: [ STYP_DWARF ] +# YAML-NEXT: DWARFSectionSubtype: SSUBTYP_DWLINE + +# HDRS32: Format: aixcoff-rs6000 +# HDRS64: Format: aix5coff64-rs6000 +# HDRS: Arch: powerpc +# HDRS-NEXT: AddressSize: 32bit +# HDRS-NEXT: Sections [ +# HDRS-NEXT: Section { +# HDRS: Index: 1 +# HDRS-NEXT: Name: .data +# HDRS: Type: STYP_DATA (0x40) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 2 +# HDRS-NEXT: Name: .dwabrev +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DWARFSubType: SSUBTYP_DWABREV (0x60000) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 3 +# HDRS-NEXT: Name: .dwinfo +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DWARFSubType: SSUBTYP_DWINFO (0x10000) +# HDRS-NEXT: } +# HDRS-NEXT: Section { +# HDRS-NEXT: Index: 4 +# HDRS-NEXT: Name: .dwline +# HDRS: Type: STYP_DWARF (0x10) +# HDRS-NEXT: DWARFSubType: SSUBTYP_DWLINE (0x20000) + +--- !XCOFF +FileHeader: + MagicNumber: [[MAGIC=0x01DF]] + NumberOfSections: 4 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: SSUBTYP_DWABREV + SectionData: 01110125 + - Name: .dwinfo + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: SSUBTYP_DWINFO + SectionData: 00000080 + - Name: .dwline + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: SSUBTYP_DWLINE + SectionData: 00000021 +StringTable: {} +... + + +## Test that an invalid DWARF section subtype is diagnosed. +# RUN: not yaml2obj --docnum=2 %s -o %t 2>&1 | FileCheck --check-prefix=ERR1 %s + +# ERR1: the low-order bits of DWARFSectionSubtype must be 0 + +--- !XCOFF +FileHeader: + MagicNumber: 0x01DF + NumberOfSections: 2 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + DWARFSectionSubtype: 0x12345 + SectionData: 01110125 +StringTable: {} +... + +## Test that a DWARF section subtype on a non-DWARF section is diagnosed. +# RUN: not yaml2obj --docnum=3 %s -o %t 2>&1 | FileCheck --check-prefix=ERR2 %s + +# ERR2: a DWARFSectionSubtype is only allowed for a DWARF section + +--- !XCOFF +FileHeader: + MagicNumber: 0x01DF + NumberOfSections: 2 + CreationTime: 0 + AuxiliaryHeaderSize: 0 + Flags: 0x0 +Sections: + - Name: .data + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DATA ] + DWARFSectionSubtype: SSUBTYP_DWABREV + SectionData: '00000001' + - Name: .dwabrev + Address: 0x0 + Size: 0x4 + Flags: [ STYP_DWARF ] + SectionData: 01110125 +StringTable: {} +... diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml deleted file mode 100644 index 7896aa9e9fa87..0000000000000 --- a/llvm/test/tools/yaml2obj/XCOFF/dwarf.yaml +++ /dev/null @@ -1,108 +0,0 @@ -## Test that we can generate and read DWARF section headers -# RUN: yaml2obj %s -o %t32 -# RUN: llvm-readobj --section-headers %t32 | \ -# RUN FileCheck -check-prefixes=HDRS,HDRS32 %s -# RUN: obj2yaml %t32 | FileCheck -check-prefix=YAML %s - -# RUN: yaml2obj -DMAGIC=0x01F7 -DSectionOrLength=SectionOrLengthLo %s -o %t64 -# RUN: llvm-readobj --section-headers %t64 | \ -# RUN FileCheck -check-prefixes=HDRS,HDRS64 %s -# RUN: obj2yaml %t64 | FileCheck -check-prefix=YAML %s - -# YAML: - Name: .dwabrev -# YAML: Flags: [ STYP_DWARF ] -# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWABREV -# YAML: - Name: .dwinfo -# YAML: Flags: [ STYP_DWARF ] -# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWINFO -# YAML: - Name: .dwline -# YAML: Flags: [ STYP_DWARF ] -# YAML-NEXT: DwarfSectionSubtype: SSUBTYP_DWLINE - -# HDRS32: Format: aixcoff-rs6000 -# HDRS64: Format: aix5coff64-rs6000 -# HDRS: Arch: powerpc -# HDRS-NEXT: AddressSize: 32bit -# HDRS-NEXT: Sections [ -# HDRS-NEXT: Section { -# HDRS: Index: 1 -# HDRS-NEXT: Name: .data -# HDRS: Type: STYP_DATA (0x40) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 2 -# HDRS-NEXT: Name: .dwabrev -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DwarfSubType: SSUBTYP_DWABREV (0x60000) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 3 -# HDRS-NEXT: Name: .dwinfo -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DwarfSubType: SSUBTYP_DWINFO (0x10000) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 4 -# HDRS-NEXT: Name: .dwline -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DwarfSubType: SSUBTYP_DWLINE (0x20000) - ---- !XCOFF -FileHeader: - MagicNumber: [[MAGIC=0x01DF]] - NumberOfSections: 4 - CreationTime: 0 - AuxiliaryHeaderSize: 0 - Flags: 0x0 -Sections: - - Name: .data - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DATA ] - SectionData: '00000001' - - Name: .dwabrev - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DWARF ] - DwarfSectionSubtype: SSUBTYP_DWABREV - SectionData: 01110125 - - Name: .dwinfo - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DWARF ] - DwarfSectionSubtype: SSUBTYP_DWINFO - SectionData: 00000080 - - Name: .dwline - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DWARF ] - DwarfSectionSubtype: SSUBTYP_DWLINE - SectionData: 00000021 -Symbols: - - Name: .file - Value: 0x0 - Section: N_DEBUG - Type: 0x3 - StorageClass: C_FILE - NumberOfAuxEntries: 2 - AuxEntries: - - Type: AUX_FILE - FileNameOrString: d2.c - FileStringType: XFT_FN - - Type: AUX_FILE - FileNameOrString: LLVM version 17.0.6 - FileStringType: XFT_CV - - Name: foo - Value: 0x0 - Section: .data - Type: 0x0 - StorageClass: C_EXT - NumberOfAuxEntries: 1 - AuxEntries: - - Type: AUX_CSECT - SymbolType: XTY_SD - SymbolAlignment: 2 - StorageMappingClass: XMC_RW - [[SectionOrLength=SectionOrLength]]: 4 -StringTable: {} -... diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml deleted file mode 100644 index 2ab95a95b3d6f..0000000000000 --- a/llvm/test/tools/yaml2obj/XCOFF/dwarf2.yaml +++ /dev/null @@ -1,104 +0,0 @@ -## Test that we can generate and read DWARF section headers -# RUN: not yaml2obj --docnum=1 %s -o %t 2>&1 | FileCheck -check-prefix=ERR1 %s - -# ERR1: the low-order bits of DwarfSectionSubtype must be 0 - ---- !XCOFF -FileHeader: - MagicNumber: 0x01DF - NumberOfSections: 2 - CreationTime: 0 - AuxiliaryHeaderSize: 0 - Flags: 0x0 -Sections: - - Name: .data - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DATA ] - SectionData: '00000001' - - Name: .dwabrev - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DWARF ] - DwarfSectionSubtype: 0x12345 - SectionData: 01110125 -Symbols: - - Name: .file - Value: 0x0 - Section: N_DEBUG - Type: 0x3 - StorageClass: C_FILE - NumberOfAuxEntries: 2 - AuxEntries: - - Type: AUX_FILE - FileNameOrString: d2.c - FileStringType: XFT_FN - - Type: AUX_FILE - FileNameOrString: LLVM version 17 - FileStringType: XFT_CV - - Name: foo - Value: 0x0 - Section: .data - Type: 0x0 - StorageClass: C_EXT - NumberOfAuxEntries: 1 - AuxEntries: - - Type: AUX_CSECT - SymbolType: XTY_SD - SymbolAlignment: 2 - StorageMappingClass: XMC_RW - SectionOrLength: 4 -StringTable: {} -... - -# RUN: not yaml2obj --docnum=2 %s -o %t 2>&1 | FileCheck -check-prefix=ERR2 %s - -# ERR2: a DwarfSectionSubtype is only allowed for a dwarf section - ---- !XCOFF -FileHeader: - MagicNumber: 0x01DF - NumberOfSections: 2 - CreationTime: 0 - AuxiliaryHeaderSize: 0 - Flags: 0x0 -Sections: - - Name: .data - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DATA ] - DwarfSectionSubtype: SSUBTYP_DWABREV - SectionData: '00000001' - - Name: .dwabrev - Address: 0x0 - Size: 0x4 - Flags: [ STYP_DWARF ] - SectionData: 01110125 -Symbols: - - Name: .file - Value: 0x0 - Section: N_DEBUG - Type: 0x3 - StorageClass: C_FILE - NumberOfAuxEntries: 2 - AuxEntries: - - Type: AUX_FILE - FileNameOrString: d2.c - FileStringType: XFT_FN - - Type: AUX_FILE - FileNameOrString: LLVM version 17 - FileStringType: XFT_CV - - Name: foo - Value: 0x0 - Section: .data - Type: 0x0 - StorageClass: C_EXT - NumberOfAuxEntries: 1 - AuxEntries: - - Type: AUX_CSECT - SymbolType: XTY_SD - SymbolAlignment: 2 - StorageMappingClass: XMC_RW - SectionOrLength: 4 -StringTable: {} -... diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp index 9b8fe442607f7..e7f50e8a18841 100644 --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -984,7 +984,7 @@ const EnumEntry SectionTypeFlagsNames[] = { }; const EnumEntry - DwarfSectionSubtypeFlagsNames[] = { + DWARFSectionSubtypeFlagsNames[] = { #define ECase(X) \ { #X, XCOFF::X } ECase(SSUBTYP_DWINFO), ECase(SSUBTYP_DWLINE), ECase(SSUBTYP_DWPBNMS), @@ -1212,8 +1212,8 @@ void XCOFFDumper::printSectionHeaders(ArrayRef Sections) { else { W.printEnum("Type", SectionType, ArrayRef(SectionTypeFlagsNames)); if (SectionType == XCOFF::STYP_DWARF) { - W.printEnum("DwarfSubType", SectionSubtype, - ArrayRef(DwarfSectionSubtypeFlagsNames)); + W.printEnum("DWARFSubType", SectionSubtype, + ArrayRef(DWARFSectionSubtypeFlagsNames)); } } } diff --git a/llvm/tools/obj2yaml/xcoff2yaml.cpp b/llvm/tools/obj2yaml/xcoff2yaml.cpp index 1d04fc2902ea3..4b9ebb85b62e3 100644 --- a/llvm/tools/obj2yaml/xcoff2yaml.cpp +++ b/llvm/tools/obj2yaml/xcoff2yaml.cpp @@ -96,11 +96,11 @@ Error XCOFFDumper::dumpSections(ArrayRef Sections) { YamlSec.FileOffsetToLineNumbers = S.FileOffsetToLineNumberInfo; YamlSec.Flags = S.Flags; if (YamlSec.Flags & XCOFF::STYP_DWARF) { - unsigned mask = Obj.is64Bit() - ? XCOFFSectionHeader64::SectionFlagsSubtypeMask - : XCOFFSectionHeader32::SectionFlagsSubtypeMask; + unsigned Mask = Obj.is64Bit() + ? XCOFFSectionHeader64::SectionFlagsTypeMask + : XCOFFSectionHeader32::SectionFlagsTypeMask; YamlSec.SectionSubtype = - static_cast(S.Flags & mask); + static_cast(S.Flags & ~Mask); } // Dump section data. From dcbe0133edf6925aa3f431f041e213c3435ea33e Mon Sep 17 00:00:00 2001 From: Stephen Peckham Date: Mon, 19 Feb 2024 12:27:31 -0500 Subject: [PATCH 6/6] Update tests --- llvm/test/CodeGen/PowerPC/aix-dwarf.ll | 6 ++-- .../tools/llvm-readobj/XCOFF/sections.test | 22 ++----------- .../XCOFF/dwarf-subsection-types.yaml | 33 ------------------- 3 files changed, 5 insertions(+), 56 deletions(-) diff --git a/llvm/test/CodeGen/PowerPC/aix-dwarf.ll b/llvm/test/CodeGen/PowerPC/aix-dwarf.ll index 5b176e30ab1ed..33e61a8cab376 100644 --- a/llvm/test/CodeGen/PowerPC/aix-dwarf.ll +++ b/llvm/test/CodeGen/PowerPC/aix-dwarf.ll @@ -84,7 +84,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 0 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) -; SEC-NEXT: DwarfSubType: SSUBTYP_DWABREV (0x60000) +; SEC-NEXT: DWARFSubType: SSUBTYP_DWABREV (0x60000) ; SEC-NEXT: } ; SEC-NEXT: Section { ; SEC-NEXT: Index: 4 @@ -101,7 +101,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 4 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) -; SEC-NEXT: DwarfSubType: SSUBTYP_DWINFO (0x10000) +; SEC-NEXT: DWARFSubType: SSUBTYP_DWINFO (0x10000) ; SEC-NEXT: } ; SEC-NEXT: Section { ; SEC-NEXT: Index: 5 @@ -118,7 +118,7 @@ entry: ; SEC-NEXT: NumberOfRelocations: 1 ; SEC-NEXT: NumberOfLineNumbers: 0 ; SEC-NEXT: Type: STYP_DWARF (0x10) -; SEC-NEXT: DwarfSubType: SSUBTYP_DWLINE (0x20000) +; SEC-NEXT: DWARFSubType: SSUBTYP_DWLINE (0x20000) ; SEC-NEXT: } ; SEC-NEXT: ] diff --git a/llvm/test/tools/llvm-readobj/XCOFF/sections.test b/llvm/test/tools/llvm-readobj/XCOFF/sections.test index c281a09917c78..6640d5bb655f5 100644 --- a/llvm/test/tools/llvm-readobj/XCOFF/sections.test +++ b/llvm/test/tools/llvm-readobj/XCOFF/sections.test @@ -47,31 +47,13 @@ # SEC-NEXT: Section { # SEC-NEXT: Index: 3 # SEC-NEXT: Name: .dwabrev -# SEC-NEXT: PhysicalAddress: 0x0 -# SEC-NEXT: VirtualAddress: 0x0 -# SEC-NEXT: Size: 0x4 -# SEC32-NEXT: RawDataOffset: 0xBC -# SEC64-NEXT: RawDataOffset: 0x140 -# SEC-NEXT: RelocationPointer: 0x0 -# SEC-NEXT: LineNumberPointer: 0x0 -# SEC-NEXT: NumberOfRelocations: 0 -# SEC-NEXT: NumberOfLineNumbers: 0 -# SEC-NEXT: Type: STYP_DWARF (0x10) +# SEC: Type: STYP_DWARF (0x10) # SEC-NEXT: DWARFSubType: SSUBTYP_DWABREV (0x60000) # SEC-NEXT: } # SEC-NEXT: Section { # SEC-NEXT: Index: 4 # SEC-NEXT: Name: .dwinfo -# SEC-NEXT: PhysicalAddress: 0x0 -# SEC-NEXT: VirtualAddress: 0x0 -# SEC-NEXT: Size: 0x4 -# SEC32-NEXT: RawDataOffset: 0xC0 -# SEC64-NEXT: RawDataOffset: 0x144 -# SEC-NEXT: RelocationPointer: 0x0 -# SEC-NEXT: LineNumberPointer: 0x0 -# SEC-NEXT: NumberOfRelocations: 0 -# SEC-NEXT: NumberOfLineNumbers: 0 -# SEC-NEXT: Type: STYP_DWARF (0x10) +# SEC: Type: STYP_DWARF (0x10) # SEC-NEXT: DWARFSubType: SSUBTYP_DWINFO (0x10000) # SEC-NEXT: } # SEC-NEXT:] diff --git a/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml b/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml index 424da0ec09090..a24557a247d14 100644 --- a/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml +++ b/llvm/test/tools/yaml2obj/XCOFF/dwarf-subsection-types.yaml @@ -1,13 +1,9 @@ ## Test that we can generate and read DWARF section headers. # RUN: yaml2obj --docnum=1 %s -o %t32 -# RUN: llvm-readobj --section-headers %t32 | \ -# RUN FileCheck --check-prefixes=HDRS,HDRS32 %s # RUN: obj2yaml %t32 | FileCheck --check-prefix=YAML %s # RUN: yaml2obj --docnum=1 -DMAGIC=0x01F7 %s -o %t64 -# RUN: llvm-readobj --section-headers %t64 | \ -# RUN FileCheck --check-prefixes=HDRS,HDRS64 %s # RUN: obj2yaml %t64 | FileCheck --check-prefix=YAML %s # YAML: - Name: .dwabrev @@ -20,34 +16,6 @@ # YAML: Flags: [ STYP_DWARF ] # YAML-NEXT: DWARFSectionSubtype: SSUBTYP_DWLINE -# HDRS32: Format: aixcoff-rs6000 -# HDRS64: Format: aix5coff64-rs6000 -# HDRS: Arch: powerpc -# HDRS-NEXT: AddressSize: 32bit -# HDRS-NEXT: Sections [ -# HDRS-NEXT: Section { -# HDRS: Index: 1 -# HDRS-NEXT: Name: .data -# HDRS: Type: STYP_DATA (0x40) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 2 -# HDRS-NEXT: Name: .dwabrev -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DWARFSubType: SSUBTYP_DWABREV (0x60000) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 3 -# HDRS-NEXT: Name: .dwinfo -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DWARFSubType: SSUBTYP_DWINFO (0x10000) -# HDRS-NEXT: } -# HDRS-NEXT: Section { -# HDRS-NEXT: Index: 4 -# HDRS-NEXT: Name: .dwline -# HDRS: Type: STYP_DWARF (0x10) -# HDRS-NEXT: DWARFSubType: SSUBTYP_DWLINE (0x20000) - --- !XCOFF FileHeader: MagicNumber: [[MAGIC=0x01DF]] @@ -82,7 +50,6 @@ Sections: StringTable: {} ... - ## Test that an invalid DWARF section subtype is diagnosed. # RUN: not yaml2obj --docnum=2 %s -o %t 2>&1 | FileCheck --check-prefix=ERR1 %s