diff --git a/compiler.ts b/compiler.ts index 8cf72b0..e4c2220 100644 --- a/compiler.ts +++ b/compiler.ts @@ -45,20 +45,49 @@ export function functionList(module: string) { return result; } +/** + * CLI options used for llvm-extract executable. + */ +export interface ExtractOptions { + /** + * Functions to extract. + */ + func?: string[] + + /** + * Basic block specifiers. + */ + bb?: string[] + + output?: string + + /** + * Input file name. If unspecified, llvm-extract reads from stdin + */ + input?: string + + asm?: boolean +} + +export function extractCommand(options: ExtractOptions): string[] { + return [ + ...(options.func ?? []).flatMap(name => ["--func", name]), + ...(options.bb ?? []).flatMap(name => ["--bb", name]), + ...(options.output ? ["-o", options.output] : []), + ...(options.asm ? ["-S"] : []), + ...(options.input ? [options.input] : []) + ]; +} + /** * Extract one function using llvm-extract */ -export async function extract(name: string, module: string, out: (a: string) => string) { +export async function extract(options: ExtractOptions) { let process = child_process.spawn( - LLVM_EXTRACT, [ - "--func", - name, - "-S", - "-o", - out(name), - module - ], { stdio: "inherit" } + LLVM_EXTRACT, + extractCommand(options), + { stdio: "inherit" } ) const exitcode = await new Promise((resolve, reject) => { process.on('close', resolve) }) return exitcode