Use shorter names in internal TARGET_PROPERTY expressions

The change in commit 2f708f5d65 (Make internal TARGET_PROPERTY generator
expressions more robust, 2018-09-07, v3.13.0-rc1~94^2~4) introduced
globally unique names in synthesized `$<TARGET_PROPERTY:...>` generator.
We used the pattern `<target-name>::T<pointer-to-generator-target>` to
guarantee uniqueness.  However, in projects that require many such
expressions to be generated there was a measurable increase in runtime.

We had included the target name in the synthesized genex only for human
reference during debugging.  It is not necessary.  Switch to the pattern
`:<pointer-to-generator-target>` to shorten the name.  Also hand-roll a
hex-print loop instead of using sprintf.  Together these optimizations
get at least some of the time back.

Issue: #18964
This commit is contained in:
Brad King 2019-02-22 08:47:45 -05:00
parent 63928f0868
commit 3f685ac3e1

View File

@ -2118,17 +2118,24 @@ void cmGlobalGenerator::IndexGeneratorTarget(cmGeneratorTarget* gt)
}
}
static char const hexDigits[] = "0123456789abcdef";
std::string cmGlobalGenerator::IndexGeneratorTargetUniquely(
cmGeneratorTarget const* gt)
{
// Use the pointer value to uniquely identify the target instance.
// Use a "T" prefix to indicate that this identifier is for a target.
// Use a ":" prefix to avoid conflict with project-defined targets.
// We must satisfy cmGeneratorExpression::IsValidTargetName so use no
// other special characters.
char buf[64];
sprintf(buf, "::T%p",
static_cast<void const*>(gt)); // cast avoids format warning
std::string id = gt->GetName() + buf;
char buf[1 + sizeof(gt) * 2];
char* b = buf;
*b++ = ':';
for (size_t i = 0; i < sizeof(gt); ++i) {
unsigned char const c = reinterpret_cast<unsigned char const*>(&gt)[i];
*b++ = hexDigits[(c & 0xf0) >> 4];
*b++ = hexDigits[(c & 0x0f)];
}
std::string id(buf, sizeof(buf));
// We internally index pointers to non-const generator targets
// but our callers only have pointers to const generator targets.
// They will give up non-const privileges when looking up anyway.