[llvm] [Hexagon][llvm-objdump] Fix crash at a truncated instruction (PR #142082)
Alexey Karyakin via llvm-commits
llvm-commits at lists.llvm.org
Thu May 29 20:06:11 PDT 2025
https://github.com/quic-akaryaki created https://github.com/llvm/llvm-project/pull/142082
Fixes #141740.
>From 7c040d1287c9039011101fded5a6e81f81d042d1 Mon Sep 17 00:00:00 2001
From: Alexey Karyakin <quic-akaryaki at quicinc.com>
Date: Thu, 29 May 2025 22:42:42 -0400
Subject: [PATCH] [Hexagon][llvm-objdump] Fix crash at a truncated instruction
Fixes #141740.
Co-authored-by: Sudharsan Veeravalli <quic_svs at quicinc.com>
---
.../ELF/Hexagon/truncated-inst.yaml | 26 +++++++++++++++++++
llvm/tools/llvm-objdump/llvm-objdump.cpp | 12 ++++++---
2 files changed, 34 insertions(+), 4 deletions(-)
create mode 100644 llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml
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