Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 57 additions & 0 deletions gcov_discriminator_encoding.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
// Discriminator encoding utilities for AutoFDO
// Similar to LLVM's discriminator encoding scheme
//
// Discriminator format: [Base:8][Multiplicity:7][CopyID:11][Unused:6]
// - Base discriminator (bits 0-7): Distinguishes instructions at same line
// - Multiplicity (bits 8-14): Duplication factor for unrolling/vectorization
// - CopyID (bits 15-25): Unique identifier for code copies
// - Unused (bits 26-31): Reserved

#ifndef AUTOFDO_DISCRIMINATOR_ENCODING_H_
#define AUTOFDO_DISCRIMINATOR_ENCODING_H_

#include <cstdint>

namespace devtools_crosstool_autofdo {

// Extract base discriminator (bits 0-7)
inline uint32_t GetBaseDiscriminator(uint32_t discriminator) {
return discriminator & 0xFF;
}

// Extract multiplicity/duplication factor (bits 8-14)
// Returns 1 if multiplicity bits are 0 (no duplication)
inline uint32_t GetMultiplicity(uint32_t discriminator) {
uint32_t mult = (discriminator >> 8) & 0x7F;
return (mult == 0) ? 1 : mult;
}

// Extract copy ID (bits 15-25)
inline uint32_t GetCopyID(uint32_t discriminator) {
return (discriminator >> 15) & 0x7FF;
}

// Encode discriminator from components
inline uint32_t EncodeDiscriminator(uint32_t base, uint32_t multiplicity,
uint32_t copy_id) {
// Validate ranges
if (base > 0xFF || multiplicity > 127 || copy_id > 0x7FF) {
return base; // Fallback to just base if encoding fails
}
return base | (multiplicity << 8) | (copy_id << 15);
}

// Check if discriminator has multiplicity encoded
inline bool HasMultiplicity(uint32_t discriminator) {
return GetMultiplicity(discriminator) > 1;
}

// Check if discriminator has copy ID encoded
inline bool HasCopyID(uint32_t discriminator) {
return GetCopyID(discriminator) != 0;
}

} // namespace devtools_crosstool_autofdo

#endif // AUTOFDO_DISCRIMINATOR_ENCODING_H_

18 changes: 16 additions & 2 deletions source_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@
#include "base/macros.h"
#if defined(HAVE_LLVM)
#include "llvm/IR/DebugInfoMetadata.h"
#else
// Include discriminator encoding utilities only when LLVM is not available
#include "gcov_discriminator_encoding.h"
#endif

namespace devtools_crosstool_autofdo {
Expand Down Expand Up @@ -49,7 +52,11 @@ struct SourceInfo {
discriminator)
: discriminator));
#else
return (static_cast<uint64_t>(line - start_line) << 32) | discriminator;
// Profile stores only base discriminator (bits 0-7).
uint32_t disc = use_discriminator_encoding
? GetBaseDiscriminator(discriminator)
: discriminator;
return (static_cast<uint64_t>(line - start_line) << 32) | disc;
#endif
}

Expand All @@ -59,7 +66,9 @@ struct SourceInfo {
return llvm::DILocation::getDuplicationFactorFromDiscriminator(
discriminator);
#else
return 1;
// Only extract multiplicity if discriminator is non-zero
if (discriminator == 0) return 1;
return GetMultiplicity(discriminator);
#endif
}

Expand All @@ -79,6 +88,11 @@ struct SourceInfo {
static constexpr uint32_t GenerateCompressedOffset(uint64_t Offset) {
return static_cast<uint32_t>((Offset >> 16) | (Offset & 0xffff));
}

// Return the full 64-bit offset for 32-bit hierarchical discriminators.
static constexpr uint64_t GenerateFullOffset(uint64_t Offset) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not called from anywhere , is it?

return Offset;
}

// Return the line number from the offset.
static constexpr uint32_t GetLineNumberFromOffset(uint64_t Offset) {
Expand Down