Allow ELF64 relocation type to be more than 8 bits.
authorTim Northover <Tim.Northover@arm.com>
Tue, 8 Jan 2013 10:12:09 +0000 (10:12 +0000)
committerTim Northover <Tim.Northover@arm.com>
Tue, 8 Jan 2013 10:12:09 +0000 (10:12 +0000)
Current targets don't have more than 256 relocations so they don't hit this
limit, but ELF64 actually allows more than 8 bits for a relocation type. These
were being truncated on AArch64.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171845 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELF.h

index 46b62de19e310785a629c64bd30489326c1ff4e1..735accdf7ecc2ebced3962c816a6723fd76d5bb9 100644 (file)
@@ -387,14 +387,14 @@ struct Elf_Rel_Impl<target_endianness, max_alignment, true, isRela>
 
   // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE,
   // and ELF64_R_INFO macros defined in the ELF specification:
-  uint64_t getSymbol() const { return (r_info >> 32); }
-  unsigned char getType() const {
-    return (unsigned char) (r_info & 0xffffffffL);
+  uint32_t getSymbol() const { return (uint32_t) (r_info >> 32); }
+  uint32_t getType() const {
+    return (uint32_t) (r_info & 0xffffffffL);
   }
-  void setSymbol(uint64_t s) { setSymbolAndType(s, getType()); }
-  void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); }
-  void setSymbolAndType(uint64_t s, unsigned char t) {
-    r_info = (s << 32) + (t&0xffffffffL);
+  void setSymbol(uint32_t s) { setSymbolAndType(s, getType()); }
+  void setType(uint32_t t) { setSymbolAndType(getSymbol(), t); }
+  void setSymbolAndType(uint32_t s, uint32_t t) {
+    r_info = ((uint64_t)s << 32) + (t&0xffffffffL);
   }
 };
 
@@ -1553,7 +1553,7 @@ error_code ELFObjectFile<target_endianness, max_alignment, is64Bits>
                         ::getRelocationTypeName(DataRefImpl Rel,
                                           SmallVectorImpl<char> &Result) const {
   const Elf_Shdr *sec = getSection(Rel.w.b);
-  uint8_t type;
+  uint32_t type;
   StringRef res;
   switch (sec->sh_type) {
     default :