[llvm] [Hexagon][llvm-objdump] Fix crash at a truncated instruction (PR #142082)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 29 20:06:45 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-hexagon

Author: Alexey Karyakin (quic-akaryaki)

<details>
<summary>Changes</summary>

Fixes #<!-- -->141740.

---
Full diff: https://github.com/llvm/llvm-project/pull/142082.diff


2 Files Affected:

- (added) llvm/test/tools/llvm-objdump/ELF/Hexagon/truncated-inst.yaml (+26) 
- (modified) llvm/tools/llvm-objdump/llvm-objdump.cpp (+8-4) 


``````````diff
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,

``````````

</details>


https://github.com/llvm/llvm-project/pull/142082


More information about the llvm-commits mailing list