diff options
| author | Khem Raj <raj.khem@gmail.com> | 2022-03-25 14:33:38 -0700 |
|---|---|---|
| committer | Khem Raj <raj.khem@gmail.com> | 2022-03-26 09:20:02 -0700 |
| commit | 42dd5484867b772767a33340ee219fb9f42799e4 (patch) | |
| tree | cd2935d09bd25a3031ea451adc0c4ea6f574089d /recipes-devtools | |
| parent | e4ca6d8199f6a3a9743a3ba41f26c60d1694c5fe (diff) | |
| download | meta-clang-42dd5484867b772767a33340ee219fb9f42799e4.tar.gz | |
clang: Add a patch to fix llvm-objdump
Signed-off-by: Khem Raj <raj.khem@gmail.com>
Diffstat (limited to 'recipes-devtools')
| -rw-r--r-- | recipes-devtools/clang/clang/D122505.diff | 135 | ||||
| -rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
2 files changed, 136 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/D122505.diff b/recipes-devtools/clang/clang/D122505.diff new file mode 100644 index 0000000..fa154d7 --- /dev/null +++ b/recipes-devtools/clang/clang/D122505.diff | |||
| @@ -0,0 +1,135 @@ | |||
| 1 | Upstream-Status: https://reviews.llvm.org/D122505 | ||
| 2 | |||
| 3 | diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp | ||
| 4 | --- a/llvm/lib/Object/ELF.cpp | ||
| 5 | +++ b/llvm/lib/Object/ELF.cpp | ||
| 6 | @@ -568,11 +568,9 @@ | ||
| 7 | } | ||
| 8 | |||
| 9 | if (Dyn.empty()) | ||
| 10 | - // TODO: this error is untested. | ||
| 11 | return createError("invalid empty dynamic section"); | ||
| 12 | |||
| 13 | if (Dyn.back().d_tag != ELF::DT_NULL) | ||
| 14 | - // TODO: this error is untested. | ||
| 15 | return createError("dynamic sections must be DT_NULL terminated"); | ||
| 16 | |||
| 17 | return Dyn; | ||
| 18 | diff --git a/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test b/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test | ||
| 19 | new file mode 100644 | ||
| 20 | --- /dev/null | ||
| 21 | +++ b/llvm/test/tools/llvm-objdump/ELF/dynamic-malformed.test | ||
| 22 | @@ -0,0 +1,39 @@ | ||
| 23 | +## An empty dynamic section is invalid. Test we report a warning instead of an | ||
| 24 | +## error. objcopy --only-keep-debug may produce an empty dynamic section, it is | ||
| 25 | +## excessive to use an error. | ||
| 26 | +# RUN: yaml2obj %s --docnum=1 -o %t.empty | ||
| 27 | +# RUN: llvm-objdump -p %t.empty 2>&1 | FileCheck %s -DFILE=%t.empty --check-prefix=EMPTY | ||
| 28 | + | ||
| 29 | +# EMPTY: Program Header: | ||
| 30 | +# EMPTY-NEXT: warning: '[[FILE]]': invalid empty dynamic section | ||
| 31 | +# EMPTY-EMPTY: | ||
| 32 | + | ||
| 33 | +--- !ELF | ||
| 34 | +FileHeader: | ||
| 35 | + Class: ELFCLASS64 | ||
| 36 | + Data: ELFDATA2LSB | ||
| 37 | + Type: ET_EXEC | ||
| 38 | + Machine: EM_X86_64 | ||
| 39 | +Sections: | ||
| 40 | + - Name: .dynamic | ||
| 41 | + Type: SHT_DYNAMIC | ||
| 42 | + | ||
| 43 | +# RUN: yaml2obj %s --docnum=2 -o %t.nonull | ||
| 44 | +# RUN: llvm-objdump -p %t.nonull 2>&1 | FileCheck %s -DFILE=%t.nonull --check-prefix=NONULL | ||
| 45 | + | ||
| 46 | +# NONULL: Program Header: | ||
| 47 | +# NONULL-NEXT: warning: '[[FILE]]': dynamic sections must be DT_NULL terminated | ||
| 48 | +# NONULL-EMPTY: | ||
| 49 | + | ||
| 50 | +--- !ELF | ||
| 51 | +FileHeader: | ||
| 52 | + Class: ELFCLASS64 | ||
| 53 | + Data: ELFDATA2LSB | ||
| 54 | + Type: ET_EXEC | ||
| 55 | + Machine: EM_X86_64 | ||
| 56 | +Sections: | ||
| 57 | + - Name: .dynamic | ||
| 58 | + Type: SHT_DYNAMIC | ||
| 59 | + Entries: | ||
| 60 | + - Tag: DT_SONAME | ||
| 61 | + Value: 1 | ||
| 62 | diff --git a/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
| 63 | --- a/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
| 64 | +++ b/llvm/test/tools/llvm-objdump/ELF/invalid-phdr.test | ||
| 65 | @@ -1,11 +1,11 @@ | ||
| 66 | ## Test how we handle the case when the e_phoff field is invalid. | ||
| 67 | # RUN: yaml2obj %s -o %t | ||
| 68 | -# RUN: not llvm-objdump --private-headers %t 2>&1 | \ | ||
| 69 | +# RUN: llvm-objdump --private-headers %t 2>&1 | \ | ||
| 70 | # RUN: FileCheck -DFILE=%t %s --check-prefix=INVALID-PHOFF | ||
| 71 | |||
| 72 | # INVALID-PHOFF: Program Header: | ||
| 73 | # INVALID-PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
| 74 | -# INVALID-PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
| 75 | +# INVALID-PHOFF-NEXT: warning: '[[FILE]]': program headers are longer than binary of size 280: e_phoff = 0xffffff, e_phnum = 0, e_phentsize = 0 | ||
| 76 | |||
| 77 | --- !ELF | ||
| 78 | FileHeader: | ||
| 79 | diff --git a/llvm/test/tools/llvm-objdump/ELF/program-headers.test b/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
| 80 | --- a/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
| 81 | +++ b/llvm/test/tools/llvm-objdump/ELF/program-headers.test | ||
| 82 | @@ -278,12 +278,12 @@ | ||
| 83 | ## Check we report an error / warning when we are unable to read program headers. | ||
| 84 | ## Case A: the e_phentsize field is invalid. | ||
| 85 | # RUN: yaml2obj --docnum=2 -DPHENTSIZE=1 %s -o %t.phdr.err | ||
| 86 | -# RUN: not llvm-objdump --private-headers %t.phdr.err 2>&1 | \ | ||
| 87 | +# RUN: llvm-objdump --private-headers %t.phdr.err 2>&1 | \ | ||
| 88 | # RUN: FileCheck %s -DFILE=%t.phdr.err --check-prefix=PHENTSIZE | ||
| 89 | |||
| 90 | # PHENTSIZE: Program Header: | ||
| 91 | # PHENTSIZE-NEXT: warning: '[[FILE]]': unable to read program headers: invalid e_phentsize: 1 | ||
| 92 | -# PHENTSIZE-NEXT: error: '[[FILE]]': invalid e_phentsize: 1 | ||
| 93 | +# PHENTSIZE-NEXT: warning: '[[FILE]]': invalid e_phentsize: 1 | ||
| 94 | |||
| 95 | --- !ELF | ||
| 96 | FileHeader: | ||
| 97 | @@ -309,16 +309,16 @@ | ||
| 98 | |||
| 99 | ## Check we report a warning / error when e_phoff goes 1 byte past the end of the file. | ||
| 100 | # RUN: yaml2obj --docnum=2 -DPHOFF=0x161 %s -o %t.phdr.err2 | ||
| 101 | -# RUN: not llvm-objdump --private-headers %t.phdr.err2 2>&1 | \ | ||
| 102 | +# RUN: llvm-objdump --private-headers %t.phdr.err2 2>&1 | \ | ||
| 103 | # RUN: FileCheck %s -DFILE=%t.phdr.err2 --check-prefix=PHOFF -DOFF=0x161 | ||
| 104 | |||
| 105 | # PHOFF: Program Header: | ||
| 106 | # PHOFF-NEXT: warning: '[[FILE]]': unable to read program headers: program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
| 107 | -# PHOFF-NEXT: error: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
| 108 | +# PHOFF-NEXT: warning: '[[FILE]]': program headers are longer than binary of size 408: e_phoff = [[OFF]], e_phnum = 1, e_phentsize = 56 | ||
| 109 | |||
| 110 | |||
| 111 | ## Check we report a warning / error when the value of e_phoff is so large that | ||
| 112 | ## e_phoff + e_phnum * e_phentsize > UINT64_MAX. | ||
| 113 | # RUN: yaml2obj --docnum=2 -DPHOFF=0xffffffffffffffff %s -o %t.phdr.err3 | ||
| 114 | -# RUN: not llvm-objdump --private-headers %t.phdr.err3 2>&1 | \ | ||
| 115 | +# RUN: llvm-objdump --private-headers %t.phdr.err3 2>&1 | \ | ||
| 116 | # RUN: FileCheck %s -DFILE=%t.phdr.err3 --check-prefix=PHOFF -DOFF=0xffffffffffffffff | ||
| 117 | diff --git a/llvm/tools/llvm-objdump/ELFDump.cpp b/llvm/tools/llvm-objdump/ELFDump.cpp | ||
| 118 | --- a/llvm/tools/llvm-objdump/ELFDump.cpp | ||
| 119 | +++ b/llvm/tools/llvm-objdump/ELFDump.cpp | ||
| 120 | @@ -171,8 +171,12 @@ | ||
| 121 | |||
| 122 | template <class ELFT> | ||
| 123 | static void printDynamicSection(const ELFFile<ELFT> &Elf, StringRef Filename) { | ||
| 124 | - ArrayRef<typename ELFT::Dyn> DynamicEntries = | ||
| 125 | - unwrapOrError(Elf.dynamicEntries(), Filename); | ||
| 126 | + auto DynamicEntriesOrErr = Elf.dynamicEntries(); | ||
| 127 | + if (!DynamicEntriesOrErr) { | ||
| 128 | + reportWarning(toString(DynamicEntriesOrErr.takeError()), Filename); | ||
| 129 | + return; | ||
| 130 | + } | ||
| 131 | + ArrayRef<typename ELFT::Dyn> DynamicEntries = *DynamicEntriesOrErr; | ||
| 132 | |||
| 133 | // Find the maximum tag name length to format the value column properly. | ||
| 134 | size_t MaxLen = 0; | ||
| 135 | |||
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc index b61d239..ba47dd1 100644 --- a/recipes-devtools/clang/common.inc +++ b/recipes-devtools/clang/common.inc | |||
| @@ -45,6 +45,7 @@ SRC_URI = "\ | |||
| 45 | file://0033-lldb-Link-with-libatomic-on-x86.patch \ | 45 | file://0033-lldb-Link-with-libatomic-on-x86.patch \ |
| 46 | file://0034-clang-exclude-openembedded-distributions-from-settin.patch \ | 46 | file://0034-clang-exclude-openembedded-distributions-from-settin.patch \ |
| 47 | file://0035-compiler-rt-Enable-__int128-for-ppc32.patch \ | 47 | file://0035-compiler-rt-Enable-__int128-for-ppc32.patch \ |
| 48 | file://D122505.diff \ | ||
| 48 | " | 49 | " |
| 49 | # Fallback to no-PIE if not set | 50 | # Fallback to no-PIE if not set |
| 50 | GCCPIE ??= "" | 51 | GCCPIE ??= "" |
