ModuleSummaryIndexYAML.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //===-- llvm/ModuleSummaryIndexYAML.h - YAML I/O for summary ----*- C++ -*-===//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_IR_MODULESUMMARYINDEXYAML_H
  14. #define LLVM_IR_MODULESUMMARYINDEXYAML_H
  15. #include "llvm/IR/ModuleSummaryIndex.h"
  16. #include "llvm/Support/YAMLTraits.h"
  17. namespace llvm {
  18. namespace yaml {
  19. template <> struct ScalarEnumerationTraits<TypeTestResolution::Kind> {
  20. static void enumeration(IO &io, TypeTestResolution::Kind &value) {
  21. io.enumCase(value, "Unknown", TypeTestResolution::Unknown);
  22. io.enumCase(value, "Unsat", TypeTestResolution::Unsat);
  23. io.enumCase(value, "ByteArray", TypeTestResolution::ByteArray);
  24. io.enumCase(value, "Inline", TypeTestResolution::Inline);
  25. io.enumCase(value, "Single", TypeTestResolution::Single);
  26. io.enumCase(value, "AllOnes", TypeTestResolution::AllOnes);
  27. }
  28. };
  29. template <> struct MappingTraits<TypeTestResolution> {
  30. static void mapping(IO &io, TypeTestResolution &res) {
  31. io.mapOptional("Kind", res.TheKind);
  32. io.mapOptional("SizeM1BitWidth", res.SizeM1BitWidth);
  33. io.mapOptional("AlignLog2", res.AlignLog2);
  34. io.mapOptional("SizeM1", res.SizeM1);
  35. io.mapOptional("BitMask", res.BitMask);
  36. io.mapOptional("InlineBits", res.InlineBits);
  37. }
  38. };
  39. template <>
  40. struct ScalarEnumerationTraits<WholeProgramDevirtResolution::ByArg::Kind> {
  41. static void enumeration(IO &io,
  42. WholeProgramDevirtResolution::ByArg::Kind &value) {
  43. io.enumCase(value, "Indir", WholeProgramDevirtResolution::ByArg::Indir);
  44. io.enumCase(value, "UniformRetVal",
  45. WholeProgramDevirtResolution::ByArg::UniformRetVal);
  46. io.enumCase(value, "UniqueRetVal",
  47. WholeProgramDevirtResolution::ByArg::UniqueRetVal);
  48. io.enumCase(value, "VirtualConstProp",
  49. WholeProgramDevirtResolution::ByArg::VirtualConstProp);
  50. }
  51. };
  52. template <> struct MappingTraits<WholeProgramDevirtResolution::ByArg> {
  53. static void mapping(IO &io, WholeProgramDevirtResolution::ByArg &res) {
  54. io.mapOptional("Kind", res.TheKind);
  55. io.mapOptional("Info", res.Info);
  56. io.mapOptional("Byte", res.Byte);
  57. io.mapOptional("Bit", res.Bit);
  58. }
  59. };
  60. template <>
  61. struct CustomMappingTraits<
  62. std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg>> {
  63. static void inputOne(
  64. IO &io, StringRef Key,
  65. std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg> &V) {
  66. std::vector<uint64_t> Args;
  67. std::pair<StringRef, StringRef> P = {"", Key};
  68. while (!P.second.empty()) {
  69. P = P.second.split(',');
  70. uint64_t Arg;
  71. if (P.first.getAsInteger(0, Arg)) {
  72. io.setError("key not an integer");
  73. return;
  74. }
  75. Args.push_back(Arg);
  76. }
  77. io.mapRequired(Key.str().c_str(), V[Args]);
  78. }
  79. static void output(
  80. IO &io,
  81. std::map<std::vector<uint64_t>, WholeProgramDevirtResolution::ByArg> &V) {
  82. for (auto &P : V) {
  83. std::string Key;
  84. for (uint64_t Arg : P.first) {
  85. if (!Key.empty())
  86. Key += ',';
  87. Key += llvm::utostr(Arg);
  88. }
  89. io.mapRequired(Key.c_str(), P.second);
  90. }
  91. }
  92. };
  93. template <> struct ScalarEnumerationTraits<WholeProgramDevirtResolution::Kind> {
  94. static void enumeration(IO &io, WholeProgramDevirtResolution::Kind &value) {
  95. io.enumCase(value, "Indir", WholeProgramDevirtResolution::Indir);
  96. io.enumCase(value, "SingleImpl", WholeProgramDevirtResolution::SingleImpl);
  97. io.enumCase(value, "BranchFunnel",
  98. WholeProgramDevirtResolution::BranchFunnel);
  99. }
  100. };
  101. template <> struct MappingTraits<WholeProgramDevirtResolution> {
  102. static void mapping(IO &io, WholeProgramDevirtResolution &res) {
  103. io.mapOptional("Kind", res.TheKind);
  104. io.mapOptional("SingleImplName", res.SingleImplName);
  105. io.mapOptional("ResByArg", res.ResByArg);
  106. }
  107. };
  108. template <>
  109. struct CustomMappingTraits<std::map<uint64_t, WholeProgramDevirtResolution>> {
  110. static void inputOne(IO &io, StringRef Key,
  111. std::map<uint64_t, WholeProgramDevirtResolution> &V) {
  112. uint64_t KeyInt;
  113. if (Key.getAsInteger(0, KeyInt)) {
  114. io.setError("key not an integer");
  115. return;
  116. }
  117. io.mapRequired(Key.str().c_str(), V[KeyInt]);
  118. }
  119. static void output(IO &io, std::map<uint64_t, WholeProgramDevirtResolution> &V) {
  120. for (auto &P : V)
  121. io.mapRequired(llvm::utostr(P.first).c_str(), P.second);
  122. }
  123. };
  124. template <> struct MappingTraits<TypeIdSummary> {
  125. static void mapping(IO &io, TypeIdSummary& summary) {
  126. io.mapOptional("TTRes", summary.TTRes);
  127. io.mapOptional("WPDRes", summary.WPDRes);
  128. }
  129. };
  130. struct FunctionSummaryYaml {
  131. unsigned Linkage, Visibility;
  132. bool NotEligibleToImport, Live, IsLocal, CanAutoHide;
  133. std::vector<uint64_t> Refs;
  134. std::vector<uint64_t> TypeTests;
  135. std::vector<FunctionSummary::VFuncId> TypeTestAssumeVCalls,
  136. TypeCheckedLoadVCalls;
  137. std::vector<FunctionSummary::ConstVCall> TypeTestAssumeConstVCalls,
  138. TypeCheckedLoadConstVCalls;
  139. };
  140. } // End yaml namespace
  141. } // End llvm namespace
  142. namespace llvm {
  143. namespace yaml {
  144. template <> struct MappingTraits<FunctionSummary::VFuncId> {
  145. static void mapping(IO &io, FunctionSummary::VFuncId& id) {
  146. io.mapOptional("GUID", id.GUID);
  147. io.mapOptional("Offset", id.Offset);
  148. }
  149. };
  150. template <> struct MappingTraits<FunctionSummary::ConstVCall> {
  151. static void mapping(IO &io, FunctionSummary::ConstVCall& id) {
  152. io.mapOptional("VFunc", id.VFunc);
  153. io.mapOptional("Args", id.Args);
  154. }
  155. };
  156. } // End yaml namespace
  157. } // End llvm namespace
  158. LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::VFuncId)
  159. LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummary::ConstVCall)
  160. namespace llvm {
  161. namespace yaml {
  162. template <> struct MappingTraits<FunctionSummaryYaml> {
  163. static void mapping(IO &io, FunctionSummaryYaml& summary) {
  164. io.mapOptional("Linkage", summary.Linkage);
  165. io.mapOptional("Visibility", summary.Visibility);
  166. io.mapOptional("NotEligibleToImport", summary.NotEligibleToImport);
  167. io.mapOptional("Live", summary.Live);
  168. io.mapOptional("Local", summary.IsLocal);
  169. io.mapOptional("CanAutoHide", summary.CanAutoHide);
  170. io.mapOptional("Refs", summary.Refs);
  171. io.mapOptional("TypeTests", summary.TypeTests);
  172. io.mapOptional("TypeTestAssumeVCalls", summary.TypeTestAssumeVCalls);
  173. io.mapOptional("TypeCheckedLoadVCalls", summary.TypeCheckedLoadVCalls);
  174. io.mapOptional("TypeTestAssumeConstVCalls",
  175. summary.TypeTestAssumeConstVCalls);
  176. io.mapOptional("TypeCheckedLoadConstVCalls",
  177. summary.TypeCheckedLoadConstVCalls);
  178. }
  179. };
  180. } // End yaml namespace
  181. } // End llvm namespace
  182. LLVM_YAML_IS_SEQUENCE_VECTOR(FunctionSummaryYaml)
  183. namespace llvm {
  184. namespace yaml {
  185. // FIXME: Add YAML mappings for the rest of the module summary.
  186. template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
  187. static void inputOne(IO &io, StringRef Key, GlobalValueSummaryMapTy &V) {
  188. std::vector<FunctionSummaryYaml> FSums;
  189. io.mapRequired(Key.str().c_str(), FSums);
  190. uint64_t KeyInt;
  191. if (Key.getAsInteger(0, KeyInt)) {
  192. io.setError("key not an integer");
  193. return;
  194. }
  195. if (!V.count(KeyInt))
  196. V.emplace(KeyInt, /*IsAnalysis=*/false);
  197. auto &Elem = V.find(KeyInt)->second;
  198. for (auto &FSum : FSums) {
  199. std::vector<ValueInfo> Refs;
  200. for (auto &RefGUID : FSum.Refs) {
  201. if (!V.count(RefGUID))
  202. V.emplace(RefGUID, /*IsAnalysis=*/false);
  203. Refs.push_back(ValueInfo(/*IsAnalysis=*/false, &*V.find(RefGUID)));
  204. }
  205. Elem.SummaryList.push_back(std::make_unique<FunctionSummary>(
  206. GlobalValueSummary::GVFlags(
  207. static_cast<GlobalValue::LinkageTypes>(FSum.Linkage),
  208. static_cast<GlobalValue::VisibilityTypes>(FSum.Visibility),
  209. FSum.NotEligibleToImport, FSum.Live, FSum.IsLocal,
  210. FSum.CanAutoHide),
  211. /*NumInsts=*/0, FunctionSummary::FFlags{}, /*EntryCount=*/0, Refs,
  212. ArrayRef<FunctionSummary::EdgeTy>{}, std::move(FSum.TypeTests),
  213. std::move(FSum.TypeTestAssumeVCalls),
  214. std::move(FSum.TypeCheckedLoadVCalls),
  215. std::move(FSum.TypeTestAssumeConstVCalls),
  216. std::move(FSum.TypeCheckedLoadConstVCalls),
  217. ArrayRef<FunctionSummary::ParamAccess>{}, ArrayRef<CallsiteInfo>{},
  218. ArrayRef<AllocInfo>{}));
  219. }
  220. }
  221. static void output(IO &io, GlobalValueSummaryMapTy &V) {
  222. for (auto &P : V) {
  223. std::vector<FunctionSummaryYaml> FSums;
  224. for (auto &Sum : P.second.SummaryList) {
  225. if (auto *FSum = dyn_cast<FunctionSummary>(Sum.get())) {
  226. std::vector<uint64_t> Refs;
  227. for (auto &VI : FSum->refs())
  228. Refs.push_back(VI.getGUID());
  229. FSums.push_back(FunctionSummaryYaml{
  230. FSum->flags().Linkage, FSum->flags().Visibility,
  231. static_cast<bool>(FSum->flags().NotEligibleToImport),
  232. static_cast<bool>(FSum->flags().Live),
  233. static_cast<bool>(FSum->flags().DSOLocal),
  234. static_cast<bool>(FSum->flags().CanAutoHide), Refs,
  235. FSum->type_tests(), FSum->type_test_assume_vcalls(),
  236. FSum->type_checked_load_vcalls(),
  237. FSum->type_test_assume_const_vcalls(),
  238. FSum->type_checked_load_const_vcalls()});
  239. }
  240. }
  241. if (!FSums.empty())
  242. io.mapRequired(llvm::utostr(P.first).c_str(), FSums);
  243. }
  244. }
  245. };
  246. template <> struct CustomMappingTraits<TypeIdSummaryMapTy> {
  247. static void inputOne(IO &io, StringRef Key, TypeIdSummaryMapTy &V) {
  248. TypeIdSummary TId;
  249. io.mapRequired(Key.str().c_str(), TId);
  250. V.insert({GlobalValue::getGUID(Key), {std::string(Key), TId}});
  251. }
  252. static void output(IO &io, TypeIdSummaryMapTy &V) {
  253. for (auto &TidIter : V)
  254. io.mapRequired(TidIter.second.first.c_str(), TidIter.second.second);
  255. }
  256. };
  257. template <> struct MappingTraits<ModuleSummaryIndex> {
  258. static void mapping(IO &io, ModuleSummaryIndex& index) {
  259. io.mapOptional("GlobalValueMap", index.GlobalValueMap);
  260. io.mapOptional("TypeIdMap", index.TypeIdMap);
  261. io.mapOptional("WithGlobalValueDeadStripping",
  262. index.WithGlobalValueDeadStripping);
  263. if (io.outputting()) {
  264. std::vector<std::string> CfiFunctionDefs(index.CfiFunctionDefs.begin(),
  265. index.CfiFunctionDefs.end());
  266. io.mapOptional("CfiFunctionDefs", CfiFunctionDefs);
  267. std::vector<std::string> CfiFunctionDecls(index.CfiFunctionDecls.begin(),
  268. index.CfiFunctionDecls.end());
  269. io.mapOptional("CfiFunctionDecls", CfiFunctionDecls);
  270. } else {
  271. std::vector<std::string> CfiFunctionDefs;
  272. io.mapOptional("CfiFunctionDefs", CfiFunctionDefs);
  273. index.CfiFunctionDefs = {CfiFunctionDefs.begin(), CfiFunctionDefs.end()};
  274. std::vector<std::string> CfiFunctionDecls;
  275. io.mapOptional("CfiFunctionDecls", CfiFunctionDecls);
  276. index.CfiFunctionDecls = {CfiFunctionDecls.begin(),
  277. CfiFunctionDecls.end()};
  278. }
  279. }
  280. };
  281. } // End yaml namespace
  282. } // End llvm namespace
  283. #endif
  284. #ifdef __GNUC__
  285. #pragma GCC diagnostic pop
  286. #endif