From 0b740236b71f0f3811421885c04cc43130f88bef Mon Sep 17 00:00:00 2001 From: Tim Northover Date: Tue, 8 Jan 2013 10:12:09 +0000 Subject: [PATCH] Allow ELF64 relocation type to be more than 8 bits. 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 | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 46b62de19e3..735accdf7ec 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -387,14 +387,14 @@ struct Elf_Rel_Impl // 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 ::getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl &Result) const { const Elf_Shdr *sec = getSection(Rel.w.b); - uint8_t type; + uint32_t type; StringRef res; switch (sec->sh_type) { default : -- 2.34.1