================ @@ -392,6 +393,73 @@ ELFFile<ELFT>::decode_relrs(Elf_Relr_Range relrs) const { return Relocs; } +template <class ELFT> +Expected<uint64_t> +ELFFile<ELFT>::getCrelHeader(ArrayRef<uint8_t> Content) const { + DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4); + Error Err = Error::success(); + uint64_t Hdr = 0; + Hdr = Data.getULEB128(&Hdr, &Err); + if (Err) + return Err; + return Hdr; +} + +template <class ELFT> +Expected<typename ELFFile<ELFT>::RelsOrRelas> +ELFFile<ELFT>::decodeCrel(ArrayRef<uint8_t> Content) const { + DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4); + 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; + std::vector<Elf_Rel> Rels; + std::vector<Elf_Rela> Relas; + if (Hdr & ELF::CREL_HDR_ADDEND) + Relas.resize(Count); + else + Rels.resize(Count); + typename ELFT::uint Offset = 0, Addend = 0; + uint32_t Symidx = 0, Type = 0; ---------------- jh7370 wrote:
Nit, since it is short for symbol index (i.e. two words). Same below. ```suggestion uint32_t SymIdx = 0, Type = 0; ``` https://github.com/llvm/llvm-project/pull/91280 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits