- 后端
- 前端
- 开发工具
【免费下载链接】compiler-explorer
Run compilers interactively from your web browser and interact with the assembly
Compiler Explorer(CE)除了支持 GCC、Clang 等主流编译器外,还可以通过.properties配置文件将厂商私有的嵌入式编译器接入其中。本文以 TI(德州仪器)C2000 系列 DSP 的官方 C2000 CGT 编译器为例,讲解如何在本地的 Compiler Explorer 实例中配置cl2000.exe、注册专用反符号器(demangler)并让汇编输出正常着色与行号映射。读完本文,你将能够独立完成一套可复现的 TI-C2000 本地编译环境搭建,并理解tic2000编译器类型在 CE 源码中的落地实现。
前置条件:先安装 C2000 编译器本体
在使用 Compiler Explorer 之前,你需要先获得一份有效的 TI C2000 编译器安装。TI 官方提供的 C2000 Code Generation Tools(C2000-CGT)包含:
cl2000.exe:C2000 系列(如 TMS320F28xxx 等 C28x 内核)的 C/C++ 编译器驱动;dem2000.exe:配套的符号反解码工具(demangler),用于将编译后生成的修饰符号名还原为可读的 C++ 名称;- 头文件与标准库目录(典型的安装路径下为
include子目录)。
本文原始文档基于22.6.0.LTS版本编写,安装路径示例为:
C:\ti\ccs1210\ccs\tools\compiler\ti-cgt-c2000_22.6.0.LTS该路径通常来自 Code Composer Studio(CCS)内置的编译器工具链目录。不同版本、不同安装位置的路径会有所差异,下文所有配置中的路径都需要替换为你自己的实际安装位置。
创建c++.local.properties配置文件
Compiler Explorer 的配置系统基于etc/config/目录下的.properties文件,采用CATEGORY.ENVIRONMENT.properties的命名约定(详见 Configuration.md)。其中c++.local.properties是本地个性化配置:它在配置级联中优先级最高,且被 git 忽略,不会污染仓库默认配置,因此非常适合存放个人本地的编译器定义。
在etc/config/目录下新建c++.local.properties,内容模板如下(对应 22.6.0.LTS 版本,请按需修改):
compilers=&c2000 # TI-C2000 Compilers group.c2000.compilers=c2k2260LTS group.c2000.versionFlag=-version group.c2000.supportsBinary=false group.c2000.intelAsm= group.c2000.compilerType=tic2000 group.c2000.demangler=C:\ti\ccs1210\ccs\tools\compiler\ti-cgt-c2000_22.6.0.LTS\bin\dem2000.exe group.c2000.demanglerType=tic2000 group.c2000.includeFlag=-I compiler.c2k2260LTS.exe=C:\ti\ccs1210\ccs\tools\compiler\ti-cgt-c2000_22.6.0.LTS\bin\cl2000.exe compiler.c2k2260LTS.options=-I"C:\ti\ccs1210\ccs\tools\compiler\ti-cgt-c2000_22.6.0.LTS\include" compiler.c2k2260LTS.name=C2000 22.6.0.LTS逐项拆解配置参数
对照 CE 的配置系统约定,各键含义如下:
| 配置键 | 类型 | 作用说明 |
|---|---|---|
compilers=&c2000 | 列表 | 顶层compilers列表声明该分类启用哪些编译器/编译器组,&c2000表示引用名为c2000的组(group) |
group.c2000.compilers=c2k2260LTS | 列表 | 组内实际包含的编译器 ID 列表 |
group.c2000.versionFlag=-version | String | 传给编译器用于获取版本信息的命令行参数(cl2000.exe -version) |
group.c2000.supportsBinary=false | Boolean | 关闭二进制输出支持。C2000 工具链产物为 COFF/ELF 目标文件,CE 对其二进制/可执行结果不做支持 |
group.c2000.intelAsm= | String | Intel 汇编语法附加参数,此处留空,表示不附加任何汇编风格参数 |
group.c2000.compilerType=tic2000 | String | 指定编译器处理器类型(handler),对应源码lib/compilers/下的实现类,此处必须为tic2000 |
group.c2000.demangler=...dem2000.exe | Path | 反符号器可执行文件路径,使用 TI 官方dem2000.exe |
group.c2000.demanglerType=tic2000 | String | 反符号器处理器类型,对应lib/demangler/下的实现类 |
group.c2000.includeFlag=-I | String | 头文件搜索路径参数。C2000 工具链使用-I,与 GCC 系一致 |
compiler.c2k2260LTS.exe=...cl2000.exe | Path | 具体编译器的可执行文件路径 |
compiler.c2k2260LTS.options=-I"..." | String | 附加默认编译选项,此处将安装目录下的include文件夹加入头文件搜索路径 |
compiler.c2k2260LTS.name=C2000 22.6.0.LTS | String | 在 CE 界面下拉框中显示给用户的编译器名称 |
几点实操提示:
- 如果安装目录中已包含头文件路径,
compiler.c2k2260LTS.options中的-I参数可以省略;保留它则更稳妥,能确保标准头文件可被找到。 - 组属性(
group.c2000.*)会被组内所有编译器继承;如果你后续添加多个 C2000 版本(如 c2k2270、c2k2280),只需在group.c2000.compilers中追加 ID,并补充对应的compiler.<id>.exe等条目即可。 - 路径中如包含空格,
-I参数请用引号包裹;这是 Windows 路径下最常见的配置坑。
源码视角:tic2000编译器类型如何工作
配置文件中的compilerType=tic2000并不是随意填写的字符串,它直接绑定到仓库源码中的处理器实现。在 lib/compilers/_all.ts 中导出了TIC2000类,其键(key)为tic2000:
export {TIC2000} from './tic2000.js';编译选项的组装
在 lib/compilers/tic2000.ts 中,TIC2000继承自BaseCompiler并覆写了optionsForFilter,为每次编译固定拼装以下参数:
override optionsForFilter(filters: ParseFiltersAndOutputOptions, outputFilename: string) { const options = ['-g', '-c', '-n', '--output_file=' + outputFilename]; filters.preProcessLines = this.preProcessLines.bind(this); return options; }各参数含义:
-g:生成调试信息(DWARF),这是后续 CE 将汇编行映射回源码行的基础;-c:只编译不链接,仅产出目标文件;-n:抑制编译进度信息输出;--output_file=<文件名>:显式指定输出文件名,由 CE 框架统一接管产物路径。
同时,输出文件名被规定为${outputFilebase}.asm(见 lib/compilers/tic2000.ts),即汇编输出以.asm扩展名返回给前端。
汇编行的预处理与源码映射
C2000 编译器产出的汇编代码中,源码位置信息由.dwpsn指令承载,其格式与 GCC 系编译器常用的.file/.loc不同。为了让 CE 标准汇编解析器能够正确着色并建立“汇编行 ↔ 源码行”的映射,lib/compilers/tic2000.ts 中的preProcessLines会用正则解析.dwpsn行:
const match = asmLines[i].match(/^\s*\.dwpsn\s+file\s+(".*"),line\s+(\d+),column\s+(\d+)/);一旦命中,就在该位置前插入两条标准格式指令:
.file 1 "源文件名" .loc 1 <行号> <列号>通过这一转换,tic2000的输出就被“翻译”成了 CE 通用解析器能够理解的行号信息格式,从而在界面上实现点击汇编行跳转到对应源码行的交互能力。
汇编解析器的适配
C2000 汇编中大量使用以$开头或以.开头的伪指令/宏标记。默认解析器会把它们当作普通指令处理,产生噪音。为此 lib/parsers/asm-parser-tic2000.ts 中的TiC2000AsmParser将“指令/伪操作”的正则放宽为:
this.directive = /^(\$+|\s*\.).*$/;即以$或.开头的行都被视为伪指令而不参与汇编指令统计,保证 C2000 特有汇编风格的输出在 CE 中正确过滤和展示。
反符号器(Demangler)的接入
C++ 编译后的符号名是经过修饰(mangled)的,CE 使用反符号器将其还原为可读形式。c++.local.properties中的group.c2000.demangler指向 TI 官方的dem2000.exe,group.c2000.demanglerType=tic2000则绑定到 lib/demangler/tic2000.ts:
export class TiC2000Demangler extends CppDemangler { static override get key() { return 'tic2000'; } constructor(demanglerExe: string, compiler: BaseCompiler) { super(demanglerExe, compiler, ['-q']); } }该类继承自通用 C++ 反符号器CppDemangler,仅额外追加了-q(安静模式)参数,即复用 C++ 反符号的整体流程,只是可执行文件换成 TI 的dem2000.exe。该实现在 lib/demangler/_all.ts 中被统一注册。
说明:
dem2000.exe需要与cl2000.exe来自同一版本的 C2000-CGT 安装,混用不同版本可能导致反符号失败。
验证与运行
完成配置后,按以下步骤验证:
- 启动本地实例:在仓库根目录执行
make dev(或参考仓库的构建说明),等待 CE 启动; - 选择语言与编译器:在页面语言下拉框中选择 C++,编译器下拉框中应出现
C2000 22.6.0.LTS(即name字段配置的名称); - 编译测试:输入一段简单的 C/C++ 代码(可参考 examples/c++/default.cpp),观察右侧汇编面板是否输出 C28x 指令;
- 检查符号还原:若代码使用了 C++ 特性(如重载、模板),确认汇编中的修饰符号能被还原为可读名称;
- 验证行号映射:点击汇编行,应能高亮对应源码行。
如果编译失败或编译器未出现在列表中,可以从配置解析入手排查:
- 使用
--prop-debug启动参数查看属性解析过程(详见 Configuration.md 中的“Debugging Configuration”一节); - 确认
cl2000.exe、dem2000.exe路径存在且可执行; - 确认
etc/config/c++.local.properties位于仓库根目录下正确的etc/config文件夹中; - 确认
compilerType=tic2000与demanglerType=tic2000拼写无误。
总结
将 TI C2000 编译器接入 Compiler Explorer 的完整链路是:
- 安装 C2000-CGT 工具链(
cl2000.exe+dem2000.exe); - 在 etc/config/c++.local.properties 中声明组
c2000与编译器c2k2260LTS,并正确填写路径、版本参数与tic2000处理器类型; - CE 通过 lib/compilers/tic2000.ts 中的
TIC2000处理器完成编译参数组装(-g -c -n --output_file=)与.dwpsn→.file/.loc的行号信息转换; - 通过 lib/parsers/asm-parser-tic2000.ts 过滤
$/.开头的伪指令,通过 lib/demangler/tic2000.ts 调用dem2000.exe完成符号还原。
这一模式同样适用于其他厂商私有编译器:只要实现对应的处理器类并在.local.properties中声明compilerType,即可复用 CE 成熟的编译、解析与展示框架。
- 后端
- 前端
- 开发工具
【免费下载链接】compiler-explorer
Run compilers interactively from your web browser and interact with the assembly
相关推荐
WePY 2 接入 TypeScript:@wepy/compiler-typescript 编译器安装、配置与源码原理详解
WePY 2 接入 TypeScript:@wepy/compiler typescript 编译器安装、配置与源码原理详解 WePY 2 小程序组件化开发框架
前端小程序开发工具在 Kilo Code 中使用 Anaconda Desktop 接入本地模型:完整配置与源码级原理指南
在 Kilo Code 中使用 Anaconda Desktop 接入本地模型:完整配置与源码级原理指南 本文是一份围绕 Kilo Code 集成 Anacon
人工智能大模型AI Agent代码智能体工具调用交互助手CLI在 AIRI 中接入 LM Studio 本地模型:从零配置到源码级原理
在 AIRI 中接入 LM Studio 本地模型:从零配置到源码级原理 导读 本文围绕 AIRI(自托管、用户自主掌控的 AI 伴侣项目)的「意识(Consc
AI 应用人工智能大模型数字人AI Agent语音前端后端桌面应用移动开发即时通讯3D渲染
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考