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:
parent
63928f0868
commit
3f685ac3e1
@ -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*>(>)[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.
|
||||
|
Loading…
Reference in New Issue
Block a user