diff --git a/src/coreclr/pal/src/misc/perfjitdump.cpp b/src/coreclr/pal/src/misc/perfjitdump.cpp index 93262462c19621..9040e13dadfd00 100644 --- a/src/coreclr/pal/src/misc/perfjitdump.cpp +++ b/src/coreclr/pal/src/misc/perfjitdump.cpp @@ -29,6 +29,10 @@ #include "../inc/llvm/ELF.h" +#if defined(HOST_AMD64) +#include +#endif + SET_DEFAULT_DEBUG_CHANNEL(MISC); namespace @@ -37,6 +41,7 @@ namespace { JIT_DUMP_MAGIC = 0x4A695444, JIT_DUMP_VERSION = 1, + JITDUMP_FLAGS_ARCH_TIMESTAMP = 1 << 0, #if defined(HOST_X86) ELF_MACHINE = EM_386, @@ -61,13 +66,36 @@ namespace JIT_CODE_LOAD = 0, }; + static bool UseArchTimeStamp() + { + static bool initialized = false; + static bool useArchTimestamp = false; + + if (!initialized) + { +#if defined(HOST_AMD64) + const char* archTimestamp = getenv("JITDUMP_USE_ARCH_TIMESTAMP"); + useArchTimestamp = (archTimestamp != nullptr && strcmp(archTimestamp, "1") == 0); +#endif + initialized = true; + } + + return useArchTimestamp; + } + static uint64_t GetTimeStampNS() { +#if defined(HOST_AMD64) + if (UseArchTimeStamp()) { + return static_cast(__rdtsc()); + } +#endif LARGE_INTEGER result; QueryPerformanceCounter(&result); return result.QuadPart; } + struct FileHeader { FileHeader() : @@ -78,7 +106,7 @@ namespace pad1(0), pid(getpid()), timestamp(GetTimeStampNS()), - flags(0) + flags(UseArchTimeStamp() ? JITDUMP_FLAGS_ARCH_TIMESTAMP : 0) {} uint32_t magic;