From 5ec86cafd884eeee1ac432d8c36e65f5b9cb8eed Mon Sep 17 00:00:00 2001 From: "Wu, Zhenyu" Date: Mon, 9 Dec 2024 21:41:29 +0800 Subject: [PATCH] Add Linear ASM compiler Fix #13670 --- docs/markdown/Reference-tables.md | 34 ++++++++++++----------- mesonbuild/compilers/asm.py | 46 +++++++++++++++++++++++++++++++ mesonbuild/compilers/compilers.py | 1 + mesonbuild/compilers/detect.py | 18 ++++++++++++ 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/docs/markdown/Reference-tables.md b/docs/markdown/Reference-tables.md index 0cf8bcfd73a2..3cd142c23e22 100644 --- a/docs/markdown/Reference-tables.md +++ b/docs/markdown/Reference-tables.md @@ -49,6 +49,7 @@ These are return values of the `get_id` (Compiler family) and | armasm | Microsoft Macro Assembler for ARM and AARCH64 (Since 0.64.0) | | | mwasmarm | Metrowerks Assembler for Embedded ARM | | | mwasmeppc | Metrowerks Assembler for Embedded PowerPC | | +| cl6x | Texas Instruments linear assembler | | ## Linker ids @@ -213,22 +214,23 @@ Meson natively. These are the parameter names for passing language specific arguments to your build target. -| Language | compiler name | linker name | -| ------------- | ------------- | ----------------- | -| C | c_args | c_link_args | -| C++ | cpp_args | cpp_link_args | -| C# | cs_args | cs_link_args | -| CUDA | cuda_args | cuda_link_args | -| D | d_args | d_link_args | -| Fortran | fortran_args | fortran_link_args | -| Java | java_args | java_link_args | -| Objective C | objc_args | objc_link_args | -| Objective C++ | objcpp_args | objcpp_link_args | -| Rust | rust_args | rust_link_args | -| Vala | vala_args | vala_link_args | -| Cython | cython_args | cython_link_args | -| NASM | nasm_args | N/A | -| MASM | masm_args | N/A | +| Language | compiler name | linker name | +| ------------- | -------------- | ----------------- | +| C | c_args | c_link_args | +| C++ | cpp_args | cpp_link_args | +| C# | cs_args | cs_link_args | +| CUDA | cuda_args | cuda_link_args | +| D | d_args | d_link_args | +| Fortran | fortran_args | fortran_link_args | +| Java | java_args | java_link_args | +| Objective C | objc_args | objc_link_args | +| Objective C++ | objcpp_args | objcpp_link_args | +| Rust | rust_args | rust_link_args | +| Vala | vala_args | vala_link_args | +| Cython | cython_args | cython_link_args | +| NASM | nasm_args | N/A | +| MASM | masm_args | N/A | +| Linear ASM | linearasm_args | N/A | All these `_*` options are specified per machine. See in [specifying options per diff --git a/mesonbuild/compilers/asm.py b/mesonbuild/compilers/asm.py index 8cd5e28dc47f..1b877bc245ba 100644 --- a/mesonbuild/compilers/asm.py +++ b/mesonbuild/compilers/asm.py @@ -259,6 +259,52 @@ def depfile_for_object(self, objfile: str) -> T.Optional[str]: return None +class LinearAsmCompiler(Compiler): + language = 'linearasm' + id = 'cl6x' + + def needs_static_linker(self) -> bool: + return True + + def get_always_args(self) -> T.List[str]: + return [] + + def get_werror_args(self) -> T.List[str]: + return [] + + def get_output_args(self, outputname: str) -> T.List[str]: + return ['--output_file=', outputname] + + def get_optimization_args(self, optimization_level: str) -> T.List[str]: + return [] + + def get_debug_args(self, is_debug: bool) -> T.List[str]: + if is_debug: + return ['-g'] + return [] + + def get_pic_args(self) -> T.List[str]: + return [] + + def get_include_args(self, path: str, is_system: bool) -> T.List[str]: + if not path: + path = '.' + return ['-I=' + path] + + def compute_parameters_with_absolute_paths(self, parameter_list: T.List[str], + build_dir: str) -> T.List[str]: + for idx, i in enumerate(parameter_list): + if i[:2] == '-I': + parameter_list[idx] = i[:2] + os.path.normpath(os.path.join(build_dir, i[2:])) + return parameter_list + + def get_crt_compile_args(self, crt_val: str, buildtype: str) -> T.List[str]: + return [] + + def depfile_for_object(self, objfile: str) -> T.Optional[str]: + return None + + class MetrowerksAsmCompiler(MetrowerksCompiler, Compiler): language = 'nasm' diff --git a/mesonbuild/compilers/compilers.py b/mesonbuild/compilers/compilers.py index 603a3eb484de..4c6979e175ce 100644 --- a/mesonbuild/compilers/compilers.py +++ b/mesonbuild/compilers/compilers.py @@ -69,6 +69,7 @@ 'cython': ('pyx', ), 'nasm': ('asm', 'nasm',), 'masm': ('masm',), + 'linearasm': ('sa',), } all_languages = lang_suffixes.keys() c_cpp_suffixes = {'h'} diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py index 7542fb6283a2..2fc0f1edeece 100644 --- a/mesonbuild/compilers/detect.py +++ b/mesonbuild/compilers/detect.py @@ -98,6 +98,7 @@ def compiler_from_language(env: 'Environment', lang: str, for_machine: MachineCh 'cython': detect_cython_compiler, 'nasm': detect_nasm_compiler, 'masm': detect_masm_compiler, + 'linearasm': detect_linearasm_compiler, } return lang_map[lang](env, for_machine) if lang in lang_map else None @@ -1353,6 +1354,23 @@ def detect_masm_compiler(env: 'Environment', for_machine: MachineChoice) -> Comp _handle_exceptions(popen_exceptions, [comp]) raise EnvironmentException('Unreachable code (exception to make mypy happy)') +def detect_linearasm_compiler(env: 'Environment', for_machine: MachineChoice) -> Compiler: + from .asm import LinearAsmCompiler + comp = ['cl6x'] + comp_class: T.Type[Compiler] = LinearAsmCompiler + arg = '-h' + + popen_exceptions: T.Dict[str, Exception] = {} + try: + output = Popen_safe(comp + [arg])[2] + version = search_version(output) + env.coredata.add_lang_args(comp_class.language, comp_class, for_machine, env) + return comp_class([], comp, version, for_machine, info, cc.linker, is_cross=is_cross) + except OSError as e: + popen_exceptions[' '.join(comp + [arg])] = e + _handle_exceptions(popen_exceptions, [comp]) + raise EnvironmentException('Unreachable code (exception to make mypy happy)') + # GNU/Clang defines and version # =============================