Adapt isOutputLikelyLlvmIr for Rust (#8253)

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.
This commit is contained in:
narpfel
2025-11-15 17:16:35 +01:00
committed by GitHub
parent 5117cc089f
commit b5c0045556
2 changed files with 11 additions and 6 deletions

View File

@@ -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);

View File

@@ -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');
}
}