Source code for llvm_ir_dataset_utils.builders.autoconf_builder

"""Module for building and extracting bitcode from applications using autoconf"""

import os
import subprocess

from mlgo.corpus import extract_ir_lib

CONFIGURE_LOG_NAME = './configure.log'
BUILD_LOG_NAME = './build.log'


[docs]def generate_configure_command(root_path, options_dict): command_vector = [os.path.join(root_path, "configure")] for option in options_dict: command_vector.append(f"--{option}=\"{options_dict[option]}\"") return command_vector
[docs]def generate_build_command(threads): command_vector = ["make", f"-j{threads}"] return command_vector
[docs]def perform_build(configure_command_vector, build_command_vector, build_dir, corpus_dir): configure_env = os.environ.copy() configure_env["CC"] = "clang" configure_env["CXX"] = "clang++" configure_env["CFLAGS"] = "-Xclang -fembed-bitcode=all" configure_env["CXXFLAGS"] = "-Xclang -fembed-bitcode=all" configure_command = " ".join(configure_command_vector) configure_log_path = os.path.join(corpus_dir, CONFIGURE_LOG_NAME) with open(configure_log_path, 'w') as configure_log_file: configure_process = subprocess.run( configure_command, cwd=build_dir, env=configure_env, shell=True, stdout=configure_log_file, stderr=configure_log_file) configure_success = configure_process.returncode == 0 build_log_path = os.path.join(corpus_dir, BUILD_LOG_NAME) with open(build_log_path, 'w') as build_log_file: build_process = subprocess.run( build_command_vector, cwd=build_dir, stdout=build_log_file, stderr=build_log_file) build_success = build_process.returncode == 0 return { 'targets': [{ 'success': build_success and configure_success, 'build_log': BUILD_LOG_NAME, 'configure_log': CONFIGURE_LOG_NAME, 'name': os.path.basename(corpus_dir), 'build_success': build_success, 'configure_success': configure_success }] }
[docs]def extract_ir(build_dir, corpus_dir, threads): objects = extract_ir_lib.load_from_directory(build_dir, corpus_dir) relative_output_paths = extract_ir_lib.run_extraction(objects, threads, "llvm-objcopy", None, None, ".llvmcmd", ".llvmbc") extract_ir_lib.write_corpus_manifest(None, relative_output_paths, corpus_dir)