From eb74bb8dbf74ac22a02e369b6622ee0ef8b5d6a3 Mon Sep 17 00:00:00 2001 From: Petr Machacek Date: Tue, 12 Sep 2023 09:11:50 +0200 Subject: [PATCH] Added support for Texas Instruments C6000 compiler. --- cross/ti-c6000.txt | 22 +++++++++++ docs/markdown/Reference-tables.md | 3 ++ .../snippets/ti_c6000_compiler_support.md | 4 ++ mesonbuild/build.py | 4 +- mesonbuild/compilers/c.py | 3 ++ mesonbuild/compilers/cpp.py | 3 ++ mesonbuild/compilers/detect.py | 38 ++++++++++++------- mesonbuild/compilers/mixins/clike.py | 4 ++ mesonbuild/envconfig.py | 1 + mesonbuild/linkers/linkers.py | 6 +++ 10 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 cross/ti-c6000.txt create mode 100644 docs/markdown/snippets/ti_c6000_compiler_support.md diff --git a/cross/ti-c6000.txt b/cross/ti-c6000.txt new file mode 100644 index 000000000000..f9361cfeacae --- /dev/null +++ b/cross/ti-c6000.txt @@ -0,0 +1,22 @@ +# Cross file tested on Texas Instruments C6000 compiler (bare metal DSP devices) +# This file assumes that path to the Texas Instruments C6000 toolchain is added +# to the environment(PATH) variable. + +[host_machine] +system = 'c6000' +cpu_family = 'c6000' +cpu = 'c64x' +endian = 'little' + +[binaries] +c = 'cl6x' +cpp = 'cl6x' +ar = 'ar6x' +strip = 'strip6x' +nm = 'nm6x' +as = 'asm6x' + +[properties] +needs_exe_wrapper = true +has_function_printf = true +bits = 32 diff --git a/docs/markdown/Reference-tables.md b/docs/markdown/Reference-tables.md index 02ac083e50b1..d30d22a50096 100644 --- a/docs/markdown/Reference-tables.md +++ b/docs/markdown/Reference-tables.md @@ -37,6 +37,7 @@ These are return values of the `get_id` (Compiler family) and | rustc | Rust compiler | | | sun | Sun Fortran compiler | | | c2000 | Texas Instruments C/C++ Compiler (C2000) | | +| c6000 | Texas Instruments C/C++ Compiler (C6000) | | | ti | Texas Instruments C/C++ Compiler | | | valac | Vala compiler | | | xc16 | Microchip XC16 C compiler | | @@ -70,6 +71,7 @@ These are return values of the `get_linker_id` method in a compiler object. | xc16-ar | The Microchip linker, used with XC16 only | | ar2000 | The Texas Instruments linker, used with C2000 only | | ti-ar | The Texas Instruments linker | +| ar6000 | The Texas Instruments linker, used with C6000 only | | armlink | The ARM linker (arm and armclang compilers) | | pgi | Portland/Nvidia PGI | | nvlink | Nvidia Linker used with cuda | @@ -105,6 +107,7 @@ set in the cross file. | arm | 32 bit ARM processor | | avr | Atmel AVR processor | | c2000 | 32 bit C2000 processor | +| c6000 | 32 bit C6000 processor | | csky | 32 bit CSky processor | | dspic | 16 bit Microchip dsPIC | | e2k | MCST Elbrus processor | diff --git a/docs/markdown/snippets/ti_c6000_compiler_support.md b/docs/markdown/snippets/ti_c6000_compiler_support.md new file mode 100644 index 000000000000..03533e6091cd --- /dev/null +++ b/docs/markdown/snippets/ti_c6000_compiler_support.md @@ -0,0 +1,4 @@ +## Support for Texas Instruments C6000 C/C++ compiler + +Meson now supports the TI C6000 C/C++ compiler use for the C6000 cpu family. +The example cross file is available in `cross/ti-c6000.txt`. diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 3c9d3a06c699..2b6ce8875f17 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -1976,8 +1976,8 @@ def post_init(self) -> None: self.suffix = 'abs' elif ('c' in self.compilers and self.compilers['c'].get_id().startswith('xc16')): self.suffix = 'elf' - elif ('c' in self.compilers and self.compilers['c'].get_id() in {'ti', 'c2000'} or - 'cpp' in self.compilers and self.compilers['cpp'].get_id() in {'ti', 'c2000'}): + elif ('c' in self.compilers and self.compilers['c'].get_id() in {'ti', 'c2000', 'c6000'} or + 'cpp' in self.compilers and self.compilers['cpp'].get_id() in {'ti', 'c2000', 'c6000'}): self.suffix = 'out' elif ('c' in self.compilers and self.compilers['c'].get_id() in {'mwccarm', 'mwcceppc'} or 'cpp' in self.compilers and self.compilers['cpp'].get_id() in {'mwccarm', 'mwcceppc'}): diff --git a/mesonbuild/compilers/c.py b/mesonbuild/compilers/c.py index a943552e1958..8c76a2147f0e 100644 --- a/mesonbuild/compilers/c.py +++ b/mesonbuild/compilers/c.py @@ -735,6 +735,9 @@ class C2000CCompiler(TICCompiler): # Required for backwards compat with projects created before ti-cgt support existed id = 'c2000' +class C6000CCompiler(TICCompiler): + id = 'c6000' + class MetrowerksCCompilerARM(MetrowerksCompiler, CCompiler): id = 'mwccarm' diff --git a/mesonbuild/compilers/cpp.py b/mesonbuild/compilers/cpp.py index 0ff89a3eae61..c5c2735ad6f6 100644 --- a/mesonbuild/compilers/cpp.py +++ b/mesonbuild/compilers/cpp.py @@ -960,6 +960,9 @@ class C2000CPPCompiler(TICPPCompiler): # Required for backwards compat with projects created before ti-cgt support existed id = 'c2000' +class C6000CPPCompiler(TICPPCompiler): + id = 'c6000' + class MetrowerksCPPCompilerARM(MetrowerksCompiler, CPPCompiler): id = 'mwccarm' diff --git a/mesonbuild/compilers/detect.py b/mesonbuild/compilers/detect.py index c117c22bbd7b..f047242ca31b 100644 --- a/mesonbuild/compilers/detect.py +++ b/mesonbuild/compilers/detect.py @@ -198,6 +198,8 @@ def detect_static_linker(env: 'Environment', compiler: Compiler) -> StaticLinker if any(os.path.basename(x) in {'lib', 'lib.exe', 'llvm-lib', 'llvm-lib.exe', 'xilib', 'xilib.exe'} for x in linker): arg = '/?' + elif linker_name in {'ar2000', 'ar2000.exe', 'ar430', 'ar430.exe', 'armar', 'armar.exe', 'ar6x', 'ar6x.exe'}: + arg = '?' else: arg = '--version' try: @@ -231,6 +233,9 @@ def detect_static_linker(env: 'Environment', compiler: Compiler) -> StaticLinker return linkers.C2000Linker(linker) else: return linkers.TILinker(linker) + if 'Texas Instruments Incorporated' in out: + if 'ar6000' in linker_name: + return linkers.C6000Linker(linker) if out.startswith('The CompCert'): return linkers.CompCertLinker(linker) if out.strip().startswith('Metrowerks') or out.strip().startswith('Freescale'): @@ -308,7 +313,7 @@ def sanitize(p: str) -> str: arg = '--version' elif 'ccomp' in compiler_name: arg = '-version' - elif compiler_name in {'cl2000', 'cl2000.exe', 'cl430', 'cl430.exe', 'armcl', 'armcl.exe'}: + elif compiler_name in {'cl2000', 'cl2000.exe', 'cl430', 'cl430.exe', 'armcl', 'armcl.exe', 'cl6x', 'cl6x.exe'}: # TI compiler arg = '-version' elif compiler_name in {'icl', 'icl.exe'}: @@ -428,6 +433,24 @@ def sanitize(p: str) -> str: return cls( compiler, version, for_machine, is_cross, info, target, exe_wrap, linker=linker) + + # must be detected here before clang because TI compilers contain 'clang' in their output and so that they can be detected as 'clang' + ti_compilers = { + 'TMS320C2000 C/C++': (c.C2000CCompiler, cpp.C2000CPPCompiler, linkers.C2000DynamicLinker), + 'TMS320C6x C/C++': (c.C6000CCompiler, cpp.C6000CPPCompiler, linkers.C6000DynamicLinker), + 'TI ARM C/C++ Compiler': (c.TICCompiler, cpp.TICPPCompiler, linkers.TIDynamicLinker), + 'MSP430 C/C++': (c.TICCompiler, cpp.TICPPCompiler, linkers.TIDynamicLinker) + } + for indentifier, compiler_classes in ti_compilers.items(): + if indentifier in out: + cls = compiler_classes[0] if lang == 'c' else compiler_classes[1] + lnk = compiler_classes[2] + env.coredata.add_lang_args(cls.language, cls, for_machine, env) + linker = lnk(compiler, for_machine, version=version) + return cls( + ccache, compiler, version, for_machine, is_cross, info, + exe_wrap, full_version=full_version, linker=linker) + if 'clang' in out or 'Clang' in out: linker = None @@ -525,19 +548,6 @@ def sanitize(p: str) -> str: return cls( ccache, compiler, version, for_machine, is_cross, info, exe_wrap, full_version=full_version, linker=l) - if 'TMS320C2000 C/C++' in out or 'MSP430 C/C++' in out or 'TI ARM C/C++ Compiler' in out: - if 'TMS320C2000 C/C++' in out: - cls = c.C2000CCompiler if lang == 'c' else cpp.C2000CPPCompiler - lnk = linkers.C2000DynamicLinker - else: - cls = c.TICCompiler if lang == 'c' else cpp.TICPPCompiler - lnk = linkers.TIDynamicLinker - - env.coredata.add_lang_args(cls.language, cls, for_machine, env) - linker = lnk(compiler, for_machine, version=version) - return cls( - ccache, compiler, version, for_machine, is_cross, info, - exe_wrap, full_version=full_version, linker=linker) if 'ARM' in out and not ('Metrowerks' in out or 'Freescale' in out): cls = c.ArmCCompiler if lang == 'c' else cpp.ArmCPPCompiler env.coredata.add_lang_args(cls.language, cls, for_machine, env) diff --git a/mesonbuild/compilers/mixins/clike.py b/mesonbuild/compilers/mixins/clike.py index 25feb5c3866c..5e6adedcf459 100644 --- a/mesonbuild/compilers/mixins/clike.py +++ b/mesonbuild/compilers/mixins/clike.py @@ -1052,6 +1052,10 @@ def get_library_naming(self, env: 'Environment', libtype: LibType, strict: bool elif env.machines[self.for_machine].is_cygwin(): shlibext = ['dll', 'dll.a'] prefixes = ['cyg'] + prefixes + elif self.id.lower() == 'c6000' or self.id.lower() == 'ti': + # TI C6000 compiler can use both extensions for static or dynamic libs. + stlibext = ['a', 'lib'] + shlibext = ['dll', 'so'] else: # Linux/BSDs shlibext = ['so'] diff --git a/mesonbuild/envconfig.py b/mesonbuild/envconfig.py index 0e9cd23cc736..86bad9be23ee 100644 --- a/mesonbuild/envconfig.py +++ b/mesonbuild/envconfig.py @@ -34,6 +34,7 @@ 'arm', 'avr', 'c2000', + 'c6000', 'csky', 'dspic', 'e2k', diff --git a/mesonbuild/linkers/linkers.py b/mesonbuild/linkers/linkers.py index 2048268193a5..657e3618bbd5 100644 --- a/mesonbuild/linkers/linkers.py +++ b/mesonbuild/linkers/linkers.py @@ -492,6 +492,9 @@ class C2000Linker(TILinker): # Required for backwards compat with projects created before ti-cgt support existed id = 'ar2000' +class C6000Linker(TILinker): + id = 'ar6000' + class AIXArLinker(ArLikeLinker, StaticLinker): id = 'aixar' @@ -1094,6 +1097,9 @@ class C2000DynamicLinker(TIDynamicLinker): # Required for backwards compat with projects created before ti-cgt support existed id = 'cl2000' +class C6000DynamicLinker(TIDynamicLinker): + id = 'cl6000' + class ArmDynamicLinker(PosixDynamicLinkerMixin, DynamicLinker):