LLVM: lib/Object/ELF.cpp Source File (original) (raw)
627
629 if (!ProgramHeadersOrError)
630 return ProgramHeadersOrError.takeError();
631
632 for (const Elf_Phdr &Phdr : *ProgramHeadersOrError) {
634 const uint8_t *DynOffset = base() + Phdr.p_offset;
635 if (DynOffset > end())
637 "dynamic section offset past file size: corrupted ELF");
638 Dyn = ArrayRef(reinterpret_cast<const Elf_Dyn *>(DynOffset),
639 Phdr.p_filesz / sizeof(Elf_Dyn));
640 break;
641 }
642 }
643
644
645
646 if (Dyn.empty()) {
647 auto SectionsOrError = sections();
648 if (!SectionsOrError)
649 return SectionsOrError.takeError();
650
651 for (const Elf_Shdr &Sec : *SectionsOrError) {
655 if (!DynOrError)
657 Dyn = *DynOrError;
658 break;
659 }
660 }
661
662 if (!Dyn.data())
664 }
665
667 return createError("invalid empty dynamic section");
668
669 if (Dyn.back().d_tag != ELF::DT_NULL)
670 return createError("dynamic sections must be DT_NULL terminated");
671
672 return Dyn;
673}
679 if (!ProgramHeadersOrError)
680 return ProgramHeadersOrError.takeError();
681
683
684 for (const Elf_Phdr &Phdr : *ProgramHeadersOrError)
686 LoadSegments.push_back(const_cast<Elf_Phdr *>(&Phdr));
687
690 return A->p_vaddr < B->p_vaddr;
691 };
694 WarnHandler("loadable segments are unsorted by virtual address"))
695 return std::move(E);
697 }
698
701 return VAddr < Phdr->p_vaddr;
702 });
703
704 if (I == LoadSegments.begin())
705 return createError("virtual address is not in any segment: 0x" +
707 --I;
708 const Elf_Phdr &Phdr = **I;
709 uint64_t Delta = VAddr - Phdr.p_vaddr;
710 if (Delta >= Phdr.p_filesz)
711 return createError("virtual address is not in any segment: 0x" +
713
716 return createError("can't map virtual address 0x" +
718 Twine(&Phdr - (*ProgramHeadersOrError).data() + 1) +
719 ": the segment ends at 0x" +
721 ", which is greater than the file size (0x" +
723
725}
732template <typename IntTy, std::enable_if_t<std::is_unsigned_v, int> = 0>
734 Error &ULEBSizeErr) {
735
736 if (ULEBSizeErr)
737 return 0;
740 if (Value > std::numeric_limits::max()) {
741 ULEBSizeErr = createError("ULEB128 value at offset 0x" +
743 Twine(std::numeric_limits::digits) +
745 return 0;
746 }
747 return static_cast<IntTy>(Value);
748}
755 std::vector *PGOAnalyses) {
757
758
759
760
762 if (IsRelocatable && RelaSec) {
764 "Can't read a SHT_LLVM_BB_ADDR_MAP section in a relocatable "
765 "object file without providing a relocation section.");
768 if (!Relas)
769 return createError("unable to read CREL relocations for section " +
773 FunctionOffsetTranslations[Rela.r_offset] = Rela.r_addend;
774 }
775 } else {
777 EF.relas(*RelaSec);
778 if (!Relas)
779 return createError("unable to read relocations for section " +
783 FunctionOffsetTranslations[Rela.r_offset] = Rela.r_addend;
784 }
785 }
786 auto GetAddressForRelocation =
788 auto FOTIterator =
789 FunctionOffsetTranslations.find(RelocationOffsetInSection);
790 if (FOTIterator == FunctionOffsetTranslations.end()) {
791 return createError("failed to get relocation data for offset: " +
793 " in section " + describe(EF, Sec));
794 }
795 return FOTIterator->second;
796 };
798 if (!ContentsOrErr)
799 return ContentsOrErr.takeError();
801
802
803 std::unique_ptr<uint8_t[]> DecompressedContent;
806 if (!SectionNameOrErr)
807 return SectionNameOrErr.takeError();
808 auto DecompressorOrErr =
810 EF.isLE(), ELFT::Is64Bits);
811 if (!DecompressorOrErr)
812 return DecompressorOrErr.takeError();
813 size_t DecompressedSize = DecompressorOrErr->getDecompressedSize();
814 DecompressedContent = std::make_unique<uint8_t[]>(DecompressedSize);
816 DecompressedSize);
817 if (Error Err = DecompressorOrErr->decompress(DecompressedContentRef))
818 return std::move(Err);
819 Content = DecompressedContentRef;
820 }
821
823 std::vector FunctionEntries;
824
828
829
831 uint64_t RelocationOffsetInSection = Cur.tell();
832 auto Address =
834 if (!Cur)
836 if (!IsRelocatable)
837 return Address;
838 assert(Address == 0);
840 GetAddressForRelocation(RelocationOffsetInSection);
841 if (!AddressOrErr)
843 return *AddressOrErr;
844 };
845
849 while (!ULEBSizeErr && !MetadataDecodeErr && Cur &&
850 Cur.tell() < Content.size()) {
851 Version = Data.getU8(Cur);
852 if (!Cur)
853 break;
855 return createError("unsupported SHT_LLVM_BB_ADDR_MAP version: " +
856 Twine(static_cast<int>(Version)));
857 Feature = Version < 5 ? Data.getU8(Cur) : Data.getU16(Cur);
858 if (!Cur)
859 break;
861 if (!FeatEnableOrErr)
862 return FeatEnableOrErr.takeError();
863 FeatEnable = *FeatEnableOrErr;
865 return createError("version should be >= 3 for SHT_LLVM_BB_ADDR_MAP when "
866 "callsite offsets feature is enabled: version = " +
867 Twine(static_cast<int>(Version)) +
868 " feature = " + Twine(static_cast<int>(Feature)));
869 if (FeatEnable.BBHash && Version < 4)
870 return createError("version should be >= 4 for SHT_LLVM_BB_ADDR_MAP when "
871 "basic block hash feature is enabled: version = " +
872 Twine(static_cast<int>(Version)) +
873 " feature = " + Twine(static_cast<int>(Feature)));
874 if (FeatEnable.PostLinkCfg && Version < 5)
875 return createError("version should be >= 5 for SHT_LLVM_BB_ADDR_MAP when "
876 "post link cfg feature is enabled: version = " +
877 Twine(static_cast<int>(Version)) +
878 " feature = " + Twine(static_cast<int>(Feature)));
879 uint32_t NumBlocksInBBRange = 0;
884 if (!Cur || ULEBSizeErr)
885 break;
886 if (!NumBBRanges)
887 return createError("invalid zero number of BB ranges at offset " +
890 } else {
891 auto AddressOrErr = ExtractAddress();
892 if (!AddressOrErr)
893 return AddressOrErr.takeError();
894 RangeBaseAddress = *AddressOrErr;
896 }
897 std::vectorBBAddrMap::BBRangeEntry BBRangeEntries;
899 for (uint32_t BBRangeIndex = 0; BBRangeIndex < NumBBRanges;
900 ++BBRangeIndex) {
901 uint32_t PrevBBEndOffset = 0;
903 auto AddressOrErr = ExtractAddress();
904 if (!AddressOrErr)
905 return AddressOrErr.takeError();
906 RangeBaseAddress = *AddressOrErr;
908 }
909 std::vectorBBAddrMap::BBEntry BBEntries;
911 for (uint32_t BlockIndex = 0; !MetadataDecodeErr && !ULEBSizeErr &&
912 Cur && (BlockIndex < NumBlocksInBBRange);
913 ++BlockIndex) {
916
917 uint32_t LastCallsiteEndOffset = 0;
922 CallsiteEndOffsets.reserve(NumCallsites);
924 !ULEBSizeErr && Cur && (CallsiteIndex < NumCallsites);
926 LastCallsiteEndOffset +=
928 CallsiteEndOffsets.push_back(LastCallsiteEndOffset);
929 }
930 }
932 LastCallsiteEndOffset;
937 if (!MetadataOrErr) {
938 MetadataDecodeErr = MetadataOrErr.takeError();
939 break;
940 }
941 BBEntries.push_back({ID, Offset + PrevBBEndOffset, Size,
942 *MetadataOrErr, CallsiteEndOffsets, Hash});
944 }
945 TotalNumBlocks += BBEntries.size();
946 }
947 BBRangeEntries.push_back({RangeBaseAddress, std::move(BBEntries)});
948 }
949 FunctionEntries.push_back({std::move(BBRangeEntries)});
950
952
956 : 0;
957
958 std::vectorPGOAnalysisMap::PGOBBEntry PGOBBEntries;
959 for (uint32_t BlockIndex = 0;
961 !ULEBSizeErr && Cur && (BlockIndex < TotalNumBlocks);
962 ++BlockIndex) {
963
966 : 0;
970 : 0;
971
972
974 Successors;
975 if (FeatEnable.BrProb) {
977 for (uint64_t I = 0; I < SuccCount; ++I) {
983 : 0;
984
985 if (PGOAnalyses)
988 }
989 }
990
991 if (PGOAnalyses)
992 PGOBBEntries.push_back(
993 {BlockFrequency(BBF), PostLinkBBFreq, std::move(Successors)});
994 }
995
996 if (PGOAnalyses)
997 PGOAnalyses->push_back(
998 {FuncEntryCount, std::move(PGOBBEntries), FeatEnable});
999 }
1000 }
1001
1002
1003 if (!Cur || ULEBSizeErr || MetadataDecodeErr)
1005 std::move(MetadataDecodeErr));
1006 return FunctionEntries;
1007}
1012 std::vector *PGOAnalyses) const {
1013 size_t OriginalPGOSize = PGOAnalyses ? PGOAnalyses->size() : 0;
1014 auto AddrMapsOrErr = decodeBBAddrMapImpl(*this, Sec, RelaSec, PGOAnalyses);
1015
1016 if (!AddrMapsOrErr && PGOAnalyses)
1017 PGOAnalyses->resize(OriginalPGOSize);
1018 return std::move(AddrMapsOrErr);
1019}
1025 std::function<Expected(const Elf_Shdr &)> IsMatch) const {
1030 if (!DoesSectionMatch) {
1032 continue;
1033 }
1034 if (*DoesSectionMatch) {
1035 if (SecToRelocMap.try_emplace(&Sec).second)
1036 continue;
1037 }
1038
1041 continue;
1042
1044 if (!RelSecOrErr) {
1045 Errors = joinErrors(std::move(Errors),
1047 ": failed to get a relocated section: " +
1049 continue;
1050 }
1051 const Elf_Shdr *ContentsSec = *RelSecOrErr;
1052 Expected DoesRelTargetMatch = IsMatch(*ContentsSec);
1053 if (!DoesRelTargetMatch) {
1055 continue;
1056 }
1057 if (*DoesRelTargetMatch)
1058 SecToRelocMap[ContentsSec] = &Sec;
1059 }
1060 if(Errors)
1061 return std::move(Errors);
1062 return SecToRelocMap;
1063}