[llvm] c87edaf - [Hexagon][llvm-objdump] Fix crash at a truncated instruction (#142082)
via llvm-commits
llvm-commits at lists.llvm.org
Fri May 30 10:10:14 PDT 2025
Author: Alexey Karyakin
Date: 2025-05-30T12:10:11-05:00
New Revision: c87edaf99b18821e5278eb7b46b92cb67fc8d10c
URL: https://github.com/llvm/llvm-project/commit/c87edaf99b18821e5278eb7b46b92cb67fc8d10c
DIFF: https://github.com/llvm/llvm-project/commit/c87edaf99b18821e5278eb7b46b92cb67fc8d10c.diff
LOG: [Hexagon][llvm-objdump] Fix crash at a truncated instruction (#142082)
Fixes #141740.
Co-authored-by: Alexey Karyakin <quic-akaryaki at quicinc.com>
Co-authored-by: Sudharsan Veeravalli <quic_svs at quicinc.com>
Added:
llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml
Modified:
llvm/tools/llvm-objdump/llvm-objdump.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml b/llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml
new file mode 100644
index 0000000000000..26481b9a13216
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml
@@ -0,0 +1,26 @@
+## Test disassembling of truncated instructions.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objdump --disassemble-all %t 2>&1 | FileCheck %s
+
+# CHECK: 0000000 <.data>:
+# CHECK-NEXT: 0: 55 <unknown>
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS32
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_HEXAGON
+Sections:
+ - Name: .data
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ AddressAlign: 0x1
+ Content: 55
+ - Type: SectionHeaderTable
+ Sections:
+ - Name: .data
+ - Name: .strtab
+ - Name: .shstrtab
+...
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index 85c455b2891a1..5ecb33375943f 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -700,14 +700,18 @@ class HexagonPrettyPrinter : public PrettyPrinter {
public:
void printLead(ArrayRef<uint8_t> Bytes, uint64_t Address,
formatted_raw_ostream &OS) {
- uint32_t opcode =
- (Bytes[3] << 24) | (Bytes[2] << 16) | (Bytes[1] << 8) | Bytes[0];
if (LeadingAddr)
OS << format("%8" PRIx64 ":", Address);
if (ShowRawInsn) {
OS << "\t";
- dumpBytes(Bytes.slice(0, 4), OS);
- OS << format("\t%08" PRIx32, opcode);
+ if (Bytes.size() >= 4) {
+ dumpBytes(Bytes.slice(0, 4), OS);
+ uint32_t opcode =
+ (Bytes[3] << 24) | (Bytes[2] << 16) | (Bytes[1] << 8) | Bytes[0];
+ OS << format("\t%08" PRIx32, opcode);
+ } else {
+ dumpBytes(Bytes, OS);
+ }
}
}
void printInst(MCInstPrinter &IP, const MCInst *MI, ArrayRef<uint8_t> Bytes,
More information about the llvm-commits
mailing list