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

Fixes #141740.

Co-authored-by: Alexey Karyakin <quic-akaryaki@quicinc.com>
Co-authored-by: Sudharsan Veeravalli <quic_svs@quicinc.com>
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 0000000..26481b9
--- /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 85c455b..5ecb333 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -700,14 +700,18 @@
 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,