[lld] r264231 - Use unaligned read to fix UB. NFC.

Pete Cooper via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 23 18:03:44 PDT 2016


Author: pete
Date: Wed Mar 23 20:03:44 2016
New Revision: 264231

URL: http://llvm.org/viewvc/llvm-project?rev=264231&view=rev
Log:
Use unaligned read to fix UB.  NFC.

We were casting a potentially unaligned pointer to uint32_t and
dereferencing.  As the pointer ultimately comes from the object file,
there's no way to guarantee alignment, so use the little32_t read instead.

Also, little32_t knows about endianness, so in theory this may have broken on
big endian machines.

Modified:
    lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp?rev=264231&r1=264230&r2=264231&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/ArchHandler_arm64.cpp Wed Mar 23 20:03:44 2016
@@ -477,7 +477,6 @@ std::error_code ArchHandler_arm64::getPa
     FindAtomBySymbolIndex atomFromSymbolIndex, Reference::KindValue *kind,
     const lld::Atom **target, Reference::Addend *addend) {
   const uint8_t *fixupContent = &inAtom->rawContent()[offsetInAtom];
-  const uint32_t *cont32 = reinterpret_cast<const uint32_t *>(fixupContent);
   switch (relocPattern(reloc1) << 16 | relocPattern(reloc2)) {
   case ((ARM64_RELOC_ADDEND                                | rLength4) << 16 |
          ARM64_RELOC_BRANCH26           | rPcRel | rExtern | rLength4):
@@ -496,13 +495,15 @@ std::error_code ArchHandler_arm64::getPa
     *addend = reloc1.symbol;
     return std::error_code();
   case ((ARM64_RELOC_ADDEND                                | rLength4) << 16 |
-         ARM64_RELOC_PAGEOFF12                   | rExtern | rLength4):
+         ARM64_RELOC_PAGEOFF12                   | rExtern | rLength4): {
     // ex: ldr w0, [x1, _foo at PAGEOFF]
-    *kind = offset12KindFromInstruction(*cont32);
+    uint32_t cont32 = (int32_t)*(const little32_t *)fixupContent;
+    *kind = offset12KindFromInstruction(cont32);
     if (auto ec = atomFromSymbolIndex(reloc2.symbol, target))
       return ec;
     *addend = reloc1.symbol;
     return std::error_code();
+  }
   case ((ARM64_RELOC_SUBTRACTOR                  | rExtern | rLength8) << 16 |
          ARM64_RELOC_UNSIGNED                    | rExtern | rLength8):
     // ex: .quad _foo - .




More information about the llvm-commits mailing list