1 //===- InstrProf.cpp - Instrumented profiling format support --------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains support for clang's instrumentation based PGO and
13 //===----------------------------------------------------------------------===//
15 #include "llvm/ProfileData/InstrProf.h"
16 #include "llvm/ADT/ArrayRef.h"
17 #include "llvm/ADT/SmallString.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringExtras.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/ADT/Triple.h"
22 #include "llvm/IR/Constant.h"
23 #include "llvm/IR/Constants.h"
24 #include "llvm/IR/Function.h"
25 #include "llvm/IR/GlobalValue.h"
26 #include "llvm/IR/GlobalVariable.h"
27 #include "llvm/IR/Instruction.h"
28 #include "llvm/IR/LLVMContext.h"
29 #include "llvm/IR/MDBuilder.h"
30 #include "llvm/IR/Metadata.h"
31 #include "llvm/IR/Module.h"
32 #include "llvm/IR/Type.h"
33 #include "llvm/Support/Casting.h"
34 #include "llvm/Support/CommandLine.h"
35 #include "llvm/Support/Compiler.h"
36 #include "llvm/Support/Compression.h"
37 #include "llvm/Support/Endian.h"
38 #include "llvm/Support/Error.h"
39 #include "llvm/Support/ErrorHandling.h"
40 #include "llvm/Support/LEB128.h"
41 #include "llvm/Support/ManagedStatic.h"
42 #include "llvm/Support/MathExtras.h"
43 #include "llvm/Support/Path.h"
44 #include "llvm/Support/SwapByteOrder.h"
52 #include <system_error>
58 static cl::opt
<bool> StaticFuncFullModulePrefix(
59 "static-func-full-module-prefix", cl::init(true), cl::Hidden
,
60 cl::desc("Use full module build paths in the profile counter names for "
61 "static functions."));
63 // This option is tailored to users that have different top-level directory in
64 // profile-gen and profile-use compilation. Users need to specific the number
65 // of levels to strip. A value larger than the number of directories in the
66 // source file will strip all the directory names and only leave the basename.
68 // Note current ThinLTO module importing for the indirect-calls assumes
69 // the source directory name not being stripped. A non-zero option value here
70 // can potentially prevent some inter-module indirect-call-promotions.
71 static cl::opt
<unsigned> StaticFuncStripDirNamePrefix(
72 "static-func-strip-dirname-prefix", cl::init(0), cl::Hidden
,
73 cl::desc("Strip specified level of directory name from source path in "
74 "the profile counter name for static functions."));
76 static std::string
getInstrProfErrString(instrprof_error Err
) {
78 case instrprof_error::success
:
80 case instrprof_error::eof
:
82 case instrprof_error::unrecognized_format
:
83 return "Unrecognized instrumentation profile encoding format";
84 case instrprof_error::bad_magic
:
85 return "Invalid instrumentation profile data (bad magic)";
86 case instrprof_error::bad_header
:
87 return "Invalid instrumentation profile data (file header is corrupt)";
88 case instrprof_error::unsupported_version
:
89 return "Unsupported instrumentation profile format version";
90 case instrprof_error::unsupported_hash_type
:
91 return "Unsupported instrumentation profile hash type";
92 case instrprof_error::too_large
:
93 return "Too much profile data";
94 case instrprof_error::truncated
:
95 return "Truncated profile data";
96 case instrprof_error::malformed
:
97 return "Malformed instrumentation profile data";
98 case instrprof_error::unknown_function
:
99 return "No profile data available for function";
100 case instrprof_error::hash_mismatch
:
101 return "Function control flow change detected (hash mismatch)";
102 case instrprof_error::count_mismatch
:
103 return "Function basic block count change detected (counter mismatch)";
104 case instrprof_error::counter_overflow
:
105 return "Counter overflow";
106 case instrprof_error::value_site_count_mismatch
:
107 return "Function value site count change detected (counter mismatch)";
108 case instrprof_error::compress_failed
:
109 return "Failed to compress data (zlib)";
110 case instrprof_error::uncompress_failed
:
111 return "Failed to uncompress data (zlib)";
112 case instrprof_error::empty_raw_profile
:
113 return "Empty raw profile file";
114 case instrprof_error::zlib_unavailable
:
115 return "Profile uses zlib compression but the profile reader was built without zlib support";
117 llvm_unreachable("A value of instrprof_error has no message.");
122 // FIXME: This class is only here to support the transition to llvm::Error. It
123 // will be removed once this transition is complete. Clients should prefer to
124 // deal with the Error value directly, rather than converting to error_code.
125 class InstrProfErrorCategoryType
: public std::error_category
{
126 const char *name() const noexcept override
{ return "llvm.instrprof"; }
128 std::string
message(int IE
) const override
{
129 return getInstrProfErrString(static_cast<instrprof_error
>(IE
));
133 } // end anonymous namespace
135 static ManagedStatic
<InstrProfErrorCategoryType
> ErrorCategory
;
137 const std::error_category
&llvm::instrprof_category() {
138 return *ErrorCategory
;
143 const char *InstrProfSectNameCommon
[] = {
144 #define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
146 #include "llvm/ProfileData/InstrProfData.inc"
149 const char *InstrProfSectNameCoff
[] = {
150 #define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
152 #include "llvm/ProfileData/InstrProfData.inc"
155 const char *InstrProfSectNamePrefix
[] = {
156 #define INSTR_PROF_SECT_ENTRY(Kind, SectNameCommon, SectNameCoff, Prefix) \
158 #include "llvm/ProfileData/InstrProfData.inc"
165 std::string
getInstrProfSectionName(InstrProfSectKind IPSK
,
166 Triple::ObjectFormatType OF
,
167 bool AddSegmentInfo
) {
168 std::string SectName
;
170 if (OF
== Triple::MachO
&& AddSegmentInfo
)
171 SectName
= InstrProfSectNamePrefix
[IPSK
];
173 if (OF
== Triple::COFF
)
174 SectName
+= InstrProfSectNameCoff
[IPSK
];
176 SectName
+= InstrProfSectNameCommon
[IPSK
];
178 if (OF
== Triple::MachO
&& IPSK
== IPSK_data
&& AddSegmentInfo
)
179 SectName
+= ",regular,live_support";
184 void SoftInstrProfErrors::addError(instrprof_error IE
) {
185 if (IE
== instrprof_error::success
)
188 if (FirstError
== instrprof_error::success
)
192 case instrprof_error::hash_mismatch
:
195 case instrprof_error::count_mismatch
:
196 ++NumCountMismatches
;
198 case instrprof_error::counter_overflow
:
199 ++NumCounterOverflows
;
201 case instrprof_error::value_site_count_mismatch
:
202 ++NumValueSiteCountMismatches
;
205 llvm_unreachable("Not a soft error");
209 std::string
InstrProfError::message() const {
210 return getInstrProfErrString(Err
);
213 char InstrProfError::ID
= 0;
215 std::string
getPGOFuncName(StringRef RawFuncName
,
216 GlobalValue::LinkageTypes Linkage
,
218 uint64_t Version LLVM_ATTRIBUTE_UNUSED
) {
219 return GlobalValue::getGlobalIdentifier(RawFuncName
, Linkage
, FileName
);
222 // Strip NumPrefix level of directory name from PathNameStr. If the number of
223 // directory separators is less than NumPrefix, strip all the directories and
224 // leave base file name only.
225 static StringRef
stripDirPrefix(StringRef PathNameStr
, uint32_t NumPrefix
) {
226 uint32_t Count
= NumPrefix
;
227 uint32_t Pos
= 0, LastPos
= 0;
228 for (auto & CI
: PathNameStr
) {
230 if (llvm::sys::path::is_separator(CI
)) {
237 return PathNameStr
.substr(LastPos
);
240 // Return the PGOFuncName. This function has some special handling when called
241 // in LTO optimization. The following only applies when calling in LTO passes
242 // (when \c InLTO is true): LTO's internalization privatizes many global linkage
243 // symbols. This happens after value profile annotation, but those internal
244 // linkage functions should not have a source prefix.
245 // Additionally, for ThinLTO mode, exported internal functions are promoted
246 // and renamed. We need to ensure that the original internal PGO name is
247 // used when computing the GUID that is compared against the profiled GUIDs.
248 // To differentiate compiler generated internal symbols from original ones,
249 // PGOFuncName meta data are created and attached to the original internal
250 // symbols in the value profile annotation step
251 // (PGOUseFunc::annotateIndirectCallSites). If a symbol does not have the meta
252 // data, its original linkage must be non-internal.
253 std::string
getPGOFuncName(const Function
&F
, bool InLTO
, uint64_t Version
) {
255 StringRef FileName
= (StaticFuncFullModulePrefix
256 ? F
.getParent()->getName()
257 : sys::path::filename(F
.getParent()->getName()));
258 if (StaticFuncFullModulePrefix
&& StaticFuncStripDirNamePrefix
!= 0)
259 FileName
= stripDirPrefix(FileName
, StaticFuncStripDirNamePrefix
);
260 return getPGOFuncName(F
.getName(), F
.getLinkage(), FileName
, Version
);
263 // In LTO mode (when InLTO is true), first check if there is a meta data.
264 if (MDNode
*MD
= getPGOFuncNameMetadata(F
)) {
265 StringRef S
= cast
<MDString
>(MD
->getOperand(0))->getString();
269 // If there is no meta data, the function must be a global before the value
270 // profile annotation pass. Its current linkage may be internal if it is
271 // internalized in LTO mode.
272 return getPGOFuncName(F
.getName(), GlobalValue::ExternalLinkage
, "");
275 StringRef
getFuncNameWithoutPrefix(StringRef PGOFuncName
, StringRef FileName
) {
276 if (FileName
.empty())
278 // Drop the file name including ':'. See also getPGOFuncName.
279 if (PGOFuncName
.startswith(FileName
))
280 PGOFuncName
= PGOFuncName
.drop_front(FileName
.size() + 1);
284 // \p FuncName is the string used as profile lookup key for the function. A
285 // symbol is created to hold the name. Return the legalized symbol name.
286 std::string
getPGOFuncNameVarName(StringRef FuncName
,
287 GlobalValue::LinkageTypes Linkage
) {
288 std::string VarName
= getInstrProfNameVarPrefix();
291 if (!GlobalValue::isLocalLinkage(Linkage
))
294 // Now fix up illegal chars in local VarName that may upset the assembler.
295 const char *InvalidChars
= "-:<>/\"'";
296 size_t found
= VarName
.find_first_of(InvalidChars
);
297 while (found
!= std::string::npos
) {
298 VarName
[found
] = '_';
299 found
= VarName
.find_first_of(InvalidChars
, found
+ 1);
304 GlobalVariable
*createPGOFuncNameVar(Module
&M
,
305 GlobalValue::LinkageTypes Linkage
,
306 StringRef PGOFuncName
) {
307 // We generally want to match the function's linkage, but available_externally
308 // and extern_weak both have the wrong semantics, and anything that doesn't
309 // need to link across compilation units doesn't need to be visible at all.
310 if (Linkage
== GlobalValue::ExternalWeakLinkage
)
311 Linkage
= GlobalValue::LinkOnceAnyLinkage
;
312 else if (Linkage
== GlobalValue::AvailableExternallyLinkage
)
313 Linkage
= GlobalValue::LinkOnceODRLinkage
;
314 else if (Linkage
== GlobalValue::InternalLinkage
||
315 Linkage
== GlobalValue::ExternalLinkage
)
316 Linkage
= GlobalValue::PrivateLinkage
;
319 ConstantDataArray::getString(M
.getContext(), PGOFuncName
, false);
321 new GlobalVariable(M
, Value
->getType(), true, Linkage
, Value
,
322 getPGOFuncNameVarName(PGOFuncName
, Linkage
));
324 // Hide the symbol so that we correctly get a copy for each executable.
325 if (!GlobalValue::isLocalLinkage(FuncNameVar
->getLinkage()))
326 FuncNameVar
->setVisibility(GlobalValue::HiddenVisibility
);
331 GlobalVariable
*createPGOFuncNameVar(Function
&F
, StringRef PGOFuncName
) {
332 return createPGOFuncNameVar(*F
.getParent(), F
.getLinkage(), PGOFuncName
);
335 Error
InstrProfSymtab::create(Module
&M
, bool InLTO
) {
336 for (Function
&F
: M
) {
337 // Function may not have a name: like using asm("") to overwrite the name.
338 // Ignore in this case.
341 const std::string
&PGOFuncName
= getPGOFuncName(F
, InLTO
);
342 if (Error E
= addFuncName(PGOFuncName
))
344 MD5FuncMap
.emplace_back(Function::getGUID(PGOFuncName
), &F
);
345 // In ThinLTO, local function may have been promoted to global and have
346 // suffix added to the function name. We need to add the stripped function
347 // name to the symbol table so that we can find a match from profile.
349 auto pos
= PGOFuncName
.find('.');
350 if (pos
!= std::string::npos
) {
351 const std::string
&OtherFuncName
= PGOFuncName
.substr(0, pos
);
352 if (Error E
= addFuncName(OtherFuncName
))
354 MD5FuncMap
.emplace_back(Function::getGUID(OtherFuncName
), &F
);
360 return Error::success();
363 uint64_t InstrProfSymtab::getFunctionHashFromAddress(uint64_t Address
) {
366 std::lower_bound(AddrToMD5Map
.begin(), AddrToMD5Map
.end(), Address
,
367 [](const std::pair
<uint64_t, uint64_t> &LHS
,
368 uint64_t RHS
) { return LHS
.first
< RHS
; });
369 // Raw function pointer collected by value profiler may be from
370 // external functions that are not instrumented. They won't have
371 // mapping data to be used by the deserializer. Force the value to
372 // be 0 in this case.
373 if (Result
!= AddrToMD5Map
.end() && Result
->first
== Address
)
374 return (uint64_t)Result
->second
;
378 Error
collectPGOFuncNameStrings(ArrayRef
<std::string
> NameStrs
,
379 bool doCompression
, std::string
&Result
) {
380 assert(!NameStrs
.empty() && "No name data to emit");
382 uint8_t Header
[16], *P
= Header
;
383 std::string UncompressedNameStrings
=
384 join(NameStrs
.begin(), NameStrs
.end(), getInstrProfNameSeparator());
386 assert(StringRef(UncompressedNameStrings
)
387 .count(getInstrProfNameSeparator()) == (NameStrs
.size() - 1) &&
388 "PGO name is invalid (contains separator token)");
390 unsigned EncLen
= encodeULEB128(UncompressedNameStrings
.length(), P
);
393 auto WriteStringToResult
= [&](size_t CompressedLen
, StringRef InputStr
) {
394 EncLen
= encodeULEB128(CompressedLen
, P
);
396 char *HeaderStr
= reinterpret_cast<char *>(&Header
[0]);
397 unsigned HeaderLen
= P
- &Header
[0];
398 Result
.append(HeaderStr
, HeaderLen
);
400 return Error::success();
403 if (!doCompression
) {
404 return WriteStringToResult(0, UncompressedNameStrings
);
407 SmallString
<128> CompressedNameStrings
;
408 Error E
= zlib::compress(StringRef(UncompressedNameStrings
),
409 CompressedNameStrings
, zlib::BestSizeCompression
);
411 consumeError(std::move(E
));
412 return make_error
<InstrProfError
>(instrprof_error::compress_failed
);
415 return WriteStringToResult(CompressedNameStrings
.size(),
416 CompressedNameStrings
);
419 StringRef
getPGOFuncNameVarInitializer(GlobalVariable
*NameVar
) {
420 auto *Arr
= cast
<ConstantDataArray
>(NameVar
->getInitializer());
422 Arr
->isCString() ? Arr
->getAsCString() : Arr
->getAsString();
426 Error
collectPGOFuncNameStrings(ArrayRef
<GlobalVariable
*> NameVars
,
427 std::string
&Result
, bool doCompression
) {
428 std::vector
<std::string
> NameStrs
;
429 for (auto *NameVar
: NameVars
) {
430 NameStrs
.push_back(getPGOFuncNameVarInitializer(NameVar
));
432 return collectPGOFuncNameStrings(
433 NameStrs
, zlib::isAvailable() && doCompression
, Result
);
436 Error
readPGOFuncNameStrings(StringRef NameStrings
, InstrProfSymtab
&Symtab
) {
437 const uint8_t *P
= reinterpret_cast<const uint8_t *>(NameStrings
.data());
438 const uint8_t *EndP
= reinterpret_cast<const uint8_t *>(NameStrings
.data() +
442 uint64_t UncompressedSize
= decodeULEB128(P
, &N
);
444 uint64_t CompressedSize
= decodeULEB128(P
, &N
);
446 bool isCompressed
= (CompressedSize
!= 0);
447 SmallString
<128> UncompressedNameStrings
;
448 StringRef NameStrings
;
450 if (!llvm::zlib::isAvailable())
451 return make_error
<InstrProfError
>(instrprof_error::zlib_unavailable
);
453 StringRef
CompressedNameStrings(reinterpret_cast<const char *>(P
),
456 zlib::uncompress(CompressedNameStrings
, UncompressedNameStrings
,
458 consumeError(std::move(E
));
459 return make_error
<InstrProfError
>(instrprof_error::uncompress_failed
);
462 NameStrings
= StringRef(UncompressedNameStrings
.data(),
463 UncompressedNameStrings
.size());
466 StringRef(reinterpret_cast<const char *>(P
), UncompressedSize
);
467 P
+= UncompressedSize
;
469 // Now parse the name strings.
470 SmallVector
<StringRef
, 0> Names
;
471 NameStrings
.split(Names
, getInstrProfNameSeparator());
472 for (StringRef
&Name
: Names
)
473 if (Error E
= Symtab
.addFuncName(Name
))
476 while (P
< EndP
&& *P
== 0)
479 return Error::success();
482 void InstrProfValueSiteRecord::merge(InstrProfValueSiteRecord
&Input
,
484 function_ref
<void(instrprof_error
)> Warn
) {
485 this->sortByTargetValues();
486 Input
.sortByTargetValues();
487 auto I
= ValueData
.begin();
488 auto IE
= ValueData
.end();
489 for (auto J
= Input
.ValueData
.begin(), JE
= Input
.ValueData
.end(); J
!= JE
;
491 while (I
!= IE
&& I
->Value
< J
->Value
)
493 if (I
!= IE
&& I
->Value
== J
->Value
) {
495 I
->Count
= SaturatingMultiplyAdd(J
->Count
, Weight
, I
->Count
, &Overflowed
);
497 Warn(instrprof_error::counter_overflow
);
501 ValueData
.insert(I
, *J
);
505 void InstrProfValueSiteRecord::scale(uint64_t Weight
,
506 function_ref
<void(instrprof_error
)> Warn
) {
507 for (auto I
= ValueData
.begin(), IE
= ValueData
.end(); I
!= IE
; ++I
) {
509 I
->Count
= SaturatingMultiply(I
->Count
, Weight
, &Overflowed
);
511 Warn(instrprof_error::counter_overflow
);
515 // Merge Value Profile data from Src record to this record for ValueKind.
516 // Scale merged value counts by \p Weight.
517 void InstrProfRecord::mergeValueProfData(
518 uint32_t ValueKind
, InstrProfRecord
&Src
, uint64_t Weight
,
519 function_ref
<void(instrprof_error
)> Warn
) {
520 uint32_t ThisNumValueSites
= getNumValueSites(ValueKind
);
521 uint32_t OtherNumValueSites
= Src
.getNumValueSites(ValueKind
);
522 if (ThisNumValueSites
!= OtherNumValueSites
) {
523 Warn(instrprof_error::value_site_count_mismatch
);
526 if (!ThisNumValueSites
)
528 std::vector
<InstrProfValueSiteRecord
> &ThisSiteRecords
=
529 getOrCreateValueSitesForKind(ValueKind
);
530 MutableArrayRef
<InstrProfValueSiteRecord
> OtherSiteRecords
=
531 Src
.getValueSitesForKind(ValueKind
);
532 for (uint32_t I
= 0; I
< ThisNumValueSites
; I
++)
533 ThisSiteRecords
[I
].merge(OtherSiteRecords
[I
], Weight
, Warn
);
536 void InstrProfRecord::merge(InstrProfRecord
&Other
, uint64_t Weight
,
537 function_ref
<void(instrprof_error
)> Warn
) {
538 // If the number of counters doesn't match we either have bad data
539 // or a hash collision.
540 if (Counts
.size() != Other
.Counts
.size()) {
541 Warn(instrprof_error::count_mismatch
);
545 for (size_t I
= 0, E
= Other
.Counts
.size(); I
< E
; ++I
) {
548 SaturatingMultiplyAdd(Other
.Counts
[I
], Weight
, Counts
[I
], &Overflowed
);
550 Warn(instrprof_error::counter_overflow
);
553 for (uint32_t Kind
= IPVK_First
; Kind
<= IPVK_Last
; ++Kind
)
554 mergeValueProfData(Kind
, Other
, Weight
, Warn
);
557 void InstrProfRecord::scaleValueProfData(
558 uint32_t ValueKind
, uint64_t Weight
,
559 function_ref
<void(instrprof_error
)> Warn
) {
560 for (auto &R
: getValueSitesForKind(ValueKind
))
561 R
.scale(Weight
, Warn
);
564 void InstrProfRecord::scale(uint64_t Weight
,
565 function_ref
<void(instrprof_error
)> Warn
) {
566 for (auto &Count
: this->Counts
) {
568 Count
= SaturatingMultiply(Count
, Weight
, &Overflowed
);
570 Warn(instrprof_error::counter_overflow
);
572 for (uint32_t Kind
= IPVK_First
; Kind
<= IPVK_Last
; ++Kind
)
573 scaleValueProfData(Kind
, Weight
, Warn
);
576 // Map indirect call target name hash to name string.
577 uint64_t InstrProfRecord::remapValue(uint64_t Value
, uint32_t ValueKind
,
578 InstrProfSymtab
*SymTab
) {
582 if (ValueKind
== IPVK_IndirectCallTarget
)
583 return SymTab
->getFunctionHashFromAddress(Value
);
588 void InstrProfRecord::addValueData(uint32_t ValueKind
, uint32_t Site
,
589 InstrProfValueData
*VData
, uint32_t N
,
590 InstrProfSymtab
*ValueMap
) {
591 for (uint32_t I
= 0; I
< N
; I
++) {
592 VData
[I
].Value
= remapValue(VData
[I
].Value
, ValueKind
, ValueMap
);
594 std::vector
<InstrProfValueSiteRecord
> &ValueSites
=
595 getOrCreateValueSitesForKind(ValueKind
);
597 ValueSites
.emplace_back();
599 ValueSites
.emplace_back(VData
, VData
+ N
);
602 #define INSTR_PROF_COMMON_API_IMPL
603 #include "llvm/ProfileData/InstrProfData.inc"
606 * ValueProfRecordClosure Interface implementation for InstrProfRecord
607 * class. These C wrappers are used as adaptors so that C++ code can be
608 * invoked as callbacks.
610 uint32_t getNumValueKindsInstrProf(const void *Record
) {
611 return reinterpret_cast<const InstrProfRecord
*>(Record
)->getNumValueKinds();
614 uint32_t getNumValueSitesInstrProf(const void *Record
, uint32_t VKind
) {
615 return reinterpret_cast<const InstrProfRecord
*>(Record
)
616 ->getNumValueSites(VKind
);
619 uint32_t getNumValueDataInstrProf(const void *Record
, uint32_t VKind
) {
620 return reinterpret_cast<const InstrProfRecord
*>(Record
)
621 ->getNumValueData(VKind
);
624 uint32_t getNumValueDataForSiteInstrProf(const void *R
, uint32_t VK
,
626 return reinterpret_cast<const InstrProfRecord
*>(R
)
627 ->getNumValueDataForSite(VK
, S
);
630 void getValueForSiteInstrProf(const void *R
, InstrProfValueData
*Dst
,
631 uint32_t K
, uint32_t S
) {
632 reinterpret_cast<const InstrProfRecord
*>(R
)->getValueForSite(Dst
, K
, S
);
635 ValueProfData
*allocValueProfDataInstrProf(size_t TotalSizeInBytes
) {
637 (ValueProfData
*)(new (::operator new(TotalSizeInBytes
)) ValueProfData());
638 memset(VD
, 0, TotalSizeInBytes
);
642 static ValueProfRecordClosure InstrProfRecordClosure
= {
644 getNumValueKindsInstrProf
,
645 getNumValueSitesInstrProf
,
646 getNumValueDataInstrProf
,
647 getNumValueDataForSiteInstrProf
,
649 getValueForSiteInstrProf
,
650 allocValueProfDataInstrProf
};
652 // Wrapper implementation using the closure mechanism.
653 uint32_t ValueProfData::getSize(const InstrProfRecord
&Record
) {
654 auto Closure
= InstrProfRecordClosure
;
655 Closure
.Record
= &Record
;
656 return getValueProfDataSize(&Closure
);
659 // Wrapper implementation using the closure mechanism.
660 std::unique_ptr
<ValueProfData
>
661 ValueProfData::serializeFrom(const InstrProfRecord
&Record
) {
662 InstrProfRecordClosure
.Record
= &Record
;
664 std::unique_ptr
<ValueProfData
> VPD(
665 serializeValueProfDataFrom(&InstrProfRecordClosure
, nullptr));
669 void ValueProfRecord::deserializeTo(InstrProfRecord
&Record
,
670 InstrProfSymtab
*SymTab
) {
671 Record
.reserveSites(Kind
, NumValueSites
);
673 InstrProfValueData
*ValueData
= getValueProfRecordValueData(this);
674 for (uint64_t VSite
= 0; VSite
< NumValueSites
; ++VSite
) {
675 uint8_t ValueDataCount
= this->SiteCountArray
[VSite
];
676 Record
.addValueData(Kind
, VSite
, ValueData
, ValueDataCount
, SymTab
);
677 ValueData
+= ValueDataCount
;
681 // For writing/serializing, Old is the host endianness, and New is
682 // byte order intended on disk. For Reading/deserialization, Old
683 // is the on-disk source endianness, and New is the host endianness.
684 void ValueProfRecord::swapBytes(support::endianness Old
,
685 support::endianness New
) {
686 using namespace support
;
691 if (getHostEndianness() != Old
) {
692 sys::swapByteOrder
<uint32_t>(NumValueSites
);
693 sys::swapByteOrder
<uint32_t>(Kind
);
695 uint32_t ND
= getValueProfRecordNumValueData(this);
696 InstrProfValueData
*VD
= getValueProfRecordValueData(this);
698 // No need to swap byte array: SiteCountArrray.
699 for (uint32_t I
= 0; I
< ND
; I
++) {
700 sys::swapByteOrder
<uint64_t>(VD
[I
].Value
);
701 sys::swapByteOrder
<uint64_t>(VD
[I
].Count
);
703 if (getHostEndianness() == Old
) {
704 sys::swapByteOrder
<uint32_t>(NumValueSites
);
705 sys::swapByteOrder
<uint32_t>(Kind
);
709 void ValueProfData::deserializeTo(InstrProfRecord
&Record
,
710 InstrProfSymtab
*SymTab
) {
711 if (NumValueKinds
== 0)
714 ValueProfRecord
*VR
= getFirstValueProfRecord(this);
715 for (uint32_t K
= 0; K
< NumValueKinds
; K
++) {
716 VR
->deserializeTo(Record
, SymTab
);
717 VR
= getValueProfRecordNext(VR
);
722 static T
swapToHostOrder(const unsigned char *&D
, support::endianness Orig
) {
723 using namespace support
;
726 return endian::readNext
<T
, little
, unaligned
>(D
);
728 return endian::readNext
<T
, big
, unaligned
>(D
);
731 static std::unique_ptr
<ValueProfData
> allocValueProfData(uint32_t TotalSize
) {
732 return std::unique_ptr
<ValueProfData
>(new (::operator new(TotalSize
))
736 Error
ValueProfData::checkIntegrity() {
737 if (NumValueKinds
> IPVK_Last
+ 1)
738 return make_error
<InstrProfError
>(instrprof_error::malformed
);
739 // Total size needs to be mulltiple of quadword size.
740 if (TotalSize
% sizeof(uint64_t))
741 return make_error
<InstrProfError
>(instrprof_error::malformed
);
743 ValueProfRecord
*VR
= getFirstValueProfRecord(this);
744 for (uint32_t K
= 0; K
< this->NumValueKinds
; K
++) {
745 if (VR
->Kind
> IPVK_Last
)
746 return make_error
<InstrProfError
>(instrprof_error::malformed
);
747 VR
= getValueProfRecordNext(VR
);
748 if ((char *)VR
- (char *)this > (ptrdiff_t)TotalSize
)
749 return make_error
<InstrProfError
>(instrprof_error::malformed
);
751 return Error::success();
754 Expected
<std::unique_ptr
<ValueProfData
>>
755 ValueProfData::getValueProfData(const unsigned char *D
,
756 const unsigned char *const BufferEnd
,
757 support::endianness Endianness
) {
758 using namespace support
;
760 if (D
+ sizeof(ValueProfData
) > BufferEnd
)
761 return make_error
<InstrProfError
>(instrprof_error::truncated
);
763 const unsigned char *Header
= D
;
764 uint32_t TotalSize
= swapToHostOrder
<uint32_t>(Header
, Endianness
);
765 if (D
+ TotalSize
> BufferEnd
)
766 return make_error
<InstrProfError
>(instrprof_error::too_large
);
768 std::unique_ptr
<ValueProfData
> VPD
= allocValueProfData(TotalSize
);
769 memcpy(VPD
.get(), D
, TotalSize
);
771 VPD
->swapBytesToHost(Endianness
);
773 Error E
= VPD
->checkIntegrity();
777 return std::move(VPD
);
780 void ValueProfData::swapBytesToHost(support::endianness Endianness
) {
781 using namespace support
;
783 if (Endianness
== getHostEndianness())
786 sys::swapByteOrder
<uint32_t>(TotalSize
);
787 sys::swapByteOrder
<uint32_t>(NumValueKinds
);
789 ValueProfRecord
*VR
= getFirstValueProfRecord(this);
790 for (uint32_t K
= 0; K
< NumValueKinds
; K
++) {
791 VR
->swapBytes(Endianness
, getHostEndianness());
792 VR
= getValueProfRecordNext(VR
);
796 void ValueProfData::swapBytesFromHost(support::endianness Endianness
) {
797 using namespace support
;
799 if (Endianness
== getHostEndianness())
802 ValueProfRecord
*VR
= getFirstValueProfRecord(this);
803 for (uint32_t K
= 0; K
< NumValueKinds
; K
++) {
804 ValueProfRecord
*NVR
= getValueProfRecordNext(VR
);
805 VR
->swapBytes(getHostEndianness(), Endianness
);
808 sys::swapByteOrder
<uint32_t>(TotalSize
);
809 sys::swapByteOrder
<uint32_t>(NumValueKinds
);
812 void annotateValueSite(Module
&M
, Instruction
&Inst
,
813 const InstrProfRecord
&InstrProfR
,
814 InstrProfValueKind ValueKind
, uint32_t SiteIdx
,
815 uint32_t MaxMDCount
) {
816 uint32_t NV
= InstrProfR
.getNumValueDataForSite(ValueKind
, SiteIdx
);
821 std::unique_ptr
<InstrProfValueData
[]> VD
=
822 InstrProfR
.getValueForSite(ValueKind
, SiteIdx
, &Sum
);
824 ArrayRef
<InstrProfValueData
> VDs(VD
.get(), NV
);
825 annotateValueSite(M
, Inst
, VDs
, Sum
, ValueKind
, MaxMDCount
);
828 void annotateValueSite(Module
&M
, Instruction
&Inst
,
829 ArrayRef
<InstrProfValueData
> VDs
,
830 uint64_t Sum
, InstrProfValueKind ValueKind
,
831 uint32_t MaxMDCount
) {
832 LLVMContext
&Ctx
= M
.getContext();
833 MDBuilder
MDHelper(Ctx
);
834 SmallVector
<Metadata
*, 3> Vals
;
836 Vals
.push_back(MDHelper
.createString("VP"));
838 Vals
.push_back(MDHelper
.createConstant(
839 ConstantInt::get(Type::getInt32Ty(Ctx
), ValueKind
)));
842 MDHelper
.createConstant(ConstantInt::get(Type::getInt64Ty(Ctx
), Sum
)));
844 // Value Profile Data
845 uint32_t MDCount
= MaxMDCount
;
846 for (auto &VD
: VDs
) {
847 Vals
.push_back(MDHelper
.createConstant(
848 ConstantInt::get(Type::getInt64Ty(Ctx
), VD
.Value
)));
849 Vals
.push_back(MDHelper
.createConstant(
850 ConstantInt::get(Type::getInt64Ty(Ctx
), VD
.Count
)));
854 Inst
.setMetadata(LLVMContext::MD_prof
, MDNode::get(Ctx
, Vals
));
857 bool getValueProfDataFromInst(const Instruction
&Inst
,
858 InstrProfValueKind ValueKind
,
859 uint32_t MaxNumValueData
,
860 InstrProfValueData ValueData
[],
861 uint32_t &ActualNumValueData
, uint64_t &TotalC
) {
862 MDNode
*MD
= Inst
.getMetadata(LLVMContext::MD_prof
);
866 unsigned NOps
= MD
->getNumOperands();
871 // Operand 0 is a string tag "VP":
872 MDString
*Tag
= cast
<MDString
>(MD
->getOperand(0));
876 if (!Tag
->getString().equals("VP"))
880 ConstantInt
*KindInt
= mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(1));
883 if (KindInt
->getZExtValue() != ValueKind
)
887 ConstantInt
*TotalCInt
= mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(2));
890 TotalC
= TotalCInt
->getZExtValue();
892 ActualNumValueData
= 0;
894 for (unsigned I
= 3; I
< NOps
; I
+= 2) {
895 if (ActualNumValueData
>= MaxNumValueData
)
897 ConstantInt
*Value
= mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(I
));
899 mdconst::dyn_extract
<ConstantInt
>(MD
->getOperand(I
+ 1));
900 if (!Value
|| !Count
)
902 ValueData
[ActualNumValueData
].Value
= Value
->getZExtValue();
903 ValueData
[ActualNumValueData
].Count
= Count
->getZExtValue();
904 ActualNumValueData
++;
909 MDNode
*getPGOFuncNameMetadata(const Function
&F
) {
910 return F
.getMetadata(getPGOFuncNameMetadataName());
913 void createPGOFuncNameMetadata(Function
&F
, StringRef PGOFuncName
) {
914 // Only for internal linkage functions.
915 if (PGOFuncName
== F
.getName())
917 // Don't create duplicated meta-data.
918 if (getPGOFuncNameMetadata(F
))
920 LLVMContext
&C
= F
.getContext();
921 MDNode
*N
= MDNode::get(C
, MDString::get(C
, PGOFuncName
));
922 F
.setMetadata(getPGOFuncNameMetadataName(), N
);
925 bool needsComdatForCounter(const Function
&F
, const Module
&M
) {
929 if (!Triple(M
.getTargetTriple()).supportsCOMDAT())
932 // See createPGOFuncNameVar for more details. To avoid link errors, profile
933 // counters for function with available_externally linkage needs to be changed
934 // to linkonce linkage. On ELF based systems, this leads to weak symbols to be
935 // created. Without using comdat, duplicate entries won't be removed by the
936 // linker leading to increased data segement size and raw profile size. Even
937 // worse, since the referenced counter from profile per-function data object
938 // will be resolved to the common strong definition, the profile counts for
939 // available_externally functions will end up being duplicated in raw profile
940 // data. This can result in distorted profile as the counts of those dups
941 // will be accumulated by the profile merger.
942 GlobalValue::LinkageTypes Linkage
= F
.getLinkage();
943 if (Linkage
!= GlobalValue::ExternalWeakLinkage
&&
944 Linkage
!= GlobalValue::AvailableExternallyLinkage
)
950 // Check if INSTR_PROF_RAW_VERSION_VAR is defined.
951 bool isIRPGOFlagSet(const Module
*M
) {
953 M
->getNamedGlobal(INSTR_PROF_QUOTE(INSTR_PROF_RAW_VERSION_VAR
));
954 if (!IRInstrVar
|| IRInstrVar
->isDeclaration() ||
955 IRInstrVar
->hasLocalLinkage())
958 // Check if the flag is set.
959 if (!IRInstrVar
->hasInitializer())
962 const Constant
*InitVal
= IRInstrVar
->getInitializer();
966 return (dyn_cast
<ConstantInt
>(InitVal
)->getZExtValue() &
967 VARIANT_MASK_IR_PROF
) != 0;
970 // Check if we can safely rename this Comdat function.
971 bool canRenameComdatFunc(const Function
&F
, bool CheckAddressTaken
) {
972 if (F
.getName().empty())
974 if (!needsComdatForCounter(F
, *(F
.getParent())))
976 // Unsafe to rename the address-taken function (which can be used in
977 // function comparison).
978 if (CheckAddressTaken
&& F
.hasAddressTaken())
980 // Only safe to do if this function may be discarded if it is not used
981 // in the compilation unit.
982 if (!GlobalValue::isDiscardableIfUnused(F
.getLinkage()))
985 // For AvailableExternallyLinkage functions.
986 if (!F
.hasComdat()) {
987 assert(F
.getLinkage() == GlobalValue::AvailableExternallyLinkage
);
993 // Parse the value profile options.
994 void getMemOPSizeRangeFromOption(StringRef MemOPSizeRange
, int64_t &RangeStart
,
995 int64_t &RangeLast
) {
996 static const int64_t DefaultMemOPSizeRangeStart
= 0;
997 static const int64_t DefaultMemOPSizeRangeLast
= 8;
998 RangeStart
= DefaultMemOPSizeRangeStart
;
999 RangeLast
= DefaultMemOPSizeRangeLast
;
1001 if (!MemOPSizeRange
.empty()) {
1002 auto Pos
= MemOPSizeRange
.find(':');
1003 if (Pos
!= std::string::npos
) {
1005 MemOPSizeRange
.substr(0, Pos
).getAsInteger(10, RangeStart
);
1006 if (Pos
< MemOPSizeRange
.size() - 1)
1007 MemOPSizeRange
.substr(Pos
+ 1).getAsInteger(10, RangeLast
);
1009 MemOPSizeRange
.getAsInteger(10, RangeLast
);
1011 assert(RangeLast
>= RangeStart
);
1014 } // end namespace llvm