[llvm-branch-commits] [llvm-objdump] -r: support CREL (PR #97382)
James Henderson via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Jul 2 00:44:28 PDT 2024
================
@@ -1022,6 +1033,47 @@ ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const {
uintptr_t SHT = reinterpret_cast<uintptr_t>((*SectionsOrErr).begin());
RelData.d.a = (Sec.p - SHT) / EF.getHeader().e_shentsize;
RelData.d.b = 0;
+ if (reinterpret_cast<const Elf_Shdr *>(Sec.p)->sh_type == ELF::SHT_CREL) {
+ if (RelData.d.a + 1 > Crels.size()) {
+ Crels.resize(RelData.d.a + 1);
+ CrelErrs.resize(RelData.d.a + 1);
+ }
+ if (Crels[RelData.d.a].empty()) {
+ // Decode SHT_CREL. See ELFFile<ELFT>::decodeCrel.
+ ArrayRef<uint8_t> Content = cantFail(getSectionContents(Sec));
+ DataExtractor Data(Content, ELFT::Endianness == endianness::little,
+ sizeof(typename ELFT::Addr));
+ DataExtractor::Cursor Cur(0);
+ const uint64_t Hdr = Data.getULEB128(Cur);
+ const size_t Count = Hdr / 8;
+ const size_t FlagBits = Hdr & ELF::CREL_HDR_ADDEND ? 3 : 2;
+ const size_t Shift = Hdr % ELF::CREL_HDR_ADDEND;
+ uintX_t Offset = 0, Addend = 0;
+ uint32_t Symidx = 0, Type = 0;
+ for (size_t i = 0; i != Count; ++i) {
----------------
jh7370 wrote:
It really doesn't feel right that this whole algorithm is duplicated from the version in ELF.cpp. Surely they can be folded together into shared code somewhere?
https://github.com/llvm/llvm-project/pull/97382
More information about the llvm-branch-commits
mailing list