From c8e6457d441e2ffe16ea9c62d162c4a853e164df Mon Sep 17 00:00:00 2001 From: Erick Velez Date: Wed, 17 Sep 2025 18:41:45 -0700 Subject: [PATCH] [clang-doc] concatenate SymbolIDs to truncated mangled names Previously, if mangled names were too long to be used as filenames, the object's SymbolID was used as a filename. This worked for length restrictions, but made URLs/filenames inconsistent. This patch truncates the mangled name and appends the SymbolID. Thus, we can keep some context in the URL/filename while preserving uniqueness. --- clang-tools-extra/clang-doc/Serialize.cpp | 10 ++++------ clang-tools-extra/test/clang-doc/long-name.cpp | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/clang-tools-extra/clang-doc/Serialize.cpp b/clang-tools-extra/clang-doc/Serialize.cpp index dd7cd0b2ae736..186f634dd892a 100644 --- a/clang-tools-extra/clang-doc/Serialize.cpp +++ b/clang-tools-extra/clang-doc/Serialize.cpp @@ -780,12 +780,10 @@ static void populateSymbolInfo(SymbolInfo &I, const T *D, const FullComment *C, MangledStream << D->getNameAsString(); // A 250 length limit was chosen since 255 is a common limit across // different filesystems, with a 5 character buffer for file extensions. - if (MangledName.size() > 250) - // File creation fails if the mangled name is too long, so default to the - // USR. We should look for a better check since filesystems differ in - // maximum filename length - I.MangledName = llvm::toStringRef(llvm::toHex(I.USR)); - else + if (MangledName.size() > 250) { + auto SymbolID = llvm::toStringRef(llvm::toHex(I.USR)).str(); + I.MangledName = MangledName.substr(0, 250 - SymbolID.size()) + SymbolID; + } else I.MangledName = MangledName; delete Mangler; } diff --git a/clang-tools-extra/test/clang-doc/long-name.cpp b/clang-tools-extra/test/clang-doc/long-name.cpp index b33337588da19..db96fc4aebe5a 100644 --- a/clang-tools-extra/test/clang-doc/long-name.cpp +++ b/clang-tools-extra/test/clang-doc/long-name.cpp @@ -9,6 +9,6 @@ struct ThisStructHasANameThatResultsInAMangledNameThatIsExactly250CharactersLong struct ThisStructHasANameThatResultsInAMangledNameThatIsExactly251CharactersLongThatIsSupposedToTestTheFilenameLengthLimitsWithinClangDocInOrdertoSeeifclangdocwillcrashornotdependingonthelengthofthestructIfTheLengthIsTooLongThenClangDocWillCrashAnd123 {}; // CHECK-JSON: ThisStructHasANameThatResultsInAMangledNameThatIsExactly250CharactersLongThatIsSupposedToTestTheFilenameLengthLimitsWithinClangDocInOrdertoSeeifclangdocwillcrashornotdependingonthelengthofthestructIfTheLengthIsTooLongThenClangDocWillCrashAnd12.json -// CHECK-JSON: {{[0-9A-F]*}}.json +// CHECK-JSON: _ZTV244ThisStructHasANameThatResultsInAMangledNameThatIsExactly251CharactersLongThatIsSupposedToTestTheFilenameLengthLimitsWithinClangDocInOrdertoSeeifclangdocwillcrashornotdependingonthelengthofthestructIfTheL29DE8558215A13A506661C0E01E50AA3E5C9C7FA.json // CHECK-HTML: ThisStructHasANameThatResultsInAMangledNameThatIsExactly250CharactersLongThatIsSupposedToTestTheFilenameLengthLimitsWithinClangDocInOrdertoSeeifclangdocwillcrashornotdependingonthelengthofthestructIfTheLengthIsTooLongThenClangDocWillCrashAnd12.html -// CHECK-HTML: {{[0-9A-F]*}}.html +// CHECK-HTML: _ZTV244ThisStructHasANameThatResultsInAMangledNameThatIsExactly251CharactersLongThatIsSupposedToTestTheFilenameLengthLimitsWithinClangDocInOrdertoSeeifclangdocwillcrashornotdependingonthelengthofthestructIfTheL29DE8558215A13A506661C0E01E50AA3E5C9C7FA.html