123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- llvm/ModuleSummaryIndexYAML.h - YAML I/O for summary ----*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_IR_MODULESUMMARYINDEXYAML_H
- #define LLVM_IR_MODULESUMMARYINDEXYAML_H
- #include "llvm/IR/ModuleSummaryIndex.h"
- #include "llvm/Support/YAMLTraits.h"
- namespace llvm {
- namespace yaml {
- template <> struct ScalarEnumerationTraits<TypeTestResolution::Kind> {
- static void enumeration(IO &io, TypeTestResolution::Kind &value) {
- io.enumCase(value, "Unknown", TypeTestResolution::Unknown);
- io.enumCase(value, "Unsat", TypeTestResolution::Unsat);
- io.enumCase(value, "ByteArray", TypeTestResolution::ByteArray);
- io.enumCase(value, "Inline", TypeTestResolution::Inline);
- io.enumCase(value, "Single", TypeTestResolution::Single);
- io.enumCase(value, "AllOnes", TypeTestResolution::AllOnes);
- }
- };
- template <> struct MappingTraits<TypeTestResolution> {
- static void mapping(IO &io, TypeTestResolution &res) {
- io.mapOptional("Kind", res.TheKind);
- io.mapOptional("SizeM1BitWidth", res.SizeM1BitWidth);
- io.mapOptional("AlignLog2", res.AlignLog2);
- io.mapOptional("SizeM1", res.SizeM1);
- io.mapOptional("BitMask", res.BitMask);
- io.mapOptional("InlineBits", res.InlineBits);
- }
- };
- template <>
- struct ScalarEnumerationTraits<WholeProgramDevirtResolution::ByArg::Kind> {
- static void enumeration(IO &io,
- WholeProgramDevirtResolution::ByArg::Kind &value) {
- io.enumCase(value, "Indir", WholeProgramDevirtResolution::ByArg::Indir);
- io.enumCase(value, "UniformRetVal",
- WholeProgramDevirtResolution::ByArg::UniformRetVal);
- io.enumCase(value, "UniqueRetVal",
- WholeProgramDevirtResolution::ByArg::UniqueRetVal);
- io.enumCase(value, "VirtualConstProp",
- WholeProgramDevirtResolution::ByArg::VirtualConstProp);
- }
- };
- template <> struct MappingTraits<WholeProgramDevirtResolution::ByArg> {
- static void mapping(IO &io, WholeProgramDevirtResolution::ByArg &res) {
- io.mapOptional("Kind", res.TheKind);
- io.mapOptional("Info", res.Info);
- io.mapOptional("Byte", res.Byte);
- io.mapOptional("Bit", res.Bit);
- }
- };
- template <>
- struct CustomMappingTraits<
- std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>> {
- static void inputOne(
- IO &io, StringRef Key,
- std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg> &V) {
- std::vector<uint64_t> Args;
- std::pair<StringRef, StringRef> P = {"", Key};
- while (!P.second.empty()) {
- P = P.second.split(',');
- uint64_t Arg;
- if (P.first.getAsInteger(0, Arg)) {
- io.setError("key not an integer");
- return;
- }
- Args.push_back(Arg);
- }
- io.mapRequired(Key.str().c_str(), V[Args]);
- }
- static void output(
- IO &io,
- std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg> &V) {
- for (auto &P : V) {
- std::string Key;
- for (uint64_t Arg : P.first) {
- if (!Key.empty())
- Key += ',';
- Key += llvm::utostr(Arg);
- }
- io.mapRequired(Key.c_str(), P.second);
- }
- }
- };
- template <> struct ScalarEnumerationTraits<WholeProgramDevirtResolution::Kind> {
- static void enumeration(IO &io, WholeProgramDevirtResolution::Kind &value) {
- io.enumCase(value, "Indir", WholeProgramDevirtResolution::Indir);
- io.enumCase(value, "SingleImpl", WholeProgramDevirtResolution::SingleImpl);
- io.enumCase(value, "BranchFunnel",
- WholeProgramDevirtResolution::BranchFunnel);
- }
- };
- template <> struct MappingTraits<WholeProgramDevirtResolution> {
- static void mapping(IO &io, WholeProgramDevirtResolution &res) {
- io.mapOptional("Kind", res.TheKind);
- io.mapOptional("SingleImplName", res.SingleImplName);
- io.mapOptional("ResByArg", res.ResByArg);
- }
- };
- template <>
- struct CustomMappingTraits<std::map<uint64_t, WholeProgramDevirtResolution>> {
- static void inputOne(IO &io, StringRef Key,
- std::map<uint64_t, WholeProgramDevirtResolution> &V) {
- uint64_t KeyInt;
- if (Key.getAsInteger(0, KeyInt)) {
- io.setError("key not an integer");
- return;
- }
- io.mapRequired(Key.str().c_str(), V[KeyInt]);
- }
- static void output(IO &io, std::map<uint64_t, WholeProgramDevirtResolution> &V) {
- for (auto &P : V)
- io.mapRequired(llvm::utostr(P.first).c_str(), P.second);
- }
- };
- template <> struct MappingTraits<TypeIdSummary> {
- static void mapping(IO &io, TypeIdSummary& summary) {
- io.mapOptional("TTRes", summary.TTRes);
- io.mapOptional("WPDRes", summary.WPDRes);
- }
- };
- struct FunctionSummaryYaml {
- unsigned Linkage, Visibility;
- bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
- std::vector<uint64_t> Refs;
- std::vector<uint64_t> TypeTests;
- std::vector<FunctionSummary::VFuncId> TypeTestAssumeVCalls,
- TypeCheckedLoadVCalls;
- std::vector<FunctionSummary::ConstVCall> TypeTestAssumeConstVCalls,
- TypeCheckedLoadConstVCalls;
- };
- } // End yaml namespace
- } // End llvm namespace
- namespace llvm {
- namespace yaml {
- template <> struct MappingTraits<FunctionSummary::VFuncId> {
- static void mapping(IO &io, FunctionSummary::VFuncId& id) {
- io.mapOptional("GUID", id.GUID);
- io.mapOptional("Offset", id.Offset);
- }
- };
- template <> struct MappingTraits<FunctionSummary::ConstVCall> {
- static void mapping(IO &io, FunctionSummary::ConstVCall& id) {
- io.mapOptional("VFunc", id.VFunc);
- io.mapOptional("Args", id.Args);
- }
- };
- } // End yaml namespace
- } // End llvm namespace
- LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::VFuncId)
- LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::ConstVCall)
- namespace llvm {
- namespace yaml {
- template <> struct MappingTraits<FunctionSummaryYaml> {
- static void mapping(IO &io, FunctionSummaryYaml& summary) {
- io.mapOptional("Linkage", summary.Linkage);
- io.mapOptional("Visibility", summary.Visibility);
- io.mapOptional("NotEligibleToImport", summary.NotEligibleToImport);
- io.mapOptional("Live", summary.Live);
- io.mapOptional("Local", summary.IsLocal);
- io.mapOptional("CanAutoHide", summary.CanAutoHide);
- io.mapOptional("Refs", summary.Refs);
- io.mapOptional("TypeTests", summary.TypeTests);
- io.mapOptional("TypeTestAssumeVCalls", summary.TypeTestAssumeVCalls);
- io.mapOptional("TypeCheckedLoadVCalls", summary.TypeCheckedLoadVCalls);
- io.mapOptional("TypeTestAssumeConstVCalls",
- summary.TypeTestAssumeConstVCalls);
- io.mapOptional("TypeCheckedLoadConstVCalls",
- summary.TypeCheckedLoadConstVCalls);
- }
- };
- } // End yaml namespace
- } // End llvm namespace
- LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummaryYaml)
- namespace llvm {
- namespace yaml {
- // FIXME: Add YAML mappings for the rest of the module summary.
- template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
- static void inputOne(IO &io, StringRef Key, GlobalValueSummaryMapTy &V) {
- std::vector<FunctionSummaryYaml> FSums;
- io.mapRequired(Key.str().c_str(), FSums);
- uint64_t KeyInt;
- if (Key.getAsInteger(0, KeyInt)) {
- io.setError("key not an integer");
- return;
- }
- if (!V.count(KeyInt))
- V.emplace(KeyInt, /*IsAnalysis=*/false);
- auto &Elem = V.find(KeyInt)->second;
- for (auto &FSum : FSums) {
- std::vector<ValueInfo> Refs;
- for (auto &RefGUID : FSum.Refs) {
- if (!V.count(RefGUID))
- V.emplace(RefGUID, /*IsAnalysis=*/false);
- Refs.push_back(ValueInfo(/*IsAnalysis=*/false, &*V.find(RefGUID)));
- }
- Elem.SummaryList.push_back(std::make_unique<FunctionSummary>(
- GlobalValueSummary::GVFlags(
- static_cast<GlobalValue::LinkageTypes>(FSum.Linkage),
- static_cast<GlobalValue::VisibilityTypes>(FSum.Visibility),
- FSum.NotEligibleToImport, FSum.Live, FSum.IsLocal,
- FSum.CanAutoHide),
- /*NumInsts=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0, Refs,
- ArrayRef<FunctionSummary::EdgeTy>{}, std::move(FSum.TypeTests),
- std::move(FSum.TypeTestAssumeVCalls),
- std::move(FSum.TypeCheckedLoadVCalls),
- std::move(FSum.TypeTestAssumeConstVCalls),
- std::move(FSum.TypeCheckedLoadConstVCalls),
- ArrayRef<FunctionSummary::ParamAccess>{}, ArrayRef<CallsiteInfo>{},
- ArrayRef<AllocInfo>{}));
- }
- }
- static void output(IO &io, GlobalValueSummaryMapTy &V) {
- for (auto &P : V) {
- std::vector<FunctionSummaryYaml> FSums;
- for (auto &Sum : P.second.SummaryList) {
- if (auto *FSum = dyn_cast<FunctionSummary>(Sum.get())) {
- std::vector<uint64_t> Refs;
- for (auto &VI : FSum->refs())
- Refs.push_back(VI.getGUID());
- FSums.push_back(FunctionSummaryYaml{
- FSum->flags().Linkage, FSum->flags().Visibility,
- static_cast<bool>(FSum->flags().NotEligibleToImport),
- static_cast<bool>(FSum->flags().Live),
- static_cast<bool>(FSum->flags().DSOLocal),
- static_cast<bool>(FSum->flags().CanAutoHide), Refs,
- FSum->type_tests(), FSum->type_test_assume_vcalls(),
- FSum->type_checked_load_vcalls(),
- FSum->type_test_assume_const_vcalls(),
- FSum->type_checked_load_const_vcalls()});
- }
- }
- if (!FSums.empty())
- io.mapRequired(llvm::utostr(P.first).c_str(), FSums);
- }
- }
- };
- template <> struct CustomMappingTraits<TypeIdSummaryMapTy> {
- static void inputOne(IO &io, StringRef Key, TypeIdSummaryMapTy &V) {
- TypeIdSummary TId;
- io.mapRequired(Key.str().c_str(), TId);
- V.insert({GlobalValue::getGUID(Key), {std::string(Key), TId}});
- }
- static void output(IO &io, TypeIdSummaryMapTy &V) {
- for (auto &TidIter : V)
- io.mapRequired(TidIter.second.first.c_str(), TidIter.second.second);
- }
- };
- template <> struct MappingTraits<ModuleSummaryIndex> {
- static void mapping(IO &io, ModuleSummaryIndex& index) {
- io.mapOptional("GlobalValueMap", index.GlobalValueMap);
- io.mapOptional("TypeIdMap", index.TypeIdMap);
- io.mapOptional("WithGlobalValueDeadStripping",
- index.WithGlobalValueDeadStripping);
- if (io.outputting()) {
- std::vector<std::string> CfiFunctionDefs(index.CfiFunctionDefs.begin(),
- index.CfiFunctionDefs.end());
- io.mapOptional("CfiFunctionDefs", CfiFunctionDefs);
- std::vector<std::string> CfiFunctionDecls(index.CfiFunctionDecls.begin(),
- index.CfiFunctionDecls.end());
- io.mapOptional("CfiFunctionDecls", CfiFunctionDecls);
- } else {
- std::vector<std::string> CfiFunctionDefs;
- io.mapOptional("CfiFunctionDefs", CfiFunctionDefs);
- index.CfiFunctionDefs = {CfiFunctionDefs.begin(), CfiFunctionDefs.end()};
- std::vector<std::string> CfiFunctionDecls;
- io.mapOptional("CfiFunctionDecls", CfiFunctionDecls);
- index.CfiFunctionDecls = {CfiFunctionDecls.begin(),
- CfiFunctionDecls.end()};
- }
- }
- };
- } // End yaml namespace
- } // End llvm namespace
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|