1 //===- InstrProf.h - Instrumented profiling format support ------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Instrumentation-based profiling data is generated by instrumented 10 // binaries through library functions in compiler-rt, and read by the clang 11 // frontend to feed PGO. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_PROFILEDATA_INSTRPROF_H 16 #define LLVM_PROFILEDATA_INSTRPROF_H 17 18 #include "llvm/ADT/ArrayRef.h" 19 #include "llvm/ADT/BitmaskEnum.h" 20 #include "llvm/ADT/DenseMap.h" 21 #include "llvm/ADT/IntervalMap.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/ADT/StringRef.h" 24 #include "llvm/ADT/StringSet.h" 25 #include "llvm/IR/GlobalValue.h" 26 #include "llvm/IR/ProfileSummary.h" 27 #include "llvm/ProfileData/InstrProfData.inc" 28 #include "llvm/Support/BalancedPartitioning.h" 29 #include "llvm/Support/CommandLine.h" 30 #include "llvm/Support/Compiler.h" 31 #include "llvm/Support/Error.h" 32 #include "llvm/Support/ErrorHandling.h" 33 #include "llvm/Support/MD5.h" 34 #include "llvm/Support/MathExtras.h" 35 #include "llvm/Support/raw_ostream.h" 36 #include "llvm/TargetParser/Host.h" 37 #include "llvm/TargetParser/Triple.h" 38 #include <algorithm> 39 #include <cassert> 40 #include <cstddef> 41 #include <cstdint> 42 #include <cstring> 43 #include <list> 44 #include <memory> 45 #include <string> 46 #include <system_error> 47 #include <utility> 48 #include <vector> 49 50 namespace llvm { 51 52 class Function; 53 class GlobalVariable; 54 struct InstrProfRecord; 55 class InstrProfSymtab; 56 class Instruction; 57 class MDNode; 58 class Module; 59 60 enum InstrProfSectKind { 61 #define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) Kind, 62 #include "llvm/ProfileData/InstrProfData.inc" 63 }; 64 65 /// Return the max count value. We reserver a few large values for special use. 66 inline uint64_t getInstrMaxCountValue() { 67 return std::numeric_limits<uint64_t>::max() - 2; 68 } 69 70 /// Return the name of the profile section corresponding to \p IPSK. 71 /// 72 /// The name of the section depends on the object format type \p OF. If 73 /// \p AddSegmentInfo is true, a segment prefix and additional linker hints may 74 /// be added to the section name (this is the default). 75 std::string getInstrProfSectionName(InstrProfSectKind IPSK, 76 Triple::ObjectFormatType OF, 77 bool AddSegmentInfo = true); 78 79 /// Return the name profile runtime entry point to do value profiling 80 /// for a given site. 81 inline StringRef getInstrProfValueProfFuncName() { 82 return INSTR_PROF_VALUE_PROF_FUNC_STR; 83 } 84 85 /// Return the name profile runtime entry point to do memop size value 86 /// profiling. 87 inline StringRef getInstrProfValueProfMemOpFuncName() { 88 return INSTR_PROF_VALUE_PROF_MEMOP_FUNC_STR; 89 } 90 91 /// Return the name prefix of variables containing instrumented function names. 92 inline StringRef getInstrProfNameVarPrefix() { return "__profn_"; } 93 94 /// Return the name prefix of variables containing virtual table profile data. 95 inline StringRef getInstrProfVTableVarPrefix() { return "__profvt_"; } 96 97 /// Return the name prefix of variables containing per-function control data. 98 inline StringRef getInstrProfDataVarPrefix() { return "__profd_"; } 99 100 /// Return the name prefix of profile counter variables. 101 inline StringRef getInstrProfCountersVarPrefix() { return "__profc_"; } 102 103 /// Return the name prefix of profile bitmap variables. 104 inline StringRef getInstrProfBitmapVarPrefix() { return "__profbm_"; } 105 106 /// Return the name prefix of value profile variables. 107 inline StringRef getInstrProfValuesVarPrefix() { return "__profvp_"; } 108 109 /// Return the name of value profile node array variables: 110 inline StringRef getInstrProfVNodesVarName() { return "__llvm_prf_vnodes"; } 111 112 /// Return the name of the variable holding the strings (possibly compressed) 113 /// of all function's PGO names. 114 inline StringRef getInstrProfNamesVarName() { return "__llvm_prf_nm"; } 115 116 inline StringRef getInstrProfVTableNamesVarName() { return "__llvm_prf_vnm"; } 117 118 /// Return the name of a covarage mapping variable (internal linkage) 119 /// for each instrumented source module. Such variables are allocated 120 /// in the __llvm_covmap section. 121 inline StringRef getCoverageMappingVarName() { 122 return "__llvm_coverage_mapping"; 123 } 124 125 /// Return the name of the internal variable recording the array 126 /// of PGO name vars referenced by the coverage mapping. The owning 127 /// functions of those names are not emitted by FE (e.g, unused inline 128 /// functions.) 129 inline StringRef getCoverageUnusedNamesVarName() { 130 return "__llvm_coverage_names"; 131 } 132 133 /// Return the name of function that registers all the per-function control 134 /// data at program startup time by calling __llvm_register_function. This 135 /// function has internal linkage and is called by __llvm_profile_init 136 /// runtime method. This function is not generated for these platforms: 137 /// Darwin, Linux, and FreeBSD. 138 inline StringRef getInstrProfRegFuncsName() { 139 return "__llvm_profile_register_functions"; 140 } 141 142 /// Return the name of the runtime interface that registers per-function control 143 /// data for one instrumented function. 144 inline StringRef getInstrProfRegFuncName() { 145 return "__llvm_profile_register_function"; 146 } 147 148 /// Return the name of the runtime interface that registers the PGO name 149 /// strings. 150 inline StringRef getInstrProfNamesRegFuncName() { 151 return "__llvm_profile_register_names_function"; 152 } 153 154 /// Return the name of the runtime initialization method that is generated by 155 /// the compiler. The function calls __llvm_profile_register_functions and 156 /// __llvm_profile_override_default_filename functions if needed. This function 157 /// has internal linkage and invoked at startup time via init_array. 158 inline StringRef getInstrProfInitFuncName() { return "__llvm_profile_init"; } 159 160 /// Return the name of the hook variable defined in profile runtime library. 161 /// A reference to the variable causes the linker to link in the runtime 162 /// initialization module (which defines the hook variable). 163 inline StringRef getInstrProfRuntimeHookVarName() { 164 return INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_RUNTIME_VAR); 165 } 166 167 /// Return the name of the compiler generated function that references the 168 /// runtime hook variable. The function is a weak global. 169 inline StringRef getInstrProfRuntimeHookVarUseFuncName() { 170 return "__llvm_profile_runtime_user"; 171 } 172 173 inline StringRef getInstrProfCounterBiasVarName() { 174 return INSTR_PROF_QUOTE(INSTR_PROF_PROFILE_COUNTER_BIAS_VAR); 175 } 176 177 /// Return the marker used to separate PGO names during serialization. 178 inline StringRef getInstrProfNameSeparator() { return "\01"; } 179 180 /// Please use getIRPGOFuncName for LLVM IR instrumentation. This function is 181 /// for front-end (Clang, etc) instrumentation. 182 /// Return the modified name for function \c F suitable to be 183 /// used the key for profile lookup. Variable \c InLTO indicates if this 184 /// is called in LTO optimization passes. 185 std::string getPGOFuncName(const Function &F, bool InLTO = false, 186 uint64_t Version = INSTR_PROF_INDEX_VERSION); 187 188 /// Return the modified name for a function suitable to be 189 /// used the key for profile lookup. The function's original 190 /// name is \c RawFuncName and has linkage of type \c Linkage. 191 /// The function is defined in module \c FileName. 192 std::string getPGOFuncName(StringRef RawFuncName, 193 GlobalValue::LinkageTypes Linkage, 194 StringRef FileName, 195 uint64_t Version = INSTR_PROF_INDEX_VERSION); 196 197 /// \return the modified name for function \c F suitable to be 198 /// used as the key for IRPGO profile lookup. \c InLTO indicates if this is 199 /// called from LTO optimization passes. 200 std::string getIRPGOFuncName(const Function &F, bool InLTO = false); 201 202 /// \return the filename and the function name parsed from the output of 203 /// \c getIRPGOFuncName() 204 std::pair<StringRef, StringRef> getParsedIRPGOName(StringRef IRPGOName); 205 206 /// Return the name of the global variable used to store a function 207 /// name in PGO instrumentation. \c FuncName is the IRPGO function name 208 /// (returned by \c getIRPGOFuncName) for LLVM IR instrumentation and PGO 209 /// function name (returned by \c getPGOFuncName) for front-end instrumentation. 210 std::string getPGOFuncNameVarName(StringRef FuncName, 211 GlobalValue::LinkageTypes Linkage); 212 213 /// Create and return the global variable for function name used in PGO 214 /// instrumentation. \c FuncName is the IRPGO function name (returned by 215 /// \c getIRPGOFuncName) for LLVM IR instrumentation and PGO function name 216 /// (returned by \c getPGOFuncName) for front-end instrumentation. 217 GlobalVariable *createPGOFuncNameVar(Function &F, StringRef PGOFuncName); 218 219 /// Create and return the global variable for function name used in PGO 220 /// instrumentation. \c FuncName is the IRPGO function name (returned by 221 /// \c getIRPGOFuncName) for LLVM IR instrumentation and PGO function name 222 /// (returned by \c getPGOFuncName) for front-end instrumentation. 223 GlobalVariable *createPGOFuncNameVar(Module &M, 224 GlobalValue::LinkageTypes Linkage, 225 StringRef PGOFuncName); 226 227 /// Return the initializer in string of the PGO name var \c NameVar. 228 StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar); 229 230 /// Given a PGO function name, remove the filename prefix and return 231 /// the original (static) function name. 232 StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName, 233 StringRef FileName = "<unknown>"); 234 235 /// Given a vector of strings (names of global objects like functions or, 236 /// virtual tables) \c NameStrs, the method generates a combined string \c 237 /// Result that is ready to be serialized. The \c Result string is comprised of 238 /// three fields: The first field is the length of the uncompressed strings, and 239 /// the the second field is the length of the zlib-compressed string. Both 240 /// fields are encoded in ULEB128. If \c doCompress is false, the 241 /// third field is the uncompressed strings; otherwise it is the 242 /// compressed string. When the string compression is off, the 243 /// second field will have value zero. 244 Error collectGlobalObjectNameStrings(ArrayRef<std::string> NameStrs, 245 bool doCompression, std::string &Result); 246 247 /// Produce \c Result string with the same format described above. The input 248 /// is vector of PGO function name variables that are referenced. 249 /// The global variable element in 'NameVars' is a string containing the pgo 250 /// name of a function. See `createPGOFuncNameVar` that creates these global 251 /// variables. 252 Error collectPGOFuncNameStrings(ArrayRef<GlobalVariable *> NameVars, 253 std::string &Result, bool doCompression = true); 254 255 Error collectVTableStrings(ArrayRef<GlobalVariable *> VTables, 256 std::string &Result, bool doCompression); 257 258 /// Check if INSTR_PROF_RAW_VERSION_VAR is defined. This global is only being 259 /// set in IR PGO compilation. 260 bool isIRPGOFlagSet(const Module *M); 261 262 /// Check if we can safely rename this Comdat function. Instances of the same 263 /// comdat function may have different control flows thus can not share the 264 /// same counter variable. 265 bool canRenameComdatFunc(const Function &F, bool CheckAddressTaken = false); 266 267 enum InstrProfValueKind : uint32_t { 268 #define VALUE_PROF_KIND(Enumerator, Value, Descr) Enumerator = Value, 269 #include "llvm/ProfileData/InstrProfData.inc" 270 }; 271 272 /// Get the value profile data for value site \p SiteIdx from \p InstrProfR 273 /// and annotate the instruction \p Inst with the value profile meta data. 274 /// Annotate up to \p MaxMDCount (default 3) number of records per value site. 275 void annotateValueSite(Module &M, Instruction &Inst, 276 const InstrProfRecord &InstrProfR, 277 InstrProfValueKind ValueKind, uint32_t SiteIndx, 278 uint32_t MaxMDCount = 3); 279 280 /// Same as the above interface but using an ArrayRef, as well as \p Sum. 281 /// This function will not annotate !prof metadata on the instruction if the 282 /// referenced array is empty. 283 void annotateValueSite(Module &M, Instruction &Inst, 284 ArrayRef<InstrProfValueData> VDs, uint64_t Sum, 285 InstrProfValueKind ValueKind, uint32_t MaxMDCount); 286 287 // TODO: Unify metadata name 'PGOFuncName' and 'PGOName', by supporting read 288 // of this metadata for backward compatibility and generating 'PGOName' only. 289 /// Extract the value profile data from \p Inst and returns them if \p Inst is 290 /// annotated with value profile data. Returns an empty vector otherwise. 291 SmallVector<InstrProfValueData, 4> 292 getValueProfDataFromInst(const Instruction &Inst, InstrProfValueKind ValueKind, 293 uint32_t MaxNumValueData, uint64_t &TotalC, 294 bool GetNoICPValue = false); 295 296 inline StringRef getPGOFuncNameMetadataName() { return "PGOFuncName"; } 297 298 inline StringRef getPGONameMetadataName() { return "PGOName"; } 299 300 /// Return the PGOFuncName meta data associated with a function. 301 MDNode *getPGOFuncNameMetadata(const Function &F); 302 303 std::string getPGOName(const GlobalVariable &V, bool InLTO = false); 304 305 /// Create the PGOFuncName meta data if PGOFuncName is different from 306 /// function's raw name. This should only apply to internal linkage functions 307 /// declared by users only. 308 /// TODO: Update all callers to 'createPGONameMetadata' and deprecate this 309 /// function. 310 void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName); 311 312 /// Create the PGOName metadata if a global object's PGO name is different from 313 /// its mangled name. This should apply to local-linkage global objects only. 314 void createPGONameMetadata(GlobalObject &GO, StringRef PGOName); 315 316 /// Check if we can use Comdat for profile variables. This will eliminate 317 /// the duplicated profile variables for Comdat functions. 318 bool needsComdatForCounter(const GlobalObject &GV, const Module &M); 319 320 /// An enum describing the attributes of an instrumented profile. 321 enum class InstrProfKind { 322 Unknown = 0x0, 323 // A frontend clang profile, incompatible with other attrs. 324 FrontendInstrumentation = 0x1, 325 // An IR-level profile (default when -fprofile-generate is used). 326 IRInstrumentation = 0x2, 327 // A profile with entry basic block instrumentation. 328 FunctionEntryInstrumentation = 0x4, 329 // A context sensitive IR-level profile. 330 ContextSensitive = 0x8, 331 // Use single byte probes for coverage. 332 SingleByteCoverage = 0x10, 333 // Only instrument the function entry basic block. 334 FunctionEntryOnly = 0x20, 335 // A memory profile collected using -fprofile=memory. 336 MemProf = 0x40, 337 // A temporal profile. 338 TemporalProfile = 0x80, 339 LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/TemporalProfile) 340 }; 341 342 const std::error_category &instrprof_category(); 343 344 enum class instrprof_error { 345 success = 0, 346 eof, 347 unrecognized_format, 348 bad_magic, 349 bad_header, 350 unsupported_version, 351 unsupported_hash_type, 352 too_large, 353 truncated, 354 malformed, 355 missing_correlation_info, 356 unexpected_correlation_info, 357 unable_to_correlate_profile, 358 unknown_function, 359 invalid_prof, 360 hash_mismatch, 361 count_mismatch, 362 bitmap_mismatch, 363 counter_overflow, 364 value_site_count_mismatch, 365 compress_failed, 366 uncompress_failed, 367 empty_raw_profile, 368 zlib_unavailable, 369 raw_profile_version_mismatch, 370 counter_value_too_large, 371 }; 372 373 /// An ordered list of functions identified by their NameRef found in 374 /// INSTR_PROF_DATA 375 struct TemporalProfTraceTy { 376 std::vector<uint64_t> FunctionNameRefs; 377 uint64_t Weight; 378 TemporalProfTraceTy(std::initializer_list<uint64_t> Trace = {}, 379 uint64_t Weight = 1) 380 : FunctionNameRefs(Trace), Weight(Weight) {} 381 382 /// Use a set of temporal profile traces to create a list of balanced 383 /// partitioning function nodes used by BalancedPartitioning to generate a 384 /// function order that reduces page faults during startup 385 static void createBPFunctionNodes(ArrayRef<TemporalProfTraceTy> Traces, 386 std::vector<BPFunctionNode> &Nodes, 387 bool RemoveOutlierUNs = true); 388 }; 389 390 inline std::error_code make_error_code(instrprof_error E) { 391 return std::error_code(static_cast<int>(E), instrprof_category()); 392 } 393 394 class InstrProfError : public ErrorInfo<InstrProfError> { 395 public: 396 InstrProfError(instrprof_error Err, const Twine &ErrStr = Twine()) 397 : Err(Err), Msg(ErrStr.str()) { 398 assert(Err != instrprof_error::success && "Not an error"); 399 } 400 401 std::string message() const override; 402 403 void log(raw_ostream &OS) const override { OS << message(); } 404 405 std::error_code convertToErrorCode() const override { 406 return make_error_code(Err); 407 } 408 409 instrprof_error get() const { return Err; } 410 const std::string &getMessage() const { return Msg; } 411 412 /// Consume an Error and return the raw enum value contained within it, and 413 /// the optional error message. The Error must either be a success value, or 414 /// contain a single InstrProfError. 415 static std::pair<instrprof_error, std::string> take(Error E) { 416 auto Err = instrprof_error::success; 417 std::string Msg = ""; 418 handleAllErrors(std::move(E), [&Err, &Msg](const InstrProfError &IPE) { 419 assert(Err == instrprof_error::success && "Multiple errors encountered"); 420 Err = IPE.get(); 421 Msg = IPE.getMessage(); 422 }); 423 return {Err, Msg}; 424 } 425 426 static char ID; 427 428 private: 429 instrprof_error Err; 430 std::string Msg; 431 }; 432 433 namespace object { 434 435 class SectionRef; 436 437 } // end namespace object 438 439 namespace IndexedInstrProf { 440 441 uint64_t ComputeHash(StringRef K); 442 443 } // end namespace IndexedInstrProf 444 445 /// A symbol table used for function [IR]PGO name look-up with keys 446 /// (such as pointers, md5hash values) to the function. A function's 447 /// [IR]PGO name or name's md5hash are used in retrieving the profile 448 /// data of the function. See \c getIRPGOFuncName() and \c getPGOFuncName 449 /// methods for details how [IR]PGO name is formed. 450 class InstrProfSymtab { 451 public: 452 using AddrHashMap = std::vector<std::pair<uint64_t, uint64_t>>; 453 454 private: 455 using AddrIntervalMap = 456 IntervalMap<uint64_t, uint64_t, 4, IntervalMapHalfOpenInfo<uint64_t>>; 457 StringRef Data; 458 uint64_t Address = 0; 459 // Unique name strings. Used to ensure entries in MD5NameMap (a vector that's 460 // going to be sorted) has unique MD5 keys in the first place. 461 StringSet<> NameTab; 462 // Records the unique virtual table names. This is used by InstrProfWriter to 463 // write out an on-disk chained hash table of virtual table names. 464 // InstrProfWriter stores per function profile data (keyed by function names) 465 // so it doesn't use a StringSet for function names. 466 StringSet<> VTableNames; 467 // A map from MD5 keys to function name strings. 468 std::vector<std::pair<uint64_t, StringRef>> MD5NameMap; 469 // A map from MD5 keys to function define. We only populate this map 470 // when build the Symtab from a Module. 471 std::vector<std::pair<uint64_t, Function *>> MD5FuncMap; 472 // A map from MD5 to the global variable. This map is only populated when 473 // building the symtab from a module. Use separate container instances for 474 // `MD5FuncMap` and `MD5VTableMap`. 475 // TODO: Unify the container type and the lambda function 'mapName' inside 476 // add{Func,VTable}WithName. 477 DenseMap<uint64_t, GlobalVariable *> MD5VTableMap; 478 // A map from function runtime address to function name MD5 hash. 479 // This map is only populated and used by raw instr profile reader. 480 AddrHashMap AddrToMD5Map; 481 482 AddrIntervalMap::Allocator VTableAddrMapAllocator; 483 // This map is only populated and used by raw instr profile reader. 484 AddrIntervalMap VTableAddrMap; 485 bool Sorted = false; 486 487 static StringRef getExternalSymbol() { return "** External Symbol **"; } 488 489 // Returns the canonial name of the given PGOName. In a canonical name, all 490 // suffixes that begins with "." except ".__uniq." are stripped. 491 // FIXME: Unify this with `FunctionSamples::getCanonicalFnName`. 492 static StringRef getCanonicalName(StringRef PGOName); 493 494 // Add the function into the symbol table, by creating the following 495 // map entries: 496 // name-set = {PGOFuncName} union {getCanonicalName(PGOFuncName)} 497 // - In MD5NameMap: <MD5Hash(name), name> for name in name-set 498 // - In MD5FuncMap: <MD5Hash(name), &F> for name in name-set 499 Error addFuncWithName(Function &F, StringRef PGOFuncName); 500 501 // Add the vtable into the symbol table, by creating the following 502 // map entries: 503 // name-set = {PGOName} union {getCanonicalName(PGOName)} 504 // - In MD5NameMap: <MD5Hash(name), name> for name in name-set 505 // - In MD5VTableMap: <MD5Hash(name), name> for name in name-set 506 Error addVTableWithName(GlobalVariable &V, StringRef PGOVTableName); 507 508 // If the symtab is created by a series of calls to \c addFuncName, \c 509 // finalizeSymtab needs to be called before looking up function names. 510 // This is required because the underlying map is a vector (for space 511 // efficiency) which needs to be sorted. 512 inline void finalizeSymtab(); 513 514 public: 515 InstrProfSymtab() : VTableAddrMap(VTableAddrMapAllocator) {} 516 517 // Not copyable or movable. 518 // Consider std::unique_ptr for move. 519 InstrProfSymtab(const InstrProfSymtab &) = delete; 520 InstrProfSymtab &operator=(const InstrProfSymtab &) = delete; 521 InstrProfSymtab(InstrProfSymtab &&) = delete; 522 InstrProfSymtab &operator=(InstrProfSymtab &&) = delete; 523 524 /// Create InstrProfSymtab from an object file section which 525 /// contains function PGO names. When section may contain raw 526 /// string data or string data in compressed form. This method 527 /// only initialize the symtab with reference to the data and 528 /// the section base address. The decompression will be delayed 529 /// until before it is used. See also \c create(StringRef) method. 530 Error create(object::SectionRef &Section); 531 532 /// \c NameStrings is a string composed of one of more sub-strings 533 /// encoded in the format described in \c collectPGOFuncNameStrings. 534 /// This method is a wrapper to \c readAndDecodeStrings method. 535 Error create(StringRef NameStrings); 536 537 /// Initialize symtab states with function names and vtable names. \c 538 /// FuncNameStrings is a string composed of one or more encoded function name 539 /// strings, and \c VTableNameStrings composes of one or more encoded vtable 540 /// names. This interface is solely used by raw profile reader. 541 Error create(StringRef FuncNameStrings, StringRef VTableNameStrings); 542 543 /// Initialize 'this' with the set of vtable names encoded in 544 /// \c CompressedVTableNames. 545 Error initVTableNamesFromCompressedStrings(StringRef CompressedVTableNames); 546 547 /// This interface is used by reader of CoverageMapping test 548 /// format. 549 inline Error create(StringRef D, uint64_t BaseAddr); 550 551 /// A wrapper interface to populate the PGO symtab with functions 552 /// decls from module \c M. This interface is used by transformation 553 /// passes such as indirect function call promotion. Variable \c InLTO 554 /// indicates if this is called from LTO optimization passes. 555 Error create(Module &M, bool InLTO = false); 556 557 /// Create InstrProfSymtab from a set of names iteratable from 558 /// \p IterRange. This interface is used by IndexedProfReader. 559 template <typename NameIterRange> 560 Error create(const NameIterRange &IterRange); 561 562 /// Create InstrProfSymtab from a set of function names and vtable 563 /// names iteratable from \p IterRange. This interface is used by 564 /// IndexedProfReader. 565 template <typename FuncNameIterRange, typename VTableNameIterRange> 566 Error create(const FuncNameIterRange &FuncIterRange, 567 const VTableNameIterRange &VTableIterRange); 568 569 // Map the MD5 of the symbol name to the name. 570 Error addSymbolName(StringRef SymbolName) { 571 if (SymbolName.empty()) 572 return make_error<InstrProfError>(instrprof_error::malformed, 573 "symbol name is empty"); 574 575 // Insert into NameTab so that MD5NameMap (a vector that will be sorted) 576 // won't have duplicated entries in the first place. 577 auto Ins = NameTab.insert(SymbolName); 578 if (Ins.second) { 579 MD5NameMap.push_back(std::make_pair( 580 IndexedInstrProf::ComputeHash(SymbolName), Ins.first->getKey())); 581 Sorted = false; 582 } 583 return Error::success(); 584 } 585 586 /// The method name is kept since there are many callers. 587 /// It just forwards to 'addSymbolName'. 588 Error addFuncName(StringRef FuncName) { return addSymbolName(FuncName); } 589 590 /// Adds VTableName as a known symbol, and inserts it to a map that 591 /// tracks all vtable names. 592 Error addVTableName(StringRef VTableName) { 593 if (Error E = addSymbolName(VTableName)) 594 return E; 595 596 // Record VTableName. InstrProfWriter uses this set. The comment around 597 // class member explains why. 598 VTableNames.insert(VTableName); 599 return Error::success(); 600 } 601 602 const StringSet<> &getVTableNames() const { return VTableNames; } 603 604 /// Map a function address to its name's MD5 hash. This interface 605 /// is only used by the raw profiler reader. 606 void mapAddress(uint64_t Addr, uint64_t MD5Val) { 607 AddrToMD5Map.push_back(std::make_pair(Addr, MD5Val)); 608 } 609 610 /// Map the address range (i.e., [start_address, end_address)) of a variable 611 /// to its names' MD5 hash. This interface is only used by the raw profile 612 /// reader. 613 void mapVTableAddress(uint64_t StartAddr, uint64_t EndAddr, uint64_t MD5Val) { 614 VTableAddrMap.insert(StartAddr, EndAddr, MD5Val); 615 } 616 617 /// Return a function's hash, or 0, if the function isn't in this SymTab. 618 uint64_t getFunctionHashFromAddress(uint64_t Address); 619 620 /// Return a vtable's hash, or 0 if the vtable doesn't exist in this SymTab. 621 uint64_t getVTableHashFromAddress(uint64_t Address); 622 623 /// Return function's PGO name from the function name's symbol 624 /// address in the object file. If an error occurs, return 625 /// an empty string. 626 StringRef getFuncName(uint64_t FuncNameAddress, size_t NameSize); 627 628 /// Return name of functions or global variables from the name's md5 hash 629 /// value. If not found, return an empty string. 630 inline StringRef getFuncOrVarName(uint64_t ValMD5Hash); 631 632 /// Just like getFuncOrVarName, except that it will return literal string 633 /// 'External Symbol' if the function or global variable is external to 634 /// this symbol table. 635 inline StringRef getFuncOrVarNameIfDefined(uint64_t ValMD5Hash); 636 637 /// True if Symbol is the value used to represent external symbols. 638 static bool isExternalSymbol(const StringRef &Symbol) { 639 return Symbol == InstrProfSymtab::getExternalSymbol(); 640 } 641 642 /// Return function from the name's md5 hash. Return nullptr if not found. 643 inline Function *getFunction(uint64_t FuncMD5Hash); 644 645 /// Return the global variable corresponding to md5 hash. Return nullptr if 646 /// not found. 647 inline GlobalVariable *getGlobalVariable(uint64_t MD5Hash); 648 649 /// Return the name section data. 650 inline StringRef getNameData() const { return Data; } 651 652 /// Dump the symbols in this table. 653 void dumpNames(raw_ostream &OS) const; 654 }; 655 656 Error InstrProfSymtab::create(StringRef D, uint64_t BaseAddr) { 657 Data = D; 658 Address = BaseAddr; 659 return Error::success(); 660 } 661 662 template <typename NameIterRange> 663 Error InstrProfSymtab::create(const NameIterRange &IterRange) { 664 for (auto Name : IterRange) 665 if (Error E = addFuncName(Name)) 666 return E; 667 668 finalizeSymtab(); 669 return Error::success(); 670 } 671 672 template <typename FuncNameIterRange, typename VTableNameIterRange> 673 Error InstrProfSymtab::create(const FuncNameIterRange &FuncIterRange, 674 const VTableNameIterRange &VTableIterRange) { 675 // Iterate elements by StringRef rather than by const reference. 676 // StringRef is small enough, so the loop is efficient whether 677 // element in the range is std::string or StringRef. 678 for (StringRef Name : FuncIterRange) 679 if (Error E = addFuncName(Name)) 680 return E; 681 682 for (StringRef VTableName : VTableIterRange) 683 if (Error E = addVTableName(VTableName)) 684 return E; 685 686 finalizeSymtab(); 687 return Error::success(); 688 } 689 690 void InstrProfSymtab::finalizeSymtab() { 691 if (Sorted) 692 return; 693 llvm::sort(MD5NameMap, less_first()); 694 llvm::sort(MD5FuncMap, less_first()); 695 llvm::sort(AddrToMD5Map, less_first()); 696 AddrToMD5Map.erase(llvm::unique(AddrToMD5Map), AddrToMD5Map.end()); 697 Sorted = true; 698 } 699 700 StringRef InstrProfSymtab::getFuncOrVarNameIfDefined(uint64_t MD5Hash) { 701 StringRef ret = getFuncOrVarName(MD5Hash); 702 if (ret.empty()) 703 return InstrProfSymtab::getExternalSymbol(); 704 return ret; 705 } 706 707 StringRef InstrProfSymtab::getFuncOrVarName(uint64_t MD5Hash) { 708 finalizeSymtab(); 709 auto Result = llvm::lower_bound(MD5NameMap, MD5Hash, 710 [](const std::pair<uint64_t, StringRef> &LHS, 711 uint64_t RHS) { return LHS.first < RHS; }); 712 if (Result != MD5NameMap.end() && Result->first == MD5Hash) 713 return Result->second; 714 return StringRef(); 715 } 716 717 Function* InstrProfSymtab::getFunction(uint64_t FuncMD5Hash) { 718 finalizeSymtab(); 719 auto Result = llvm::lower_bound(MD5FuncMap, FuncMD5Hash, 720 [](const std::pair<uint64_t, Function *> &LHS, 721 uint64_t RHS) { return LHS.first < RHS; }); 722 if (Result != MD5FuncMap.end() && Result->first == FuncMD5Hash) 723 return Result->second; 724 return nullptr; 725 } 726 727 GlobalVariable *InstrProfSymtab::getGlobalVariable(uint64_t MD5Hash) { 728 return MD5VTableMap.lookup(MD5Hash); 729 } 730 731 // To store the sums of profile count values, or the percentage of 732 // the sums of the total count values. 733 struct CountSumOrPercent { 734 uint64_t NumEntries = 0; 735 double CountSum = 0.0f; 736 std::array<double, IPVK_Last - IPVK_First + 1> ValueCounts = {}; 737 CountSumOrPercent() = default; 738 void reset() { 739 NumEntries = 0; 740 CountSum = 0.0f; 741 ValueCounts.fill(0.0f); 742 } 743 }; 744 745 // Function level or program level overlap information. 746 struct OverlapStats { 747 enum OverlapStatsLevel { ProgramLevel, FunctionLevel }; 748 // Sum of the total count values for the base profile. 749 CountSumOrPercent Base; 750 // Sum of the total count values for the test profile. 751 CountSumOrPercent Test; 752 // Overlap lap score. Should be in range of [0.0f to 1.0f]. 753 CountSumOrPercent Overlap; 754 CountSumOrPercent Mismatch; 755 CountSumOrPercent Unique; 756 OverlapStatsLevel Level; 757 const std::string *BaseFilename = nullptr; 758 const std::string *TestFilename = nullptr; 759 StringRef FuncName; 760 uint64_t FuncHash = 0; 761 bool Valid = false; 762 763 OverlapStats(OverlapStatsLevel L = ProgramLevel) : Level(L) {} 764 765 void dump(raw_fd_ostream &OS) const; 766 767 void setFuncInfo(StringRef Name, uint64_t Hash) { 768 FuncName = Name; 769 FuncHash = Hash; 770 } 771 772 Error accumulateCounts(const std::string &BaseFilename, 773 const std::string &TestFilename, bool IsCS); 774 void addOneMismatch(const CountSumOrPercent &MismatchFunc); 775 void addOneUnique(const CountSumOrPercent &UniqueFunc); 776 777 static inline double score(uint64_t Val1, uint64_t Val2, double Sum1, 778 double Sum2) { 779 if (Sum1 < 1.0f || Sum2 < 1.0f) 780 return 0.0f; 781 return std::min(Val1 / Sum1, Val2 / Sum2); 782 } 783 }; 784 785 // This is used to filter the functions whose overlap information 786 // to be output. 787 struct OverlapFuncFilters { 788 uint64_t ValueCutoff; 789 const std::string NameFilter; 790 }; 791 792 struct InstrProfValueSiteRecord { 793 /// Value profiling data pairs at a given value site. 794 std::vector<InstrProfValueData> ValueData; 795 796 InstrProfValueSiteRecord() = default; 797 InstrProfValueSiteRecord(std::vector<InstrProfValueData> &&VD) 798 : ValueData(VD) {} 799 800 /// Sort ValueData ascending by Value 801 void sortByTargetValues() { 802 llvm::sort(ValueData, 803 [](const InstrProfValueData &L, const InstrProfValueData &R) { 804 return L.Value < R.Value; 805 }); 806 } 807 /// Sort ValueData Descending by Count 808 inline void sortByCount(); 809 810 /// Merge data from another InstrProfValueSiteRecord 811 /// Optionally scale merged counts by \p Weight. 812 void merge(InstrProfValueSiteRecord &Input, uint64_t Weight, 813 function_ref<void(instrprof_error)> Warn); 814 /// Scale up value profile data counts by N (Numerator) / D (Denominator). 815 void scale(uint64_t N, uint64_t D, function_ref<void(instrprof_error)> Warn); 816 817 /// Compute the overlap b/w this record and Input record. 818 void overlap(InstrProfValueSiteRecord &Input, uint32_t ValueKind, 819 OverlapStats &Overlap, OverlapStats &FuncLevelOverlap); 820 }; 821 822 /// Profiling information for a single function. 823 struct InstrProfRecord { 824 std::vector<uint64_t> Counts; 825 std::vector<uint8_t> BitmapBytes; 826 827 InstrProfRecord() = default; 828 InstrProfRecord(std::vector<uint64_t> Counts) : Counts(std::move(Counts)) {} 829 InstrProfRecord(std::vector<uint64_t> Counts, 830 std::vector<uint8_t> BitmapBytes) 831 : Counts(std::move(Counts)), BitmapBytes(std::move(BitmapBytes)) {} 832 InstrProfRecord(InstrProfRecord &&) = default; 833 InstrProfRecord(const InstrProfRecord &RHS) 834 : Counts(RHS.Counts), BitmapBytes(RHS.BitmapBytes), 835 ValueData(RHS.ValueData 836 ? std::make_unique<ValueProfData>(*RHS.ValueData) 837 : nullptr) {} 838 InstrProfRecord &operator=(InstrProfRecord &&) = default; 839 InstrProfRecord &operator=(const InstrProfRecord &RHS) { 840 Counts = RHS.Counts; 841 BitmapBytes = RHS.BitmapBytes; 842 if (!RHS.ValueData) { 843 ValueData = nullptr; 844 return *this; 845 } 846 if (!ValueData) 847 ValueData = std::make_unique<ValueProfData>(*RHS.ValueData); 848 else 849 *ValueData = *RHS.ValueData; 850 return *this; 851 } 852 853 /// Return the number of value profile kinds with non-zero number 854 /// of profile sites. 855 inline uint32_t getNumValueKinds() const; 856 /// Return the number of instrumented sites for ValueKind. 857 inline uint32_t getNumValueSites(uint32_t ValueKind) const; 858 859 /// Return the total number of ValueData for ValueKind. 860 inline uint32_t getNumValueData(uint32_t ValueKind) const; 861 862 /// Return the array of profiled values at \p Site. 863 inline ArrayRef<InstrProfValueData> getValueArrayForSite(uint32_t ValueKind, 864 uint32_t Site) const; 865 866 /// Reserve space for NumValueSites sites. 867 inline void reserveSites(uint32_t ValueKind, uint32_t NumValueSites); 868 869 /// Add ValueData for ValueKind at value Site. We do not support adding sites 870 /// out of order. Site must go up from 0 one by one. 871 void addValueData(uint32_t ValueKind, uint32_t Site, 872 ArrayRef<InstrProfValueData> VData, 873 InstrProfSymtab *SymTab); 874 875 /// Merge the counts in \p Other into this one. 876 /// Optionally scale merged counts by \p Weight. 877 void merge(InstrProfRecord &Other, uint64_t Weight, 878 function_ref<void(instrprof_error)> Warn); 879 880 /// Scale up profile counts (including value profile data) by 881 /// a factor of (N / D). 882 void scale(uint64_t N, uint64_t D, function_ref<void(instrprof_error)> Warn); 883 884 /// Sort value profile data (per site) by count. 885 void sortValueData() { 886 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) 887 for (auto &SR : getValueSitesForKind(Kind)) 888 SR.sortByCount(); 889 } 890 891 /// Clear value data entries and edge counters. 892 void Clear() { 893 Counts.clear(); 894 clearValueData(); 895 } 896 897 /// Clear value data entries 898 void clearValueData() { ValueData = nullptr; } 899 900 /// Compute the sums of all counts and store in Sum. 901 void accumulateCounts(CountSumOrPercent &Sum) const; 902 903 /// Compute the overlap b/w this IntrprofRecord and Other. 904 void overlap(InstrProfRecord &Other, OverlapStats &Overlap, 905 OverlapStats &FuncLevelOverlap, uint64_t ValueCutoff); 906 907 /// Compute the overlap of value profile counts. 908 void overlapValueProfData(uint32_t ValueKind, InstrProfRecord &Src, 909 OverlapStats &Overlap, 910 OverlapStats &FuncLevelOverlap); 911 912 enum CountPseudoKind { 913 NotPseudo = 0, 914 PseudoHot, 915 PseudoWarm, 916 }; 917 enum PseudoCountVal { 918 HotFunctionVal = -1, 919 WarmFunctionVal = -2, 920 }; 921 CountPseudoKind getCountPseudoKind() const { 922 uint64_t FirstCount = Counts[0]; 923 if (FirstCount == (uint64_t)HotFunctionVal) 924 return PseudoHot; 925 if (FirstCount == (uint64_t)WarmFunctionVal) 926 return PseudoWarm; 927 return NotPseudo; 928 } 929 void setPseudoCount(CountPseudoKind Kind) { 930 if (Kind == PseudoHot) 931 Counts[0] = (uint64_t)HotFunctionVal; 932 else if (Kind == PseudoWarm) 933 Counts[0] = (uint64_t)WarmFunctionVal; 934 } 935 936 private: 937 using ValueProfData = std::array<std::vector<InstrProfValueSiteRecord>, 938 IPVK_Last - IPVK_First + 1>; 939 std::unique_ptr<ValueProfData> ValueData; 940 941 MutableArrayRef<InstrProfValueSiteRecord> 942 getValueSitesForKind(uint32_t ValueKind) { 943 // Cast to /add/ const (should be an implicit_cast, ideally, if that's ever 944 // implemented in LLVM) to call the const overload of this function, then 945 // cast away the constness from the result. 946 auto AR = const_cast<const InstrProfRecord *>(this)->getValueSitesForKind( 947 ValueKind); 948 return MutableArrayRef( 949 const_cast<InstrProfValueSiteRecord *>(AR.data()), AR.size()); 950 } 951 ArrayRef<InstrProfValueSiteRecord> 952 getValueSitesForKind(uint32_t ValueKind) const { 953 if (!ValueData) 954 return std::nullopt; 955 assert(IPVK_First <= ValueKind && ValueKind <= IPVK_Last && 956 "Unknown value kind!"); 957 return (*ValueData)[ValueKind - IPVK_First]; 958 } 959 960 std::vector<InstrProfValueSiteRecord> & 961 getOrCreateValueSitesForKind(uint32_t ValueKind) { 962 if (!ValueData) 963 ValueData = std::make_unique<ValueProfData>(); 964 assert(IPVK_First <= ValueKind && ValueKind <= IPVK_Last && 965 "Unknown value kind!"); 966 return (*ValueData)[ValueKind - IPVK_First]; 967 } 968 969 // Map indirect call target name hash to name string. 970 uint64_t remapValue(uint64_t Value, uint32_t ValueKind, 971 InstrProfSymtab *SymTab); 972 973 // Merge Value Profile data from Src record to this record for ValueKind. 974 // Scale merged value counts by \p Weight. 975 void mergeValueProfData(uint32_t ValkeKind, InstrProfRecord &Src, 976 uint64_t Weight, 977 function_ref<void(instrprof_error)> Warn); 978 979 // Scale up value profile data count by N (Numerator) / D (Denominator). 980 void scaleValueProfData(uint32_t ValueKind, uint64_t N, uint64_t D, 981 function_ref<void(instrprof_error)> Warn); 982 }; 983 984 struct NamedInstrProfRecord : InstrProfRecord { 985 StringRef Name; 986 uint64_t Hash; 987 988 // We reserve this bit as the flag for context sensitive profile record. 989 static const int CS_FLAG_IN_FUNC_HASH = 60; 990 991 NamedInstrProfRecord() = default; 992 NamedInstrProfRecord(StringRef Name, uint64_t Hash, 993 std::vector<uint64_t> Counts) 994 : InstrProfRecord(std::move(Counts)), Name(Name), Hash(Hash) {} 995 NamedInstrProfRecord(StringRef Name, uint64_t Hash, 996 std::vector<uint64_t> Counts, 997 std::vector<uint8_t> BitmapBytes) 998 : InstrProfRecord(std::move(Counts), std::move(BitmapBytes)), Name(Name), 999 Hash(Hash) {} 1000 1001 static bool hasCSFlagInHash(uint64_t FuncHash) { 1002 return ((FuncHash >> CS_FLAG_IN_FUNC_HASH) & 1); 1003 } 1004 static void setCSFlagInHash(uint64_t &FuncHash) { 1005 FuncHash |= ((uint64_t)1 << CS_FLAG_IN_FUNC_HASH); 1006 } 1007 }; 1008 1009 uint32_t InstrProfRecord::getNumValueKinds() const { 1010 uint32_t NumValueKinds = 0; 1011 for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) 1012 NumValueKinds += !(getValueSitesForKind(Kind).empty()); 1013 return NumValueKinds; 1014 } 1015 1016 uint32_t InstrProfRecord::getNumValueData(uint32_t ValueKind) const { 1017 uint32_t N = 0; 1018 for (const auto &SR : getValueSitesForKind(ValueKind)) 1019 N += SR.ValueData.size(); 1020 return N; 1021 } 1022 1023 uint32_t InstrProfRecord::getNumValueSites(uint32_t ValueKind) const { 1024 return getValueSitesForKind(ValueKind).size(); 1025 } 1026 1027 ArrayRef<InstrProfValueData> 1028 InstrProfRecord::getValueArrayForSite(uint32_t ValueKind, uint32_t Site) const { 1029 return getValueSitesForKind(ValueKind)[Site].ValueData; 1030 } 1031 1032 void InstrProfRecord::reserveSites(uint32_t ValueKind, uint32_t NumValueSites) { 1033 if (!NumValueSites) 1034 return; 1035 getOrCreateValueSitesForKind(ValueKind).reserve(NumValueSites); 1036 } 1037 1038 // Include definitions for value profile data 1039 #define INSTR_PROF_VALUE_PROF_DATA 1040 #include "llvm/ProfileData/InstrProfData.inc" 1041 1042 void InstrProfValueSiteRecord::sortByCount() { 1043 llvm::stable_sort( 1044 ValueData, [](const InstrProfValueData &L, const InstrProfValueData &R) { 1045 return L.Count > R.Count; 1046 }); 1047 // Now truncate 1048 size_t max_s = INSTR_PROF_MAX_NUM_VAL_PER_SITE; 1049 if (ValueData.size() > max_s) 1050 ValueData.resize(max_s); 1051 } 1052 1053 namespace IndexedInstrProf { 1054 1055 enum class HashT : uint32_t { 1056 MD5, 1057 Last = MD5 1058 }; 1059 1060 inline uint64_t ComputeHash(HashT Type, StringRef K) { 1061 switch (Type) { 1062 case HashT::MD5: 1063 return MD5Hash(K); 1064 } 1065 llvm_unreachable("Unhandled hash type"); 1066 } 1067 1068 const uint64_t Magic = 0x8169666f72706cff; // "\xfflprofi\x81" 1069 1070 enum ProfVersion { 1071 // Version 1 is the first version. In this version, the value of 1072 // a key/value pair can only include profile data of a single function. 1073 // Due to this restriction, the number of block counters for a given 1074 // function is not recorded but derived from the length of the value. 1075 Version1 = 1, 1076 // The version 2 format supports recording profile data of multiple 1077 // functions which share the same key in one value field. To support this, 1078 // the number block counters is recorded as an uint64_t field right after the 1079 // function structural hash. 1080 Version2 = 2, 1081 // Version 3 supports value profile data. The value profile data is expected 1082 // to follow the block counter profile data. 1083 Version3 = 3, 1084 // In this version, profile summary data \c IndexedInstrProf::Summary is 1085 // stored after the profile header. 1086 Version4 = 4, 1087 // In this version, the frontend PGO stable hash algorithm defaults to V2. 1088 Version5 = 5, 1089 // In this version, the frontend PGO stable hash algorithm got fixed and 1090 // may produce hashes different from Version5. 1091 Version6 = 6, 1092 // An additional counter is added around logical operators. 1093 Version7 = 7, 1094 // An additional (optional) memory profile type is added. 1095 Version8 = 8, 1096 // Binary ids are added. 1097 Version9 = 9, 1098 // An additional (optional) temporal profile traces section is added. 1099 Version10 = 10, 1100 // An additional field is used for bitmap bytes. 1101 Version11 = 11, 1102 // VTable profiling, decision record and bitmap are modified for mcdc. 1103 Version12 = 12, 1104 // The current version is 12. 1105 CurrentVersion = INSTR_PROF_INDEX_VERSION 1106 }; 1107 const uint64_t Version = ProfVersion::CurrentVersion; 1108 1109 const HashT HashType = HashT::MD5; 1110 1111 inline uint64_t ComputeHash(StringRef K) { return ComputeHash(HashType, K); } 1112 1113 // This structure defines the file header of the LLVM profile 1114 // data file in indexed-format. Please update llvm/docs/InstrProfileFormat.rst 1115 // as appropriate when updating the indexed profile format. 1116 struct Header { 1117 uint64_t Magic = IndexedInstrProf::Magic; 1118 // The lower 32 bits specify the version of the indexed profile. 1119 // The most significant 32 bits are reserved to specify the variant types of 1120 // the profile. 1121 uint64_t Version = 0; 1122 uint64_t Unused = 0; // Becomes unused since version 4 1123 uint64_t HashType = static_cast<uint64_t>(IndexedInstrProf::HashType); 1124 // This field records the offset of this hash table's metadata (i.e., the 1125 // number of buckets and entries), which follows right after the payload of 1126 // the entire hash table. 1127 uint64_t HashOffset = 0; 1128 uint64_t MemProfOffset = 0; 1129 uint64_t BinaryIdOffset = 0; 1130 uint64_t TemporalProfTracesOffset = 0; 1131 uint64_t VTableNamesOffset = 0; 1132 // New fields should only be added at the end to ensure that the size 1133 // computation is correct. The methods below need to be updated to ensure that 1134 // the new field is read correctly. 1135 1136 // Reads a header struct from the buffer. Header fields are in machine native 1137 // endianness. 1138 static Expected<Header> readFromBuffer(const unsigned char *Buffer); 1139 1140 // Returns the size of the header in bytes for all valid fields based on the 1141 // version. I.e a older version header will return a smaller size. 1142 size_t size() const; 1143 1144 // Return the indexed profile version, i.e., the least significant 32 bits 1145 // in Header.Version. 1146 uint64_t getIndexedProfileVersion() const; 1147 }; 1148 1149 // Profile summary data recorded in the profile data file in indexed 1150 // format. It is introduced in version 4. The summary data follows 1151 // right after the profile file header. 1152 struct Summary { 1153 struct Entry { 1154 uint64_t Cutoff; ///< The required percentile of total execution count. 1155 uint64_t 1156 MinBlockCount; ///< The minimum execution count for this percentile. 1157 uint64_t NumBlocks; ///< Number of blocks >= the minumum execution count. 1158 }; 1159 // The field kind enumerator to assigned value mapping should remain 1160 // unchanged when a new kind is added or an old kind gets deleted in 1161 // the future. 1162 enum SummaryFieldKind { 1163 /// The total number of functions instrumented. 1164 TotalNumFunctions = 0, 1165 /// Total number of instrumented blocks/edges. 1166 TotalNumBlocks = 1, 1167 /// The maximal execution count among all functions. 1168 /// This field does not exist for profile data from IR based 1169 /// instrumentation. 1170 MaxFunctionCount = 2, 1171 /// Max block count of the program. 1172 MaxBlockCount = 3, 1173 /// Max internal block count of the program (excluding entry blocks). 1174 MaxInternalBlockCount = 4, 1175 /// The sum of all instrumented block counts. 1176 TotalBlockCount = 5, 1177 NumKinds = TotalBlockCount + 1 1178 }; 1179 1180 // The number of summmary fields following the summary header. 1181 uint64_t NumSummaryFields; 1182 // The number of Cutoff Entries (Summary::Entry) following summary fields. 1183 uint64_t NumCutoffEntries; 1184 1185 Summary() = delete; 1186 Summary(uint32_t Size) { memset(this, 0, Size); } 1187 1188 void operator delete(void *ptr) { ::operator delete(ptr); } 1189 1190 static uint32_t getSize(uint32_t NumSumFields, uint32_t NumCutoffEntries) { 1191 return sizeof(Summary) + NumCutoffEntries * sizeof(Entry) + 1192 NumSumFields * sizeof(uint64_t); 1193 } 1194 1195 const uint64_t *getSummaryDataBase() const { 1196 return reinterpret_cast<const uint64_t *>(this + 1); 1197 } 1198 1199 uint64_t *getSummaryDataBase() { 1200 return reinterpret_cast<uint64_t *>(this + 1); 1201 } 1202 1203 const Entry *getCutoffEntryBase() const { 1204 return reinterpret_cast<const Entry *>( 1205 &getSummaryDataBase()[NumSummaryFields]); 1206 } 1207 1208 Entry *getCutoffEntryBase() { 1209 return reinterpret_cast<Entry *>(&getSummaryDataBase()[NumSummaryFields]); 1210 } 1211 1212 uint64_t get(SummaryFieldKind K) const { 1213 return getSummaryDataBase()[K]; 1214 } 1215 1216 void set(SummaryFieldKind K, uint64_t V) { 1217 getSummaryDataBase()[K] = V; 1218 } 1219 1220 const Entry &getEntry(uint32_t I) const { return getCutoffEntryBase()[I]; } 1221 1222 void setEntry(uint32_t I, const ProfileSummaryEntry &E) { 1223 Entry &ER = getCutoffEntryBase()[I]; 1224 ER.Cutoff = E.Cutoff; 1225 ER.MinBlockCount = E.MinCount; 1226 ER.NumBlocks = E.NumCounts; 1227 } 1228 }; 1229 1230 inline std::unique_ptr<Summary> allocSummary(uint32_t TotalSize) { 1231 return std::unique_ptr<Summary>(new (::operator new(TotalSize)) 1232 Summary(TotalSize)); 1233 } 1234 1235 } // end namespace IndexedInstrProf 1236 1237 namespace RawInstrProf { 1238 1239 // Version 1: First version 1240 // Version 2: Added value profile data section. Per-function control data 1241 // struct has more fields to describe value profile information. 1242 // Version 3: Compressed name section support. Function PGO name reference 1243 // from control data struct is changed from raw pointer to Name's MD5 value. 1244 // Version 4: ValueDataBegin and ValueDataSizes fields are removed from the 1245 // raw header. 1246 // Version 5: Bit 60 of FuncHash is reserved for the flag for the context 1247 // sensitive records. 1248 // Version 6: Added binary id. 1249 // Version 7: Reorder binary id and include version in signature. 1250 // Version 8: Use relative counter pointer. 1251 // Version 9: Added relative bitmap bytes pointer and count used by MC/DC. 1252 // Version 10: Added vtable, a new type of value profile data. 1253 const uint64_t Version = INSTR_PROF_RAW_VERSION; 1254 1255 template <class IntPtrT> inline uint64_t getMagic(); 1256 template <> inline uint64_t getMagic<uint64_t>() { 1257 return INSTR_PROF_RAW_MAGIC_64; 1258 } 1259 1260 template <> inline uint64_t getMagic<uint32_t>() { 1261 return INSTR_PROF_RAW_MAGIC_32; 1262 } 1263 1264 // Per-function profile data header/control structure. 1265 // The definition should match the structure defined in 1266 // compiler-rt/lib/profile/InstrProfiling.h. 1267 // It should also match the synthesized type in 1268 // Transforms/Instrumentation/InstrProfiling.cpp:getOrCreateRegionCounters. 1269 template <class IntPtrT> struct alignas(8) ProfileData { 1270 #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Type Name; 1271 #include "llvm/ProfileData/InstrProfData.inc" 1272 }; 1273 1274 template <class IntPtrT> struct alignas(8) VTableProfileData { 1275 #define INSTR_PROF_VTABLE_DATA(Type, LLVMType, Name, Init) Type Name; 1276 #include "llvm/ProfileData/InstrProfData.inc" 1277 }; 1278 1279 // File header structure of the LLVM profile data in raw format. 1280 // The definition should match the header referenced in 1281 // compiler-rt/lib/profile/InstrProfilingFile.c and 1282 // InstrProfilingBuffer.c. 1283 struct Header { 1284 #define INSTR_PROF_RAW_HEADER(Type, Name, Init) const Type Name; 1285 #include "llvm/ProfileData/InstrProfData.inc" 1286 }; 1287 1288 } // end namespace RawInstrProf 1289 1290 // Create the variable for the profile file name. 1291 void createProfileFileNameVar(Module &M, StringRef InstrProfileOutput); 1292 1293 // Whether to compress function names in profile records, and filenames in 1294 // code coverage mappings. Used by the Instrumentation library and unit tests. 1295 extern cl::opt<bool> DoInstrProfNameCompression; 1296 1297 } // end namespace llvm 1298 #endif // LLVM_PROFILEDATA_INSTRPROF_H 1299