From b5c0045556d9fcabf5e9f365d08055399c0609b4 Mon Sep 17 00:00:00 2001 From: narpfel Date: Sat, 15 Nov 2025 17:16:35 +0100 Subject: [PATCH] Adapt `isOutputLikelyLlvmIr` for Rust (#8253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The existing heuristics don’t reliably recognise LLVM IR produced by `rustc` (e. g. when the generated code does not use any LLVM intrinsics), so this adds LLVM IR detection based on the `--emit=llvm-ir` and `--emit llvm-ir` command line flags. --- lib/base-compiler.ts | 12 ++++++------ lib/compilers/rust.ts | 5 +++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/base-compiler.ts b/lib/base-compiler.ts index dcc6a8dab..9f5bc2cf7 100644 --- a/lib/base-compiler.ts +++ b/lib/base-compiler.ts @@ -182,10 +182,6 @@ export interface SimpleOutputFilenameCompiler { getOutputFilename(dirPath: string): string; } -function isOutputLikelyLllvmIr(compilerOptions: string[]): boolean { - return compilerOptions && (compilerOptions.includes('-emit-llvm') || compilerOptions.includes('-mlir-to-llvmir')); -} - export class BaseCompiler { public compiler: CompilerInfo; public lang: Language; @@ -3258,7 +3254,7 @@ export class BaseCompiler { if (this.compiler.supportsCfg && backendOptions.produceCfg && backendOptions.produceCfg.asm) { const isLlvmIr = this.compiler.instructionSet === 'llvm' || - (options && isOutputLikelyLllvmIr(options)) || + (options && this.isOutputLikelyLlvmIr(options)) || this.llvmIr.isLlvmIr(result.asm); result.cfg = await cfg.generateStructure(this.compiler, result.asm, isLlvmIr, result); } @@ -3372,10 +3368,14 @@ export class BaseCompiler { return result; } + protected isOutputLikelyLlvmIr(compilerOptions: string[]): boolean { + return compilerOptions.includes('-emit-llvm') || compilerOptions.includes('-mlir-to-llvmir'); + } + async processAsm(result, filters: ParseFiltersAndOutputOptions, options: string[]) { if ( result.languageId === 'llvm-ir' || - (options && isOutputLikelyLllvmIr(options)) || + (options && this.isOutputLikelyLlvmIr(options)) || this.llvmIr.isLlvmIr(result.asm) ) { return await this.llvmIr.processFromFilters(result.asm, filters); diff --git a/lib/compilers/rust.ts b/lib/compilers/rust.ts index 1526aee0e..7e174db97 100644 --- a/lib/compilers/rust.ts +++ b/lib/compilers/rust.ts @@ -338,4 +338,9 @@ export class RustCompiler extends BaseCompiler { ); return super.runCompiler(compiler, newOptions, inputFilename, execOptions); } + + override isOutputLikelyLlvmIr(options: string[]): boolean { + const emitIndex = options.indexOf('--emit'); + return options.includes('--emit=llvm-ir') || (emitIndex >= 0 && options[emitIndex + 1] == 'llvm-ir'); + } }