diff --git a/app.ts b/app.ts index 5cefba0c0..f0b90e074 100755 --- a/app.ts +++ b/app.ts @@ -33,14 +33,16 @@ import bodyParser from 'body-parser'; import compression from 'compression'; import express from 'express'; import fs from 'fs-extra'; -// @ts-expect-warning +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import morgan from 'morgan'; import nopt from 'nopt'; import PromClient from 'prom-client'; import responseTime from 'response-time'; import sanitize from 'sanitize-filename'; import sFavicon from 'serve-favicon'; -// @ts-expect-warning +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import systemdSocket from 'systemd-socket'; import _ from 'underscore'; import urljoin from 'url-join'; @@ -50,7 +52,6 @@ import * as normalizer from './lib/clientstate-normalizer.js'; import {CompilationEnvironment} from './lib/compilation-env.js'; import {CompilationQueue} from './lib/compilation-queue.js'; import {CompilerFinder} from './lib/compiler-finder.js'; -// import { policy as csp } from './lib/csp.js'; import {startWineInit} from './lib/exec.js'; import {CompileHandler} from './lib/handlers/compile.js'; import * as healthCheck from './lib/handlers/health-check.js'; diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts index 90a971f04..f307b1dba 100644 --- a/lib/base-compiler.ts +++ b/lib/base-compiler.ts @@ -34,6 +34,7 @@ import {unique} from '../shared/common-utils.js'; import {PPOptions} from '../static/panes/pp-view.interfaces.js'; import {ParsedAsmResultLine} from '../types/asmresult/asmresult.interfaces.js'; import { + ActiveTool, BuildResult, BuildStep, BypassCache, @@ -43,10 +44,8 @@ import { CmakeCacheKey, CompilationCacheKey, CompilationInfo, - CompilationInfo2, CompilationResult, CompileChildLibraries, - CustomInputForTool, ExecutionOptions, ExecutionOptionsWithEnv, ExecutionParams, @@ -80,7 +79,7 @@ import type {ResultLine} from '../types/resultline/resultline.interfaces.js'; import {type ToolResult, type ToolTypeKey} from '../types/tool.interfaces.js'; import {moveArtifactsIntoResult} from './artifact-utils.js'; -import {unwrap} from './assert.js'; +import {assert, unwrap} from './assert.js'; import type {BuildEnvDownloadInfo} from './buildenvsetup/buildenv.interfaces.js'; import {BuildEnvSetupBase, getBuildEnvTypeByKey} from './buildenvsetup/index.js'; import * as cfg from './cfg/cfg.js'; @@ -1736,11 +1735,7 @@ export class BaseCompiler implements ICompiler { return await this.postProcess(asmResult, outputFilename, filters); } - runToolsOfType( - tools, - type: ToolTypeKey, - compilationInfo: CompilationInfo | CompilationInfo2, - ): Promise[] { + runToolsOfType(tools: ActiveTool[], type: ToolTypeKey, compilationInfo: CompilationInfo): Promise[] { const tooling: Promise[] = []; if (tools) { for (const tool of tools) { @@ -2126,7 +2121,7 @@ export class BaseCompiler implements ICompiler { options: string[], backendOptions: Record, filters: ParseFiltersAndOutputOptions, - tools, + tools: ActiveTool[], libraries: CompileChildLibraries[], files: FiledataPair[], ): CacheKey { @@ -2173,17 +2168,20 @@ export class BaseCompiler implements ICompiler { } as any as CompilationInfo; } - getCompilationInfo2(key: CacheKey, result: CustomInputForTool, customBuildPath?: string): CompilationInfo2 { + getCompilationInfoForTool( + key: CacheKey, + inputFilename: string, + dirPath: string, + outputFilename: string, + ): CompilationInfo { return { - executableFilename: this.getExecutableFilename( - customBuildPath || result.dirPath || '', - this.outputFilebase, - key, - ), + executableFilename: this.getExecutableFilename(dirPath, this.outputFilebase, key), asmParser: this.asm, + outputFilename: outputFilename, ...key, - ...result, - } as any as CompilationInfo2; + inputFilename: inputFilename, + dirPath: dirPath, + } as any as CompilationInfo; } tryAutodetectLibraries(libsAndOptions: LibsAndOptions): boolean { @@ -2245,7 +2243,7 @@ export class BaseCompiler implements ICompiler { filters: ParseFiltersAndOutputOptions, backendOptions: Record, libraries: CompileChildLibraries[], - tools, + tools: ActiveTool[], ) { const inputFilenameSafe = this.filename(inputFilename); @@ -2321,11 +2319,7 @@ export class BaseCompiler implements ICompiler { this.runToolsOfType( tools, 'independent', - this.getCompilationInfo2(key, { - inputFilename, - dirPath, - outputFilename, - }), + this.getCompilationInfoForTool(key, inputFilename, dirPath, outputFilename), ), ), ]); @@ -2430,7 +2424,7 @@ export class BaseCompiler implements ICompiler { } } - async doBuildstep(command, args, execParams) { + async doBuildstep(command: string, args: string[], execParams: ExecutionOptions) { const result = await this.exec(command, args, execParams); return this.processExecutionResult(result); } @@ -2447,7 +2441,13 @@ export class BaseCompiler implements ICompiler { }; } - async doBuildstepAndAddToResult(result, name, command, args, execParams): Promise { + async doBuildstepAndAddToResult( + result, + name: string, + command: string, + args: string[], + execParams: ExecutionOptions, + ): Promise { const stepResult: BuildStep = { ...(await this.doBuildstep(command, args, execParams)), compilationOptions: args, @@ -2609,10 +2609,13 @@ export class BaseCompiler implements ICompiler { const useNinja = this.env.ceProps('useninja'); const fullArgs: string[] = useNinja ? ['-GNinja'].concat(partArgs) : partArgs; + const cmd = this.env.ceProps('cmake') as string; + assert(cmd, 'No cmake command found'); + const cmakeStepResult = await this.doBuildstepAndAddToResult( fullResult, 'cmake', - this.env.ceProps('cmake'), + cmd, fullArgs, makeExecParams, ); @@ -2634,7 +2637,7 @@ export class BaseCompiler implements ICompiler { const makeStepResult = await this.doBuildstepAndAddToResult( fullResult, 'build', - this.env.ceProps('cmake'), + cmd, ['--build', '.'], execParams, ); @@ -2758,7 +2761,7 @@ export class BaseCompiler implements ICompiler { backendOptions: Record, filters: ParseFiltersAndOutputOptions, bypassCache: BypassCache, - tools, + tools: ActiveTool[], executeParameters: ExecutionParams, libraries: CompileChildLibraries[], files: FiledataPair[], @@ -2886,7 +2889,7 @@ export class BaseCompiler implements ICompiler { doExecute: boolean, key: CacheKey, executeOptions: ExecutableExecutionOptions, - tools, + tools: ActiveTool[], backendOptions: Record, filters: ParseFiltersAndOutputOptions, options: string[], diff --git a/lib/buildenvsetup/base.ts b/lib/buildenvsetup/base.ts index aec95268c..0667ea272 100644 --- a/lib/buildenvsetup/base.ts +++ b/lib/buildenvsetup/base.ts @@ -26,7 +26,7 @@ import path from 'path'; import _ from 'underscore'; -import {CacheKey, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; +import {Arch, CacheKey, ExecutionOptionsWithEnv} from '../../types/compilation/compilation.interfaces.js'; import {CompilerInfo} from '../../types/compiler.interfaces.js'; import {UnprocessedExecResult} from '../../types/execution/execution.interfaces.js'; import {CompilationEnvironment} from '../compilation-env.js'; @@ -73,9 +73,9 @@ export class BuildEnvSetupBase { }); } - async hasSupportForArch(execCompilerCached: ExecCompilerCachedFunc, arch: string): Promise { + async hasSupportForArch(execCompilerCached: ExecCompilerCachedFunc, arch: Arch): Promise { let result: any; - let searchFor = arch; + let searchFor = arch as string; if (this.compiler.exe.includes('icpx')) { return arch === 'x86' || arch === 'x86_64'; } else if (this.compiler.exe.includes('circle')) { diff --git a/lib/cache/s3.ts b/lib/cache/s3.ts index 4eadf4a61..9f153ee1c 100644 --- a/lib/cache/s3.ts +++ b/lib/cache/s3.ts @@ -34,7 +34,7 @@ import {SentryCapture} from '../sentry.js'; import {BaseCache} from './base.js'; -function messageFor(e) { +function messageFor(e: any) { return e.message || e.toString(); } @@ -42,9 +42,15 @@ export class S3Cache extends BaseCache { private readonly s3: S3Bucket; readonly path: string; readonly region: string; - private readonly onError: (Error, string) => void; + private readonly onError: (Error: any, msg: string) => void; - constructor(cacheName: string, bucket: string, path: string, region: string, onError?: (Error, string) => void) { + constructor( + cacheName: string, + bucket: string, + path: string, + region: string, + onError?: (Error: any, msg: string) => void, + ) { super(cacheName, `S3Cache(s3://${bucket}/${path} in ${region})`, 's3'); this.path = path; this.region = region; diff --git a/lib/compilers/assembly.ts b/lib/compilers/assembly.ts index 68bb1b26d..b6aaa601e 100644 --- a/lib/compilers/assembly.ts +++ b/lib/compilers/assembly.ts @@ -27,7 +27,13 @@ import path from 'path'; import _ from 'underscore'; -import type {BuildResult, CacheKey, CompilationResult} from '../../types/compilation/compilation.interfaces.js'; +import type { + Arch, + BuildResult, + BuildStep, + CacheKey, + CompilationResult, +} from '../../types/compilation/compilation.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import {BaseCompiler} from '../base-compiler.js'; @@ -84,13 +90,13 @@ export class AssemblyCompiler extends BaseCompiler { return await this.doBuildstepAndAddToResult( fullResult, 'readelf', - this.env.ceProps('readelf'), + this.env.ceProps('readelf') as string, ['-h', objectFilename], execOptions, ); } - async getArchitecture(fullResult: BuildResult, objectFilename: string) { + async getArchitecture(fullResult: BuildResult, objectFilename: string): Promise { const result = await this.runReadelf(fullResult, objectFilename); const output = result.stdout.map(line => line.text).join('\n'); if (output.includes('ELF32') && output.includes('80386')) { @@ -102,10 +108,10 @@ export class AssemblyCompiler extends BaseCompiler { return 'x86_64'; } - return false; + return null; } - async runLinker(fullResult, inputArch, objectFilename, outputFilename) { + async runLinker(fullResult: BuildResult, inputArch: Arch, objectFilename: string, outputFilename: string) { const execOptions = this.getDefaultExecOptions(); execOptions.customCwd = path.dirname(objectFilename); @@ -115,17 +121,23 @@ export class AssemblyCompiler extends BaseCompiler { } else if (inputArch === 'x86_64') { // default target } else { - const result = { + const result: BuildStep = { code: -1, step: 'ld', stderr: [{text: 'Invalid architecture for linking and execution'}], + okToCache: false, + filenameTransform: (fn: string) => fn, + stdout: [], + execTime: '', + timedOut: false, + compilationOptions: [], }; - fullResult.buildsteps.push(result); + fullResult.buildsteps!.push(result); return result; } options.push(objectFilename); - return this.doBuildstepAndAddToResult(fullResult, 'ld', this.env.ceProps('ld'), options, execOptions); + return this.doBuildstepAndAddToResult(fullResult, 'ld', this.env.ceProps('ld') as string, options, execOptions); } override getExecutableFilename(dirPath: string) { diff --git a/lib/compilers/cc65.ts b/lib/compilers/cc65.ts index 8191a724c..5b96ed6aa 100644 --- a/lib/compilers/cc65.ts +++ b/lib/compilers/cc65.ts @@ -27,7 +27,11 @@ import path from 'path'; import fs from 'fs-extra'; import _ from 'underscore'; -import type {CompilationResult, CompileChildLibraries} from '../../types/compilation/compilation.interfaces.js'; +import type { + CompilationResult, + CompileChildLibraries, + ExecutionOptions, +} from '../../types/compilation/compilation.interfaces.js'; import type {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; import type {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import {ArtifactType} from '../../types/tool.interfaces.js'; @@ -139,10 +143,16 @@ export class Cc65Compiler extends BaseCompiler { return res; } - override async doBuildstepAndAddToResult(result: CompilationResult, name, command, args, execParams) { + override async doBuildstepAndAddToResult( + result: CompilationResult, + name: string, + command: string, + args: string[], + execParams: ExecutionOptions, + ) { const stepResult = await super.doBuildstepAndAddToResult(result, name, command, args, execParams); if (name === 'build') { - const mapFile = path.join(execParams.customCwd, 'map.txt'); + const mapFile = path.join(execParams.customCwd!, 'map.txt'); if (await utils.fileExists(mapFile)) { const file_buffer = await fs.readFile(mapFile); stepResult.stderr = stepResult.stderr.concat(utils.parseOutput(file_buffer.toString())); diff --git a/lib/compilers/clang.ts b/lib/compilers/clang.ts index 3ed5c8de5..6ce4d76c7 100644 --- a/lib/compilers/clang.ts +++ b/lib/compilers/clang.ts @@ -28,6 +28,7 @@ import path from 'path'; import _ from 'underscore'; import type { + ActiveTool, BuildResult, BypassCache, CacheKey, @@ -191,7 +192,7 @@ export class ClangCompiler extends BaseCompiler { doExecute: boolean, key: CacheKey, executeParameters: ExecutableExecutionOptions, - tools, + tools: ActiveTool[], backendOptions: Record, filters: ParseFiltersAndOutputOptions, options: string[], @@ -256,7 +257,7 @@ export class ClangCompiler extends BaseCompiler { return devices; } - override async extractDeviceCode(result, filters, compilationInfo: CompilationInfo) { + override async extractDeviceCode(result, filters: ParseFiltersAndOutputOptions, compilationInfo: CompilationInfo) { const split = await this.splitDeviceCode(result.asm); if (!split) return result; diff --git a/lib/compilers/llvm-mos.ts b/lib/compilers/llvm-mos.ts index 736e2c5e0..35b5fda00 100644 --- a/lib/compilers/llvm-mos.ts +++ b/lib/compilers/llvm-mos.ts @@ -59,11 +59,11 @@ export class LLVMMOSCompiler extends ClangCompiler { } override async objdump( - outputFilename, + outputFilename: string, result: CompilationResult, maxSize: number, - intelAsm, - demangle, + intelAsm: boolean, + demangle: boolean, staticReloc: boolean, dynamicReloc: boolean, filters: ParseFiltersAndOutputOptions, diff --git a/lib/compilers/nvcc.ts b/lib/compilers/nvcc.ts index 3d8c3aedc..5cfe15328 100644 --- a/lib/compilers/nvcc.ts +++ b/lib/compilers/nvcc.ts @@ -134,7 +134,11 @@ export class NvccCompiler extends BaseCompiler { return Promise.all([asmPromise, optPromise, '']); } - override async extractDeviceCode(result: CompilationResult, filters, compilationInfo: CompilationInfo) { + override async extractDeviceCode( + result: CompilationResult, + filters: ParseFiltersAndOutputOptions, + compilationInfo: CompilationInfo, + ) { const {dirPath} = result; const {demangle} = filters; const devices = {...result.devices}; diff --git a/lib/compilers/nvcpp.ts b/lib/compilers/nvcpp.ts index dfdb13d73..d36366785 100644 --- a/lib/compilers/nvcpp.ts +++ b/lib/compilers/nvcpp.ts @@ -27,6 +27,7 @@ import path from 'path'; import {CompilationInfo, CompilationResult} from '../../types/compilation/compilation.interfaces.js'; import {PreliminaryCompilerInfo} from '../../types/compiler.interfaces.js'; +import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; import {unwrap} from '../assert.js'; import {BaseCompiler} from '../base-compiler.js'; import {CompilationEnvironment} from '../compilation-env.js'; @@ -53,7 +54,7 @@ export class NvcppCompiler extends BaseCompiler { this.compiler.supportsDeviceAsmView = true; } - async nvdisasm(result, outputFilename: string, maxOutput: number) { + async nvdisasm(outputFilename: string, maxOutput: number) { const disasmResult = await this.exec(unwrap(this.compiler.nvdisasm), ['-c', '-g', '-hex', outputFilename], { maxOutput, customCwd: path.dirname(outputFilename), @@ -89,7 +90,11 @@ export class NvcppCompiler extends BaseCompiler { return false; } - override async extractDeviceCode(result: CompilationResult, filters, compilationInfo: CompilationInfo) { + override async extractDeviceCode( + result: CompilationResult, + filters: ParseFiltersAndOutputOptions, + compilationInfo: CompilationInfo, + ) { const {dirPath} = result; const {demangle} = filters; const devices = {...result.devices}; @@ -109,7 +114,7 @@ export class NvcppCompiler extends BaseCompiler { const {asm} = type === 'PTX' ? {asm: await fs.readFile(path.join(dirPath, name), 'utf8')} - : await this.nvdisasm(result, path.join(dirPath, name), maxSize); + : await this.nvdisasm(path.join(dirPath, name), maxSize); const archAndCode = name.split('.').slice(1, -1).join(', ') || ''; const nameAndArch = type + (archAndCode ? ` (${archAndCode.toLowerCase()})` : ''); Object.assign(devices, { diff --git a/lib/handlers/compile.ts b/lib/handlers/compile.ts index 1f56f5e4e..91679043f 100644 --- a/lib/handlers/compile.ts +++ b/lib/handlers/compile.ts @@ -37,6 +37,7 @@ import which from 'which'; import {remove} from '../../shared/common-utils.js'; import { + ActiveTool, BypassCache, CompileChildLibraries, ExecutionParams, @@ -100,7 +101,7 @@ export type ParsedRequest = { backendOptions: Record; filters: ParseFiltersAndOutputOptions; bypassCache: BypassCache; - tools: any; + tools: ActiveTool[]; executeParameters: ExecutionParams; libraries: CompileChildLibraries[]; }; diff --git a/lib/tooling/base-tool.interface.ts b/lib/tooling/base-tool.interface.ts index 98a3a645a..47e405f4c 100755 --- a/lib/tooling/base-tool.interface.ts +++ b/lib/tooling/base-tool.interface.ts @@ -22,6 +22,7 @@ // 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 {Tool, ToolResult} from '../../types/tool.interfaces.js'; import {OptionsHandlerLibrary} from '../options-handler.js'; import {PropertyGetter} from '../properties.interfaces.js'; @@ -33,7 +34,7 @@ export type ToolEnv = { export interface ITool extends Tool { runTool( - compilationInfo: Record, + compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[], stdin?: string, diff --git a/lib/tooling/base-tool.ts b/lib/tooling/base-tool.ts index 052c42163..e236e57e5 100755 --- a/lib/tooling/base-tool.ts +++ b/lib/tooling/base-tool.ts @@ -27,7 +27,7 @@ import path from 'path'; import PromClient from 'prom-client'; import _ from 'underscore'; -import {ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; +import {CompilationInfo, ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; import {UnprocessedExecResult} from '../../types/execution/execution.interfaces.js'; import {SelectedLibraryVersion} from '../../types/libraries/libraries.interfaces.js'; import {ResultLine} from '../../types/resultline/resultline.interfaces.js'; @@ -146,7 +146,7 @@ export class BaseTool implements ITool { } async runTool( - compilationInfo: Record, + compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[], stdin?: string, diff --git a/lib/tooling/bloaty-tool.ts b/lib/tooling/bloaty-tool.ts index 1b2e13a6c..13d2c4a69 100644 --- a/lib/tooling/bloaty-tool.ts +++ b/lib/tooling/bloaty-tool.ts @@ -22,6 +22,7 @@ // 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'; @@ -31,7 +32,7 @@ export class BloatyTool extends BaseTool { return 'bloaty-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary && !compilationInfo.filters.binaryObject) { return this.createErrorResponse(`${this.tool.name ?? 'bloaty'} requires an executable or binary object`); } diff --git a/lib/tooling/clang-format-tool.ts b/lib/tooling/clang-format-tool.ts index 2a686e149..6662c0765 100644 --- a/lib/tooling/clang-format-tool.ts +++ b/lib/tooling/clang-format-tool.ts @@ -26,6 +26,7 @@ import path from 'path'; import fs from 'fs-extra'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ToolInfo} from '../../types/tool.interfaces.js'; import {ToolEnv} from './base-tool.interface.js'; @@ -42,7 +43,7 @@ export class ClangFormatTool extends BaseTool { this.addOptionsToToolArgs = false; } - override async runTool(compilationInfo: Record, inputFilepath: string, args: string[], stdin: string) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath: string, args: string[], stdin: string) { const sourcefile = inputFilepath; const compilerExe = compilationInfo.compiler.exe; const options = compilationInfo.options; diff --git a/lib/tooling/clang-query-tool.ts b/lib/tooling/clang-query-tool.ts index c60c229d8..772adb2b9 100644 --- a/lib/tooling/clang-query-tool.ts +++ b/lib/tooling/clang-query-tool.ts @@ -26,6 +26,7 @@ import path from 'path'; import fs from 'fs-extra'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ToolInfo} from '../../types/tool.interfaces.js'; import {ToolEnv} from './base-tool.interface.js'; @@ -42,7 +43,7 @@ export class ClangQueryTool extends BaseTool { this.addOptionsToToolArgs = false; } - override async runTool(compilationInfo: Record, inputFilepath: string, args: string[], stdin: string) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath: string, args: string[], stdin: string) { const sourcefile = inputFilepath; const compilerExe = compilationInfo.compiler.exe; const options = compilationInfo.options; @@ -50,7 +51,7 @@ export class ClangQueryTool extends BaseTool { const compileFlags = options.filter((option: string) => option !== sourcefile); if (!compilerExe.includes('clang++')) { - compileFlags.push(this.tool.options); + compileFlags.concat(this.tool.options); } const query_commands_file = this.getUniqueFilePrefix() + 'query_commands.txt'; diff --git a/lib/tooling/clang-tidy-tool.ts b/lib/tooling/clang-tidy-tool.ts index f8e5251e8..5d674d63c 100644 --- a/lib/tooling/clang-tidy-tool.ts +++ b/lib/tooling/clang-tidy-tool.ts @@ -26,6 +26,7 @@ import path from 'path'; import fs from 'fs-extra'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ToolInfo} from '../../types/tool.interfaces.js'; import {OptionsHandlerLibrary} from '../options-handler.js'; import * as utils from '../utils.js'; @@ -45,7 +46,7 @@ export class ClangTidyTool extends BaseTool { } override async runTool( - compilationInfo: Record, + compilationInfo: CompilationInfo, inputFilepath: string, args?: string[], stdin?: string, diff --git a/lib/tooling/compiler-dropin-tool.ts b/lib/tooling/compiler-dropin-tool.ts index b0f52d7a2..0acff3118 100644 --- a/lib/tooling/compiler-dropin-tool.ts +++ b/lib/tooling/compiler-dropin-tool.ts @@ -22,6 +22,7 @@ // 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 {ToolInfo, ToolResult} from '../../types/tool.interfaces.js'; import {OptionsHandlerLibrary} from '../options-handler.js'; import {getToolchainPath} from '../toolchain-utils.js'; @@ -105,7 +106,7 @@ export class CompilerDropinTool extends BaseTool { } override async runTool( - compilationInfo: Record, + compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[], stdin?: string, diff --git a/lib/tooling/llvm-dwarfdump-tool.ts b/lib/tooling/llvm-dwarfdump-tool.ts index c718e4223..92074392c 100644 --- a/lib/tooling/llvm-dwarfdump-tool.ts +++ b/lib/tooling/llvm-dwarfdump-tool.ts @@ -22,6 +22,7 @@ // 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'; @@ -31,7 +32,7 @@ export class LLVMDWARFDumpTool extends BaseTool { return 'llvm-dwarfdump-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary && !compilationInfo.filters.binaryObject) { return this.createErrorResponse( `${this.tool.name ?? 'llvm-dwarfdump'} requires an executable or binary object`, diff --git a/lib/tooling/llvm-mca-tool.ts b/lib/tooling/llvm-mca-tool.ts index dd5fce9b6..364d21319 100644 --- a/lib/tooling/llvm-mca-tool.ts +++ b/lib/tooling/llvm-mca-tool.ts @@ -24,6 +24,8 @@ import fs from 'fs-extra'; +// import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {InstructionSets} from '../instructionsets.js'; import {BaseTool} from './base-tool.js'; @@ -45,7 +47,7 @@ export class LLVMMcaTool extends BaseTool { return fs.writeFile(destination, this.rewriteAsm(data)); } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, _inputFilepath?: string, args?: string[]) { const isets = new InstructionSets(); let target = isets.getInstructionSetTarget(compilationInfo.compiler.instructionSet); const prependArgs: string[] = []; @@ -99,7 +101,7 @@ export class LLVMMcaTool extends BaseTool { const newArgs: string[] = prependArgs.concat(args || []); const rewrittenOutputFilename = compilationInfo.outputFilename + '.mca'; - await this.writeAsmFile(compilationInfo.asm, rewrittenOutputFilename); + await this.writeAsmFile(compilationInfo.asm as string, rewrittenOutputFilename); return super.runTool(compilationInfo, rewrittenOutputFilename, newArgs); } } diff --git a/lib/tooling/nm-tool.ts b/lib/tooling/nm-tool.ts index e77cb6fdb..51653545e 100644 --- a/lib/tooling/nm-tool.ts +++ b/lib/tooling/nm-tool.ts @@ -22,6 +22,7 @@ // 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'; @@ -31,7 +32,7 @@ export class NmTool extends BaseTool { return 'nm-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary && !compilationInfo.filters.binaryObject) { return this.createErrorResponse(`${this.tool.name ?? 'nm'} requires an executable or binary object`); } diff --git a/lib/tooling/osaca-tool.ts b/lib/tooling/osaca-tool.ts index c05ff843b..97938d7f3 100644 --- a/lib/tooling/osaca-tool.ts +++ b/lib/tooling/osaca-tool.ts @@ -24,8 +24,10 @@ import fs from 'fs-extra'; +// import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ParseFiltersAndOutputOptions} from '../../types/features/filters.interfaces.js'; -import {AsmParser} from '../parsers/asm-parser.js'; +import {IAsmParser} from '../parsers/asm-parser.interfaces.js'; import {BaseTool} from './base-tool.js'; @@ -34,7 +36,7 @@ export class OSACATool extends BaseTool { return 'osaca-tool'; } - async writeAsmFile(asmParser: AsmParser, asm: string, filters: ParseFiltersAndOutputOptions, destination: string) { + async writeAsmFile(asmParser: IAsmParser, asm: string, filters: ParseFiltersAndOutputOptions, destination: string) { // Applying same filters as applied to compiler outpu const filteredAsm = asmParser.process(asm, filters).asm.reduce(function (acc, line) { return acc + line.text + '\n'; @@ -42,7 +44,7 @@ export class OSACATool extends BaseTool { return fs.writeFile(destination, filteredAsm); } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (compilationInfo.filters.binary) { return this.createErrorResponse(''); } @@ -54,7 +56,7 @@ export class OSACATool extends BaseTool { const rewrittenOutputFilename = compilationInfo.outputFilename + '.osaca'; await this.writeAsmFile( compilationInfo.asmParser, - compilationInfo.asm, + compilationInfo.asm as string, compilationInfo.filters, rewrittenOutputFilename, ); diff --git a/lib/tooling/pahole-tool.ts b/lib/tooling/pahole-tool.ts index 7392b1874..56abec568 100644 --- a/lib/tooling/pahole-tool.ts +++ b/lib/tooling/pahole-tool.ts @@ -24,6 +24,8 @@ import fs from 'fs-extra'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; + import {BaseTool} from './base-tool.js'; export class PaholeTool extends BaseTool { @@ -31,7 +33,7 @@ export class PaholeTool extends BaseTool { return 'pahole-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary && !compilationInfo.filters.binaryObject) { return this.createErrorResponse(`${this.tool.name ?? 'Pahole'} requires an executable or binary object`); } diff --git a/lib/tooling/pvs-studio-tool.ts b/lib/tooling/pvs-studio-tool.ts index e4b67cf18..d28107143 100644 --- a/lib/tooling/pvs-studio-tool.ts +++ b/lib/tooling/pvs-studio-tool.ts @@ -26,6 +26,7 @@ import path from 'path'; import fs from 'fs-extra'; +import {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ToolInfo} from '../../types/tool.interfaces.js'; import {assert} from '../assert.js'; import * as exec from '../exec.js'; @@ -49,7 +50,7 @@ export class PvsStudioTool extends BaseTool { this.addOptionsToToolArgs = false; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (compilationInfo.code !== 0) { return this.createErrorResponse('Unable to start analysis due to compilation error.'); } diff --git a/lib/tooling/readelf-tool.ts b/lib/tooling/readelf-tool.ts index 336966a85..8d4c8b1f6 100644 --- a/lib/tooling/readelf-tool.ts +++ b/lib/tooling/readelf-tool.ts @@ -22,6 +22,7 @@ // 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'; @@ -31,7 +32,7 @@ export class ReadElfTool extends BaseTool { return 'readelf-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary && !compilationInfo.filters.binaryObject) { return this.createErrorResponse(`${this.tool.name ?? 'readelf'} requires an executable or binary object`); } diff --git a/lib/tooling/sonar-tool.ts b/lib/tooling/sonar-tool.ts index 54ec21e86..94bca8091 100644 --- a/lib/tooling/sonar-tool.ts +++ b/lib/tooling/sonar-tool.ts @@ -24,7 +24,7 @@ import path from 'path'; -import {ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; +import {CompilationInfo, ExecutionOptions} from '../../types/compilation/compilation.interfaces.js'; import type { Fix, Link, @@ -207,7 +207,7 @@ export class SonarTool extends BaseTool { } override async runTool( - compilationInfo: Record, + compilationInfo: CompilationInfo, inputFilePath?: string, args?: string[], stdin?: string, diff --git a/lib/tooling/strings-tool.ts b/lib/tooling/strings-tool.ts index 343073605..4e351380a 100644 --- a/lib/tooling/strings-tool.ts +++ b/lib/tooling/strings-tool.ts @@ -22,6 +22,7 @@ // 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'; @@ -31,7 +32,7 @@ export class StringsTool extends BaseTool { return 'strings-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, inputFilepath?: string, args?: string[]) { if (!compilationInfo.filters.binary) { return this.createErrorResponse(`${this.tool.name ?? 'Strings'} requires an executable`); } diff --git a/lib/tooling/x86to6502-tool.ts b/lib/tooling/x86to6502-tool.ts index 61d3eee20..98e3f7576 100644 --- a/lib/tooling/x86to6502-tool.ts +++ b/lib/tooling/x86to6502-tool.ts @@ -22,6 +22,8 @@ // 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 {CompilationInfo} from '../../types/compilation/compilation.interfaces.js'; import {ToolResult} from '../../types/tool.interfaces.js'; import {AsmParser} from '../parsers/asm-parser.js'; @@ -32,7 +34,7 @@ export class x86to6502Tool extends BaseTool { return 'x86to6502-tool'; } - override async runTool(compilationInfo: Record, inputFilepath?: string, args?: string[]) { + override async runTool(compilationInfo: CompilationInfo, _inputFilepath?: string, args?: string[]) { if (compilationInfo.filters.intel) { return new Promise(resolve => { resolve(this.createErrorResponse('')); @@ -48,7 +50,7 @@ export class x86to6502Tool extends BaseTool { const parser = new AsmParser(); const filters = Object.assign({}, compilationInfo.filters); - const result = parser.process(compilationInfo.asm, filters); + const result = parser.process(compilationInfo.asm as string, filters); const asm = result.asm .map(obj => { diff --git a/static/components.interfaces.ts b/static/components.interfaces.ts index 37f7a8535..4ec3cd41f 100644 --- a/static/components.interfaces.ts +++ b/static/components.interfaces.ts @@ -30,6 +30,7 @@ import {GccDumpViewState} from './panes/gccdump-view.interfaces.js'; import {ConfiguredOverrides} from './compilation/compiler-overrides.interfaces.js'; import {ConfiguredRuntimeTools} from './execution/execution.interfaces.js'; import {IrState} from './panes/ir-view.interfaces.js'; +import {MonacoPaneState} from './panes/pane.interfaces.js'; export const COMPILER_COMPONENT_NAME = 'compiler'; export const EXECUTOR_COMPONENT_NAME = 'executor'; export const EDITOR_COMPONENT_NAME = 'codeEditor'; @@ -123,7 +124,7 @@ export type OutputState = StateWithTree & { }; export type ToolState = { - toolId: any; + toolId: string; monacoStdin?: boolean; monacoEditorOpen?: boolean; monacoEditorHasBeenAutoOpened?: boolean; @@ -134,6 +135,8 @@ export type ToolState = { wrap?: boolean; }; +export type NewToolSettings = MonacoPaneState & ToolState; + export type ToolViewState = StateWithTree & ToolState & { id: number; // CompilerID (TODO(#4703): Why is this not part of StateWithTree) diff --git a/static/event-map.ts b/static/event-map.ts index 19b69fe11..2589d85c2 100644 --- a/static/event-map.ts +++ b/static/event-map.ts @@ -33,7 +33,7 @@ import {CompilerInfo} from '../types/compiler.interfaces.js'; import {CompilationResult} from '../types/compilation/compilation.interfaces.js'; import {OptPipelineBackendOptions} from './compilation/opt-pipeline-output.interfaces.js'; import {LLVMIrBackendOptions} from './compilation/ir.interfaces.js'; -import {ToolState} from './components.interfaces.js'; +import {NewToolSettings, ToolState} from './components.interfaces.js'; // This list comes from executing // grep -rPo "eventHub\.(on|emit)\('.*'," static/ | cut -d "'" -f2 | sort | uniq @@ -164,7 +164,7 @@ export type EventMap = { toolInputChange: (compilerId: number, toolId: string, input: string) => void; toolInputViewClosed: (compilerId: number, toolId: string, input: string) => void; toolInputViewCloseRequest: (compilerId: number, toolId: string) => void; - toolOpened: (compilerId: number, toolState: unknown) => void; + toolOpened: (compilerId: number, toolState: NewToolSettings) => void; toolSettingsChange: (compilerId: number) => void; treeClose: (treeId: number) => void; treeCompilerEditorExcludeChange: (treeId: number, compilerId: number, editorId: number) => void; diff --git a/static/panes/compiler.ts b/static/panes/compiler.ts index 348913e1f..750153606 100644 --- a/static/panes/compiler.ts +++ b/static/panes/compiler.ts @@ -47,7 +47,7 @@ import {MonacoPaneState} from './pane.interfaces.js'; import {Hub} from '../hub.js'; import {Container} from 'golden-layout'; import {CompilerCurrentState, CompilerState} from './compiler.interfaces.js'; -import {ComponentConfig, ToolViewState} from '../components.interfaces.js'; +import {ComponentConfig, NewToolSettings, ToolViewState} from '../components.interfaces.js'; import {LanguageLibs} from '../options.interfaces.js'; import {GccDumpFiltersState, GccDumpViewSelectedPass} from './gccdump-view.interfaces.js'; import {AssemblyInstructionInfo} from '../../lib/asm-docs/base.js'; @@ -56,7 +56,7 @@ import {CompilationStatus} from '../compiler-service.interfaces.js'; import {WidgetState} from '../widgets/libs-widget.interfaces.js'; import {OptPipelineBackendOptions} from '../compilation/opt-pipeline-output.interfaces.js'; import { - ActiveTools, + ActiveTool, BypassCache, CompilationRequest, CompilationRequestOptions, @@ -112,12 +112,6 @@ function patchOldFilters(filters) { const languages = options.languages; -type NewToolSettings = { - toolId: number; - args: string[]; - stdin: string; -}; - type LinkedCode = { range: monaco.Range; options: { @@ -1204,7 +1198,7 @@ export class Compiler extends MonacoPane tool.id === toolId); } @@ -1496,7 +1490,7 @@ export class Compiler extends MonacoPane'); - this.assembly = asm; + this.assembly = asm as ResultLine[]; if (!this.editor.getModel()) return; const editorModel = this.editor.getModel(); if (editorModel) { @@ -2035,7 +2029,7 @@ export class Compiler extends MonacoPane`}].concat(devOutput.stderr), diff --git a/static/panes/diff.ts b/static/panes/diff.ts index 5fd7d8d20..cba99b52d 100644 --- a/static/panes/diff.ts +++ b/static/panes/diff.ts @@ -33,6 +33,7 @@ import {MonacoPaneState} from './pane.interfaces.js'; import {DiffState, DiffType} from './diff.interfaces.js'; import {CompilationResult} from '../../types/compilation/compilation.interfaces.js'; import {CompilerInfo} from '../../types/compiler.interfaces.js'; +import {ResultLine} from '../resultline/resultline.interfaces.js'; type DiffTypeAndExtra = { difftype: DiffType; @@ -104,7 +105,7 @@ class DiffStateObject { if (this.result) { switch (this.difftype) { case DiffType.ASM: - output = this.result.asm || []; + output = this.result.asm as ResultLine[]; break; case DiffType.CompilerStdOut: output = this.result.stdout; @@ -134,7 +135,7 @@ class DiffStateObject { break; case DiffType.DeviceView: if (this.result.devices && this.extraoption && this.extraoption in this.result.devices) { - output = this.result.devices[this.extraoption].asm || []; + output = this.result.devices[this.extraoption].asm as ResultLine[]; } break; case DiffType.AstOutput: diff --git a/static/panes/editor.ts b/static/panes/editor.ts index d01c218b8..b704625d6 100644 --- a/static/panes/editor.ts +++ b/static/panes/editor.ts @@ -1622,15 +1622,15 @@ export class Editor extends MonacoPane { - return device.asm ?? []; + return device.asm as ResultLine[]; }), ); } diff --git a/static/panes/tool.ts b/static/panes/tool.ts index 8f7bfac24..e8195088c 100644 --- a/static/panes/tool.ts +++ b/static/panes/tool.ts @@ -37,7 +37,7 @@ import {Hub} from '../hub.js'; import {Container} from 'golden-layout'; import {MonacoPaneState} from './pane.interfaces.js'; import {CompilerService} from '../compiler-service.js'; -import {ComponentConfig, PopulatedToolInputViewState, ToolState} from '../components.interfaces.js'; +import {ComponentConfig, NewToolSettings, PopulatedToolInputViewState, ToolState} from '../components.interfaces.js'; import {unwrap, unwrapString} from '../assert.js'; import {CompilationResult} from '../compilation/compilation.interfaces.js'; import {CompilerInfo} from '../compiler.interfaces.js'; @@ -356,7 +356,7 @@ export class Tool extends MonacoPane { preProcessBinaryAsmLines: lines => lines, }, bypassCache: 0, - tools: undefined, + tools: [], executeParameters: executionParameters, libraries: [], }, @@ -138,7 +138,7 @@ describe('Stats', () => { preProcessBinaryAsmLines: lines => lines, } as ParseFiltersAndOutputOptions, bypassCache: 0, - tools: undefined, + tools: [], executeParameters: executionParameters, libraries: [], }, diff --git a/types/compilation/compilation.interfaces.ts b/types/compilation/compilation.interfaces.ts index b675f7ceb..0afb684c6 100644 --- a/types/compilation/compilation.interfaces.ts +++ b/types/compilation/compilation.interfaces.ts @@ -41,8 +41,8 @@ import {ConfiguredOverrides} from './compiler-overrides.interfaces.js'; import {LLVMIrBackendOptions} from './ir.interfaces.js'; import {OptPipelineBackendOptions, OptPipelineOutput} from './opt-pipeline-output.interfaces.js'; -export type ActiveTools = { - id: number; +export type ActiveTool = { + id: string; args: string[]; stdin: string; }; @@ -115,7 +115,7 @@ export type CompilationRequestOptions = { }; executeParameters: ExecutionParams; filters: ParseFiltersAndOutputOptions; - tools: ActiveTools[]; + tools: ActiveTool[]; libraries: CompileChildLibraries[]; }; @@ -157,7 +157,8 @@ export type CompilationResult = { buildResult?: BuildResult; buildsteps?: BuildStep[]; inputFilename?: string; - asm?: ResultLine[]; + // Temp hack until we get all code to agree on type of asm + asm?: ResultLine[] | string; asmSize?: number; devices?: Record; stdout: ResultLine[]; @@ -251,40 +252,25 @@ export type BuildResult = CompilationResult & { code: number; }; +export type Arch = 'x86' | 'x86_64' | null; + export type BuildStep = BasicExecutionResult & { compilationOptions: string[]; step: string; }; -export type CompilationInfo = CompilationResult & { - mtime: Date | null; - compiler: CompilerInfo & Record; - args: string[]; - options: ExecutionOptions; - outputFilename: string; - executableFilename: string; - asmParser: IAsmParser; - inputFilename?: string; - dirPath?: string; -}; - -export type CustomInputForTool = { - inputFilename: string; - dirPath: string; - outputFilename: string; -}; - -export type CompilationInfo2 = CustomInputForTool & { - mtime: Date | null; - compiler: CompilerInfo & Record; - args: string[]; - options: ExecutionOptions; - outputFilename: string; - executableFilename: string; - asmParser: IAsmParser; - inputFilename?: string; - dirPath?: string; -}; +export type CompilationInfo = CacheKey & + CompilationResult & { + mtime: Date | null; + compiler: CompilerInfo & Record; + args: string[]; + options: string[]; + outputFilename: string; + executableFilename: string; + asmParser: IAsmParser; + inputFilename?: string; + dirPath?: string; + }; export type CompilationCacheKey = { mtime: any; diff --git a/types/compiler.interfaces.ts b/types/compiler.interfaces.ts index 6765bad38..810f6fe8d 100644 --- a/types/compiler.interfaces.ts +++ b/types/compiler.interfaces.ts @@ -23,6 +23,7 @@ // POSSIBILITY OF SUCH DAMAGE. import { + ActiveTool, BypassCache, CompilationResult, CompileChildLibraries, @@ -177,7 +178,7 @@ export interface ICompiler { backendOptions: Record, filters: ParseFiltersAndOutputOptions, bypassCache: BypassCache, - tools, + tools: ActiveTool[], executeParameters: ExecutionParams, libraries: CompileChildLibraries[], files: FiledataPair[],