diff -Nru llvm-toolchain-13-13.0.0/debian/changelog llvm-toolchain-13-13.0.0/debian/changelog --- llvm-toolchain-13-13.0.0/debian/changelog 2021-11-08 14:09:25.000000000 +0100 +++ llvm-toolchain-13-13.0.0/debian/changelog 2022-02-08 10:23:06.000000000 +0100 @@ -1,3 +1,10 @@ +llvm-toolchain-13 (1:13.0.0-9ubuntu1) jammy; urgency=medium + + * Backport upstream patches to allow building EFI images for Ubuntu Core + for arm64 (LP: #1960300) + + -- Alfonso Sanchez-Beato (email Canonical) Tue, 08 Feb 2022 10:23:06 +0100 + llvm-toolchain-13 (1:13.0.0-9) unstable; urgency=medium * Upload to unstable (all green on exp) diff -Nru llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Consider-section-flags-when-adding.patch llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Consider-section-flags-when-adding.patch --- llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Consider-section-flags-when-adding.patch 1970-01-01 01:00:00.000000000 +0100 +++ llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Consider-section-flags-when-adding.patch 2022-02-08 10:09:49.000000000 +0100 @@ -0,0 +1,128 @@ +From cdd407286a9652ec62b33f437a298754fe3ba7ab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Alfonso=20S=C3=A1nchez-Beato?= + +Date: Wed, 25 Aug 2021 23:03:32 +0300 +Subject: [PATCH] [llvm-objcopy] [COFF] Consider section flags when adding + section + +The --set-section-flags option was being ignored when adding a new +section. Take it into account if present. + +Fixes https://llvm.org/PR51244 + +Reviewed By: jhenderson, MaskRay + +Differential Revision: https://reviews.llvm.org/D106942 +--- + .../COFF/add-section-and-set-flags.test | 36 +++++++++++++++++++ + llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp | 19 ++++++---- + 2 files changed, 49 insertions(+), 6 deletions(-) + create mode 100644 llvm/test/tools/llvm-objcopy/COFF/add-section-and-set-flags.test + +diff --git a/llvm/test/tools/llvm-objcopy/COFF/add-section-and-set-flags.test b/llvm/test/tools/llvm-objcopy/COFF/add-section-and-set-flags.test +new file mode 100644 +index 000000000000..b5fdcb8f6624 +--- /dev/null ++++ b/llvm/test/tools/llvm-objcopy/COFF/add-section-and-set-flags.test +@@ -0,0 +1,36 @@ ++# RUN: yaml2obj %s -o %t ++ ++## Test that llvm-objcopy can add sections and set its flags in the same ++## call. ++# RUN: echo DEADBEEF > %t.sec ++# RUN: llvm-objcopy --set-section-flags=.test.section1=code --add-section=.test.section1=%t.sec --set-section-flags=.test.section2=data --add-section=.test.section2=%t.sec %t %t1 ++# RUN: llvm-readobj --sections --section-data %t1 | FileCheck %s ++ ++# CHECK: Name: .test.section1 ++# CHECK-NEXT: VirtualSize: 0x9 ++# CHECK-NEXT: VirtualAddress: 0x0 ++# CHECK-NEXT: RawDataSize: 9 ++# CHECK: Characteristics [ ++# CHECK-NEXT: IMAGE_SCN_CNT_CODE ++# CHECK-NEXT: IMAGE_SCN_MEM_EXECUTE ++# CHECK-NEXT: IMAGE_SCN_MEM_READ ++# CHECK-NEXT: IMAGE_SCN_MEM_WRITE ++# CHECK-NEXT: ] ++ ++# CHECK: Name: .test.section2 ++# CHECK-NEXT: VirtualSize: 0x9 ++# CHECK-NEXT: VirtualAddress: 0x9 ++# CHECK-NEXT: RawDataSize: 9 ++# CHECK: Characteristics [ ++# CHECK-NEXT: IMAGE_SCN_CNT_INITIALIZED_DATA ++# CHECK-NEXT: IMAGE_SCN_MEM_READ ++# CHECK-NEXT: IMAGE_SCN_MEM_WRITE ++# CHECK-NEXT: ] ++ ++--- !COFF ++header: ++ Machine: IMAGE_FILE_MACHINE_AMD64 ++ Characteristics: [ ] ++sections: ++symbols: ++... +diff --git a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp b/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp +index e50ac2e12e2f..38c9cd09433b 100644 +--- a/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp ++++ b/llvm/tools/llvm-objcopy/COFF/COFFObjcopy.cpp +@@ -94,7 +94,7 @@ static Error addGnuDebugLink(Object &Obj, StringRef DebugLinkFile) { + return Error::success(); + } + +-static void setSectionFlags(Section &Sec, SectionFlag AllFlags) { ++static uint32_t flagsToCharacteristics(SectionFlag AllFlags, uint32_t OldChar) { + // Need to preserve alignment flags. + const uint32_t PreserveMask = + IMAGE_SCN_ALIGN_1BYTES | IMAGE_SCN_ALIGN_2BYTES | IMAGE_SCN_ALIGN_4BYTES | +@@ -107,8 +107,7 @@ static void setSectionFlags(Section &Sec, SectionFlag AllFlags) { + + // Setup new section characteristics based on the flags provided in command + // line. +- uint32_t NewCharacteristics = +- (Sec.Header.Characteristics & PreserveMask) | IMAGE_SCN_MEM_READ; ++ uint32_t NewCharacteristics = (OldChar & PreserveMask) | IMAGE_SCN_MEM_READ; + + if ((AllFlags & SectionFlag::SecAlloc) && !(AllFlags & SectionFlag::SecLoad)) + NewCharacteristics |= IMAGE_SCN_CNT_UNINITIALIZED_DATA; +@@ -128,7 +127,7 @@ static void setSectionFlags(Section &Sec, SectionFlag AllFlags) { + if (AllFlags & SectionFlag::SecExclude) + NewCharacteristics |= IMAGE_SCN_LNK_REMOVE; + +- Sec.Header.Characteristics = NewCharacteristics; ++ return NewCharacteristics; + } + + static Error handleArgs(const CommonConfig &Config, Object &Obj) { +@@ -226,7 +225,8 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { + for (Section &Sec : Obj.getMutableSections()) { + const auto It = Config.SetSectionFlags.find(Sec.Name); + if (It != Config.SetSectionFlags.end()) +- setSectionFlags(Sec, It->second.NewFlags); ++ Sec.Header.Characteristics = flagsToCharacteristics( ++ It->second.NewFlags, Sec.Header.Characteristics); + } + + for (const auto &Flag : Config.AddSection) { +@@ -238,11 +238,18 @@ static Error handleArgs(const CommonConfig &Config, Object &Obj) { + return createFileError(FileName, errorCodeToError(BufOrErr.getError())); + auto Buf = std::move(*BufOrErr); + ++ uint32_t Characteristics; ++ const auto It = Config.SetSectionFlags.find(SecName); ++ if (It != Config.SetSectionFlags.end()) ++ Characteristics = flagsToCharacteristics(It->second.NewFlags, 0); ++ else ++ Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_1BYTES; ++ + addSection( + Obj, SecName, + makeArrayRef(reinterpret_cast(Buf->getBufferStart()), + Buf->getBufferSize()), +- IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_1BYTES); ++ Characteristics); + } + + if (!Config.AddGnuDebugLink.empty()) +-- +2.25.1 + diff -Nru llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Fix-test-for-debug-dir-presence.patch llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Fix-test-for-debug-dir-presence.patch --- llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Fix-test-for-debug-dir-presence.patch 1970-01-01 01:00:00.000000000 +0100 +++ llvm-toolchain-13-13.0.0/debian/patches/llvm-objcopy-COFF-Fix-test-for-debug-dir-presence.patch 2022-02-08 10:11:30.000000000 +0100 @@ -0,0 +1,124 @@ +From b25ab4f313f38d3dee9674789cf56b9143515034 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Alfonso=20S=C3=A1nchez-Beato?= + +Date: Fri, 10 Sep 2021 09:55:26 +0100 +Subject: [PATCH] [llvm-objcopy][COFF] Fix test for debug dir presence + +If the number of directories was 6 (equal to the DEBUG_DIRECTORY +index), patchDebugDirectory() was run even though the debug directory +is actually the 7th entry. Use <= in the comparison to fix that. + +This fixes https://llvm.org/PR51243 + +Differential Revision: https://reviews.llvm.org/D106940 + +Reviewed by: jhenderson +--- + .../COFF/check-debug-dir-present.test | 81 +++++++++++++++++++ + llvm/tools/llvm-objcopy/COFF/Writer.cpp | 2 +- + 2 files changed, 82 insertions(+), 1 deletion(-) + create mode 100644 llvm/test/tools/llvm-objcopy/COFF/check-debug-dir-present.test + +diff --git a/llvm/test/tools/llvm-objcopy/COFF/check-debug-dir-present.test b/llvm/test/tools/llvm-objcopy/COFF/check-debug-dir-present.test +new file mode 100644 +index 000000000000..7fd10486b585 +--- /dev/null ++++ b/llvm/test/tools/llvm-objcopy/COFF/check-debug-dir-present.test +@@ -0,0 +1,81 @@ ++## We check that we copy sections to an image in the case when there are ++## exactly 6 directory entries. ++# RUN: yaml2obj --docnum=1 %s -o %t ++# RUN: llvm-objcopy --add-section new_sect=%t %t %t1 ++# RUN: obj2yaml %t1 | FileCheck %s ++ ++# CHECK: NumberOfRvaAndSize: 6 ++# CHECK-NEXT: ExportTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK-NEXT: ImportTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK-NEXT: ResourceTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK-NEXT: ExceptionTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK-NEXT: CertificateTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK-NEXT: BaseRelocationTable: ++# CHECK-NEXT: RelativeVirtualAddress: 0 ++# CHECK-NEXT: Size: 0 ++# CHECK: sections: ++# CHECK-NEXT: - Name: foo ++# CHECK-NEXT: Characteristics: [ ] ++# CHECK-NEXT: Alignment: 4 ++# CHECK-NEXT: SectionData: '' ++# CHECK-NEXT: - Name: new_sect ++# CHECK-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA ] ++# CHECK-NEXT: Alignment: 1 ++# CHECK-NEXT: SectionData: '' ++ ++--- !COFF ++OptionalHeader: ++ AddressOfEntryPoint: 4096 ++ ImageBase: 0 ++ SectionAlignment: 4096 ++ FileAlignment: 512 ++ MajorOperatingSystemVersion: 0 ++ MinorOperatingSystemVersion: 0 ++ MajorImageVersion: 0 ++ MinorImageVersion: 0 ++ MajorSubsystemVersion: 0 ++ MinorSubsystemVersion: 0 ++ Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION ++ DLLCharacteristics: [ ] ++ SizeOfStackReserve: 0 ++ SizeOfStackCommit: 0 ++ SizeOfHeapReserve: 0 ++ SizeOfHeapCommit: 0 ++ NumberOfRvaAndSize: 6 ++ ExportTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++ ImportTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++ ResourceTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++ ExceptionTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++ CertificateTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++ BaseRelocationTable: ++ RelativeVirtualAddress: 0 ++ Size: 0 ++header: ++ Machine: IMAGE_FILE_MACHINE_AMD64 ++ Characteristics: [ ] ++sections: ++ - Name: foo ++ Characteristics: [ ] ++ Alignment: 4 ++symbols: ++... +diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/llvm/tools/llvm-objcopy/COFF/Writer.cpp +index 8cc2312d137c..cbd0e4261238 100644 +--- a/llvm/tools/llvm-objcopy/COFF/Writer.cpp ++++ b/llvm/tools/llvm-objcopy/COFF/Writer.cpp +@@ -406,7 +406,7 @@ Expected COFFWriter::virtualAddressToFileAddress(uint32_t RVA) { + // the debug_directory structs in there, and set the PointerToRawData field + // in all of them, according to their new physical location in the file. + Error COFFWriter::patchDebugDirectory() { +- if (Obj.DataDirectories.size() < DEBUG_DIRECTORY) ++ if (Obj.DataDirectories.size() <= DEBUG_DIRECTORY) + return Error::success(); + const data_directory *Dir = &Obj.DataDirectories[DEBUG_DIRECTORY]; + if (Dir->Size <= 0) +-- +2.25.1 + diff -Nru llvm-toolchain-13-13.0.0/debian/patches/series llvm-toolchain-13-13.0.0/debian/patches/series --- llvm-toolchain-13-13.0.0/debian/patches/series 2021-11-08 14:09:25.000000000 +0100 +++ llvm-toolchain-13-13.0.0/debian/patches/series 2022-02-08 10:11:54.000000000 +0100 @@ -150,3 +150,8 @@ llvm-runtimes-builtins-build-check.diff compilerrt-builtins-arch-fix-armhf.diff compilerrt-build-scudo-standalone-option.diff + +# Fix llvm-objcopy for arm64 +llvm-objcopy-COFF-Consider-section-flags-when-adding.patch +yaml2obj-COFF-Allow-variable-number-of-directories.patch +llvm-objcopy-COFF-Fix-test-for-debug-dir-presence.patch diff -Nru llvm-toolchain-13-13.0.0/debian/patches/yaml2obj-COFF-Allow-variable-number-of-directories.patch llvm-toolchain-13-13.0.0/debian/patches/yaml2obj-COFF-Allow-variable-number-of-directories.patch --- llvm-toolchain-13-13.0.0/debian/patches/yaml2obj-COFF-Allow-variable-number-of-directories.patch 1970-01-01 01:00:00.000000000 +0100 +++ llvm-toolchain-13-13.0.0/debian/patches/yaml2obj-COFF-Allow-variable-number-of-directories.patch 2022-02-08 10:10:58.000000000 +0100 @@ -0,0 +1,421 @@ +From b33fd3177229c67fe44b65fff8666a7746595daa Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Alfonso=20S=C3=A1nchez-Beato?= + +Date: Thu, 9 Sep 2021 11:14:52 +0100 +Subject: [PATCH] [yaml2obj][COFF] Allow variable number of directories + +Allow variable number of directories, as allowed by the +specification. NumberOfRvaAndSize will default to 16 if not specified, +as in the past. + +Reviewed by: jhenderson + +Differential Revision: https://reviews.llvm.org/D108825 +--- + llvm/lib/ObjectYAML/COFFEmitter.cpp | 22 +- + llvm/lib/ObjectYAML/COFFYAML.cpp | 2 + + .../yaml2obj/COFF/variable-number-rva.yaml | 296 ++++++++++++++++++ + llvm/tools/llvm-readobj/COFFDumper.cpp | 5 +- + llvm/tools/obj2yaml/coff2yaml.cpp | 2 + + 5 files changed, 316 insertions(+), 11 deletions(-) + create mode 100644 llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml + +diff --git a/llvm/lib/ObjectYAML/COFFEmitter.cpp b/llvm/lib/ObjectYAML/COFFEmitter.cpp +index 06ce93affd38..5f38ca13cfc2 100644 +--- a/llvm/lib/ObjectYAML/COFFEmitter.cpp ++++ b/llvm/lib/ObjectYAML/COFFEmitter.cpp +@@ -170,8 +170,8 @@ static bool layoutOptionalHeader(COFFParser &CP) { + unsigned PEHeaderSize = CP.is64Bit() ? sizeof(object::pe32plus_header) + : sizeof(object::pe32_header); + CP.Obj.Header.SizeOfOptionalHeader = +- PEHeaderSize + +- sizeof(object::data_directory) * (COFF::NUM_DATA_DIRECTORIES + 1); ++ PEHeaderSize + sizeof(object::data_directory) * ++ CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; + return true; + } + +@@ -397,7 +397,7 @@ static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic, + Header->SizeOfStackCommit = CP.Obj.OptionalHeader->Header.SizeOfStackCommit; + Header->SizeOfHeapReserve = CP.Obj.OptionalHeader->Header.SizeOfHeapReserve; + Header->SizeOfHeapCommit = CP.Obj.OptionalHeader->Header.SizeOfHeapCommit; +- Header->NumberOfRvaAndSize = COFF::NUM_DATA_DIRECTORIES + 1; ++ Header->NumberOfRvaAndSize = CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; + return BaseOfData; + } + +@@ -458,18 +458,20 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) { + PEH.BaseOfData = BaseOfData; + OS.write(reinterpret_cast(&PEH), sizeof(PEH)); + } +- for (const Optional &DD : +- CP.Obj.OptionalHeader->DataDirectories) { +- if (!DD.hasValue()) { ++ for (uint32_t I = 0; I < CP.Obj.OptionalHeader->Header.NumberOfRvaAndSize; ++ ++I) { ++ const Optional *DataDirectories = ++ CP.Obj.OptionalHeader->DataDirectories; ++ uint32_t NumDataDir = sizeof(CP.Obj.OptionalHeader->DataDirectories) / ++ sizeof(Optional); ++ if (I >= NumDataDir || !DataDirectories[I].hasValue()) { + OS << zeros(uint32_t(0)); + OS << zeros(uint32_t(0)); + } else { +- OS << binary_le(DD->RelativeVirtualAddress); +- OS << binary_le(DD->Size); ++ OS << binary_le(DataDirectories[I]->RelativeVirtualAddress); ++ OS << binary_le(DataDirectories[I]->Size); + } + } +- OS << zeros(uint32_t(0)); +- OS << zeros(uint32_t(0)); + } + + assert(OS.tell() == CP.SectionTableStart); +diff --git a/llvm/lib/ObjectYAML/COFFYAML.cpp b/llvm/lib/ObjectYAML/COFFYAML.cpp +index 96069c0c590f..5a85e22e4f49 100644 +--- a/llvm/lib/ObjectYAML/COFFYAML.cpp ++++ b/llvm/lib/ObjectYAML/COFFYAML.cpp +@@ -467,6 +467,8 @@ void MappingTraits::mapping(IO &IO, + IO.mapRequired("SizeOfHeapReserve", PH.Header.SizeOfHeapReserve); + IO.mapRequired("SizeOfHeapCommit", PH.Header.SizeOfHeapCommit); + ++ IO.mapOptional("NumberOfRvaAndSize", PH.Header.NumberOfRvaAndSize, ++ COFF::NUM_DATA_DIRECTORIES + 1); + IO.mapOptional("ExportTable", PH.DataDirectories[COFF::EXPORT_TABLE]); + IO.mapOptional("ImportTable", PH.DataDirectories[COFF::IMPORT_TABLE]); + IO.mapOptional("ResourceTable", PH.DataDirectories[COFF::RESOURCE_TABLE]); +diff --git a/llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml b/llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml +new file mode 100644 +index 000000000000..01f8f33db227 +--- /dev/null ++++ b/llvm/test/tools/yaml2obj/COFF/variable-number-rva.yaml +@@ -0,0 +1,296 @@ ++## Check that the default NumberOfRvaAndSize is as expected. ++# RUN: yaml2obj --docnum=1 %s -o %t ++# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK16 ++# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP16 ++ ++# CHECK16: NumberOfRvaAndSize: 16 ++# CHECK16-NEXT: DataDirectory { ++# CHECK16-NEXT: ExportTableRVA: 0x0 ++# CHECK16-NEXT: ExportTableSize: 0x0 ++# CHECK16-NEXT: ImportTableRVA: 0x0 ++# CHECK16-NEXT: ImportTableSize: 0x0 ++# CHECK16-NEXT: ResourceTableRVA: 0x0 ++# CHECK16-NEXT: ResourceTableSize: 0x0 ++# CHECK16-NEXT: ExceptionTableRVA: 0x0 ++# CHECK16-NEXT: ExceptionTableSize: 0x0 ++# CHECK16-NEXT: CertificateTableRVA: 0x0 ++# CHECK16-NEXT: CertificateTableSize: 0x0 ++# CHECK16-NEXT: BaseRelocationTableRVA: 0x0 ++# CHECK16-NEXT: BaseRelocationTableSize: 0x0 ++# CHECK16-NEXT: DebugRVA: 0x0 ++# CHECK16-NEXT: DebugSize: 0x0 ++# CHECK16-NEXT: ArchitectureRVA: 0x0 ++# CHECK16-NEXT: ArchitectureSize: 0x0 ++# CHECK16-NEXT: GlobalPtrRVA: 0x0 ++# CHECK16-NEXT: GlobalPtrSize: 0x0 ++# CHECK16-NEXT: TLSTableRVA: 0x0 ++# CHECK16-NEXT: TLSTableSize: 0x0 ++# CHECK16-NEXT: LoadConfigTableRVA: 0x0 ++# CHECK16-NEXT: LoadConfigTableSize: 0x0 ++# CHECK16-NEXT: BoundImportRVA: 0x0 ++# CHECK16-NEXT: BoundImportSize: 0x0 ++# CHECK16-NEXT: IATRVA: 0x0 ++# CHECK16-NEXT: IATSize: 0x0 ++# CHECK16-NEXT: DelayImportDescriptorRVA: 0x0 ++# CHECK16-NEXT: DelayImportDescriptorSize: 0x0 ++# CHECK16-NEXT: CLRRuntimeHeaderRVA: 0x0 ++# CHECK16-NEXT: CLRRuntimeHeaderSize: 0x0 ++# CHECK16-NEXT: ReservedRVA: 0x0 ++# CHECK16-NEXT: ReservedSize: 0x0 ++# CHECK16-NEXT: } ++ ++# ROUNDTRIP16: ExportTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: ImportTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: ResourceTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: ExceptionTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: CertificateTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: BaseRelocationTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: Debug: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: Architecture: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: GlobalPtr: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: TlsTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: LoadConfigTable: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: BoundImport: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: IAT: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: DelayImportDescriptor: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: ClrRuntimeHeader: ++# ROUNDTRIP16-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP16-NEXT: Size: 0 ++# ROUNDTRIP16-NEXT: header: ++ ++--- !COFF ++OptionalHeader: ++ AddressOfEntryPoint: 4096 ++ ImageBase: 0 ++ SectionAlignment: 4096 ++ FileAlignment: 512 ++ MajorOperatingSystemVersion: 0 ++ MinorOperatingSystemVersion: 0 ++ MajorImageVersion: 0 ++ MinorImageVersion: 0 ++ MajorSubsystemVersion: 0 ++ MinorSubsystemVersion: 0 ++ Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION ++ DLLCharacteristics: [ ] ++ SizeOfStackReserve: 0 ++ SizeOfStackCommit: 0 ++ SizeOfHeapReserve: 0 ++ SizeOfHeapCommit: 0 ++header: ++ Machine: IMAGE_FILE_MACHINE_AMD64 ++ Characteristics: [ ] ++sections: ++ - Name: foo ++ Characteristics: [ ] ++ Alignment: 4 ++symbols: ++... ++ ++## Check setting NumberOfRvaAndSize equal to the default (output should ++## be the same as when unset). ++# RUN: yaml2obj --docnum=2 %s -o %t -DNUMRVA=16 ++# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK16 ++# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP16 ++ ++## Check that NumberOfRvaAndSize can be zero. ++# RUN: yaml2obj --docnum=2 %s -o %t -DNUMRVA=0 ++# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK0 ++# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP0 ++ ++# CHECK0: NumberOfRvaAndSize: 0 ++# CHECK0-NOT: DataDirectory ++ ++# ROUNDTRIP0: NumberOfRvaAndSize: 0 ++# ROUNDTRIP0-NOT: ExportTable ++ ++## Check setting NumberOfRvaAndSize to number below default. ++# RUN: yaml2obj --docnum=2 %s -o %t -DNUMRVA=6 ++# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK6 ++# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP6 ++ ++# CHECK6: NumberOfRvaAndSize: 6 ++# CHECK6-NEXT: DataDirectory { ++# CHECK6-NEXT: ExportTableRVA: 0x0 ++# CHECK6-NEXT: ExportTableSize: 0x0 ++# CHECK6-NEXT: ImportTableRVA: 0x0 ++# CHECK6-NEXT: ImportTableSize: 0x0 ++# CHECK6-NEXT: ResourceTableRVA: 0x0 ++# CHECK6-NEXT: ResourceTableSize: 0x0 ++# CHECK6-NEXT: ExceptionTableRVA: 0x0 ++# CHECK6-NEXT: ExceptionTableSize: 0x0 ++# CHECK6-NEXT: CertificateTableRVA: 0x0 ++# CHECK6-NEXT: CertificateTableSize: 0x0 ++# CHECK6-NEXT: BaseRelocationTableRVA: 0x0 ++# CHECK6-NEXT: BaseRelocationTableSize: 0x0 ++# CHECK6-NEXT: } ++ ++# ROUNDTRIP6: NumberOfRvaAndSize: 6 ++# ROUNDTRIP6-NEXT: ExportTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: ImportTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: ResourceTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: ExceptionTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: CertificateTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: BaseRelocationTable: ++# ROUNDTRIP6-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP6-NEXT: Size: 0 ++# ROUNDTRIP6-NEXT: header: ++ ++## Check setting NumberOfRvaAndSize to number above default. ++# RUN: yaml2obj --docnum=2 %s -o %t -DNUMRVA=18 ++# RUN: llvm-readobj --file-headers %t | FileCheck %s --check-prefix=CHECK18 ++# RUN: obj2yaml %t | FileCheck %s --check-prefix=ROUNDTRIP18 ++ ++# CHECK18: NumberOfRvaAndSize: 18 ++# CHECK18-NEXT: DataDirectory { ++# CHECK18-NEXT: ExportTableRVA: 0x0 ++# CHECK18-NEXT: ExportTableSize: 0x0 ++# CHECK18-NEXT: ImportTableRVA: 0x0 ++# CHECK18-NEXT: ImportTableSize: 0x0 ++# CHECK18-NEXT: ResourceTableRVA: 0x0 ++# CHECK18-NEXT: ResourceTableSize: 0x0 ++# CHECK18-NEXT: ExceptionTableRVA: 0x0 ++# CHECK18-NEXT: ExceptionTableSize: 0x0 ++# CHECK18-NEXT: CertificateTableRVA: 0x0 ++# CHECK18-NEXT: CertificateTableSize: 0x0 ++# CHECK18-NEXT: BaseRelocationTableRVA: 0x0 ++# CHECK18-NEXT: BaseRelocationTableSize: 0x0 ++# CHECK18-NEXT: DebugRVA: 0x0 ++# CHECK18-NEXT: DebugSize: 0x0 ++# CHECK18-NEXT: ArchitectureRVA: 0x0 ++# CHECK18-NEXT: ArchitectureSize: 0x0 ++# CHECK18-NEXT: GlobalPtrRVA: 0x0 ++# CHECK18-NEXT: GlobalPtrSize: 0x0 ++# CHECK18-NEXT: TLSTableRVA: 0x0 ++# CHECK18-NEXT: TLSTableSize: 0x0 ++# CHECK18-NEXT: LoadConfigTableRVA: 0x0 ++# CHECK18-NEXT: LoadConfigTableSize: 0x0 ++# CHECK18-NEXT: BoundImportRVA: 0x0 ++# CHECK18-NEXT: BoundImportSize: 0x0 ++# CHECK18-NEXT: IATRVA: 0x0 ++# CHECK18-NEXT: IATSize: 0x0 ++# CHECK18-NEXT: DelayImportDescriptorRVA: 0x0 ++# CHECK18-NEXT: DelayImportDescriptorSize: 0x0 ++# CHECK18-NEXT: CLRRuntimeHeaderRVA: 0x0 ++# CHECK18-NEXT: CLRRuntimeHeaderSize: 0x0 ++# CHECK18-NEXT: ReservedRVA: 0x0 ++# CHECK18-NEXT: ReservedSize: 0x0 ++# CHECK18-NEXT: UnknownRVA: 0x0 ++# CHECK18-NEXT: UnknownSize: 0x0 ++# CHECK18-NEXT: UnknownRVA: 0x0 ++# CHECK18-NEXT: UnknownSize: 0x0 ++# CHECK18-NEXT: } ++ ++# ROUNDTRIP18: NumberOfRvaAndSize: 18 ++# ROUNDTRIP18-NEXT: ExportTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: ImportTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: ResourceTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: ExceptionTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: CertificateTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: BaseRelocationTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: Debug: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: Architecture: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: GlobalPtr: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: TlsTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: LoadConfigTable: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: BoundImport: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: IAT: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: DelayImportDescriptor: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: ClrRuntimeHeader: ++# ROUNDTRIP18-NEXT: RelativeVirtualAddress: 0 ++# ROUNDTRIP18-NEXT: Size: 0 ++# ROUNDTRIP18-NEXT: header: ++ ++--- !COFF ++OptionalHeader: ++ AddressOfEntryPoint: 4096 ++ ImageBase: 0 ++ SectionAlignment: 4096 ++ FileAlignment: 512 ++ MajorOperatingSystemVersion: 0 ++ MinorOperatingSystemVersion: 0 ++ MajorImageVersion: 0 ++ MinorImageVersion: 0 ++ MajorSubsystemVersion: 0 ++ MinorSubsystemVersion: 0 ++ Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION ++ DLLCharacteristics: [ ] ++ SizeOfStackReserve: 0 ++ SizeOfStackCommit: 0 ++ SizeOfHeapReserve: 0 ++ SizeOfHeapCommit: 0 ++ NumberOfRvaAndSize: [[NUMRVA]] ++header: ++ Machine: IMAGE_FILE_MACHINE_AMD64 ++ Characteristics: [ ] ++sections: ++ - Name: foo ++ Characteristics: [ ] ++ Alignment: 4 ++symbols: ++... +diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp +index 96124cc03484..91607c69369a 100644 +--- a/llvm/tools/llvm-readobj/COFFDumper.cpp ++++ b/llvm/tools/llvm-readobj/COFFDumper.cpp +@@ -709,7 +709,10 @@ void COFFDumper::printPEHeader(const PEHeader *Hdr) { + }; + + for (uint32_t i = 0; i < Hdr->NumberOfRvaAndSize; ++i) +- printDataDirectory(i, directory[i]); ++ if (i < sizeof(directory) / sizeof(char *)) ++ printDataDirectory(i, directory[i]); ++ else ++ printDataDirectory(i, "Unknown"); + } + } + +diff --git a/llvm/tools/obj2yaml/coff2yaml.cpp b/llvm/tools/obj2yaml/coff2yaml.cpp +index 03587358340f..bc8aacce1ae8 100644 +--- a/llvm/tools/obj2yaml/coff2yaml.cpp ++++ b/llvm/tools/obj2yaml/coff2yaml.cpp +@@ -80,6 +80,8 @@ template void COFFDumper::dumpOptionalHeader(T OptionalHeader) { + OptionalHeader->SizeOfHeapReserve; + YAMLObj.OptionalHeader->Header.SizeOfHeapCommit = + OptionalHeader->SizeOfHeapCommit; ++ YAMLObj.OptionalHeader->Header.NumberOfRvaAndSize = ++ OptionalHeader->NumberOfRvaAndSize; + unsigned I = 0; + for (auto &DestDD : YAMLObj.OptionalHeader->DataDirectories) { + const object::data_directory *DD = Obj.getDataDirectory(I++); +-- +2.25.1 +