From bcd626f08f787ed1711507a463b01dd11d2f3075 Mon Sep 17 00:00:00 2001 From: Nerixyz Date: Thu, 4 Jun 2026 04:09:43 +0200 Subject: [PATCH] Windows: add llvm-pdbutil tool (#8763) This adds `llvm-pdbutil`. It's similar to `llvm-dwarfdump` but for PDB files (MS debug info). Depends on https://github.com/compiler-explorer/infra/pull/2140. Fixes #3941. --- etc/config/c++.amazonwin.properties | 10 +++++- lib/tooling/_all.ts | 1 + lib/tooling/llvm-pdbutil-tool.ts | 52 +++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 lib/tooling/llvm-pdbutil-tool.ts diff --git a/etc/config/c++.amazonwin.properties b/etc/config/c++.amazonwin.properties index 6013a549e..c352e0491 100644 --- a/etc/config/c++.amazonwin.properties +++ b/etc/config/c++.amazonwin.properties @@ -1922,10 +1922,18 @@ libs.yaml_cpp.staticliblink=yaml-cppd ######################################## -tools=MicrosoftAnalysisTool +tools=MicrosoftAnalysisTool:llvm-pdbutil + tools.MicrosoftAnalysisTool.exe=Z:/compilers/msvc/14.37.32822-14.37.32826.1/bin/Hostx64/x64/cl.exe tools.MicrosoftAnalysisTool.exclude=mingw64:arm64 tools.MicrosoftAnalysisTool.name=Static Analysis tools.MicrosoftAnalysisTool.type=independent tools.MicrosoftAnalysisTool.class=microsoft-analysis-tool tools.MicrosoftAnalysisTool.stdinHint=disabled + +tools.llvm-pdbutil.name=llvm-pdbutil (22.1.6) +tools.llvm-pdbutil.exe=Z:/compilers/clang-cl-22.1.6/bin/llvm-pdbutil.exe +tools.llvm-pdbutil.exclude=mingw64 +tools.llvm-pdbutil.type=postcompilation +tools.llvm-pdbutil.class=llvm-pdbutil-tool +tools.llvm-pdbutil.args=dump --summary diff --git a/lib/tooling/_all.ts b/lib/tooling/_all.ts index 90570d661..875ab8eaa 100644 --- a/lib/tooling/_all.ts +++ b/lib/tooling/_all.ts @@ -32,6 +32,7 @@ export {CompilerDropinTool} from './compiler-dropin-tool.js'; export {LLVMCovTool} from './llvm-cov-tool.js'; export {LLVMDWARFDumpTool} from './llvm-dwarfdump-tool.js'; export {LLVMMcaTool} from './llvm-mca-tool.js'; +export {LLVMPDBUtilTool} from './llvm-pdbutil-tool.js'; export {MicrosoftAnalysisTool} from './microsoft-analysis-tool.js'; export {MiriTool} from './miri-tool.js'; export {NmTool} from './nm-tool.js'; diff --git a/lib/tooling/llvm-pdbutil-tool.ts b/lib/tooling/llvm-pdbutil-tool.ts new file mode 100644 index 000000000..df1716a3a --- /dev/null +++ b/lib/tooling/llvm-pdbutil-tool.ts @@ -0,0 +1,52 @@ +// Copyright (c) 2026, Compiler Explorer Authors +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; +import {fileExists} from '../utils.js'; +import {BaseTool} from './base-tool.js'; + +export class LLVMPDBUtilTool extends BaseTool { + static get key() { + return 'llvm-pdbutil-tool'; + } + + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { + if (!compilationInfo.filters.binary) { + return this.createErrorResponse(`${this.tool.name ?? 'llvm-pdbutil'} requires an executable`); + } + + let filename = compilationInfo.executableFilename; + if (!(await fileExists(filename))) { + filename = compilationInfo.outputFilename; + } + + // If a PDB is generated, it will be named after the executable. + const dotIdx = filename.lastIndexOf('.'); + if (dotIdx >= 0) { + filename = filename.slice(0, dotIdx) + '.pdb'; + } + + return super.runTool(compilationInfo, filename, args); + } +}