@@ -1350,6 +1350,143 @@ evalsoc的外设配置。
13501350
13511351|image130 |
13521352
1353+ GNU GCC工具链切换为Clang/ZCC工具链
1354+ ----------------------------------
1355+
1356+ Nuclei Studio IDE 支持三种工具链:``RISC-V GCC/Newlib ``、``RISC-V Clang/Newlib `` 和 ``Terapines ZCC ``。
1357+ 创建工程时,可以直接在 ``Toolchain `` 下拉框中选择所需工具链。
1358+
1359+ |image-gcc2llvm-1 |
1360+
1361+ 如果当前工程使用的是 GCC 工具链,而你希望切换到 Clang 或 ZCC 工具链,可以按以下步骤完成迁移:
1362+
1363+ 1. :ref: `切换工具链 <change_toolchain >` ;
1364+ 2. :ref: `调整编译选项和链接选项 <adjust_flags >` ;
1365+ 3. :ref: `调整链接库 <adjust_libs >` ;
1366+
1367+ .. _change_toolchain :
1368+
1369+ 切换工具链
1370+ ~~~~~~~~~~
1371+
1372+ 在 ``Project Explorer `` 中选中工程,右键选择 ``Properties `` 打开工程属性,然后进入 ``C/C++ Build -> Settings -> Toolchains ``。在 ``Name `` 下拉框中选择目标工具链即可。
1373+
1374+ |image-gcc2llvm-2 |
1375+
1376+ .. _adjust_flags :
1377+
1378+ 调整编译和链接选项
1379+ ~~~~~~~~~~~~~~~~~~
1380+
1381+ RISC-V Clang/Newlib
1382+ ^^^^^^^^^^^^^^^^^^^
1383+
1384+ 如果切换到 Clang 工具链,需要同步调整编译和链接选项,因为 Clang 并不完全兼容 GCC 的所有参数。
1385+
1386+ 以 CoreMark 工程为例,不同 CPU 系列使用的参数可能略有差异,但通常建议做以下调整:
1387+
1388+ 1. 将 ``Optimization Level `` 从 ``-Ofast `` 调整为 ``-O3 ``;
1389+ 2. 将 ``Extra Common Flags `` 替换为 ``-flto ``;
1390+ 3. 删除链接选项中的 ``-Wl,--no-warn-rwx-segments ``。
1391+
1392+ |image-gcc2llvm-3 |
1393+
1394+ Terapines ZCC
1395+ ^^^^^^^^^^^^^
1396+
1397+ 如果切换到 ZCC 工具链,建议按以下方式调整编译和链接选项:
1398+
1399+ 1. 将 ``Optimization Level `` 从 ``-Ofast `` 调整为 ``-O3 ``;
1400+ 2. 将 ``Extra Common Flags `` 替换为 ``-flto -falign-functions=4 -falign-loops=4 -flate-loop-unroll -malign-branch ``;
1401+ 3. 将链接选项改为 ``-Wl,-mllvm,--align-all-nofallthru-blocks=2 ``。
1402+
1403+ |image-gcc2llvm-4 |
1404+
1405+ .. _adjust_libs :
1406+
1407+ 调整链接库
1408+ ~~~~~~~~~~
1409+
1410+ 不同工具链依赖的库可能不同,因此切换后还需要检查并调整链接库。链接库可以在工程属性中的 ``C/C++ Build -> Settings -> Tool Settings -> GNU RISC-V Cross C++ Linker -> Libraries `` 中修改。
1411+
1412+ |image-gcc2llvm-5 |
1413+
1414+ 对于 Clang 工具链,Nuclei Studio 使用的仍是同一套 C 标准库,一般不需要额外修改链接库。因此,从 GCC 迁移到 Clang 时,通常只需完成前面的 :ref: `切换工具链<change_toolchain> ` 和 :ref: `调整编译和链接选项 <adjust_flags >` 两步,即可尝试重新编译工程。
1415+
1416+ 对于 ZCC 工具链,则需要进一步调整链接库名称。ZCC 仅支持 ``newlib_small `` 库,因此无论当前 GCC 工程使用的是 ``newlib_small `` 还是 ``libncrt_small ``,都可以将链接库统一改为 ``c_small `` 和 ``clang_rt.builtins_small ``。
1417+
1418+ |image-gcc2llvm-6 |
1419+
1420+ 如果当前工程链接的是 ``libncrt_small ``,还需要将 ``stubs.c `` 替换为 newlib 版本;如果工程原本使用的就是 newlib 库,则无需执行这一步。
1421+
1422+ 以基于 Nuclei SDK 创建的 EvalSoC 工程为例,可以先将 libncrt 版本的 ``stubs.c `` 排除构建。选中 ``SoC\\evalsoc\\Common\\Source\\Stubs\\libncrt ``,右键选择 ``Resource Configurations -> Exclude from Build... ``,然后从其他使用 newlib 库的工程中复制一份 newlib 版本的 ``stubs.c `` 到 ``Stubs `` 目录中。
1423+
1424+ |image-gcc2llvm-7 |
1425+
1426+ 完成 ``stubs.c `` 的调整后,从 GCC 迁移到 ZCC 的过程就完成了,此时可以尝试重新编译工程。
1427+
1428+ 常见问题
1429+ ~~~~~~~~
1430+
1431+ Clang/ZCC 与 GCC 的不兼容性
1432+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^
1433+
1434+ Clang/ZCC 工具链并不完全兼容 GCC 的编译选项。如果编译时报错,请参考 :ref: `调整编译和链接选项 <adjust_flags >` 进行调整。
1435+
1436+ .. code-block :: console
1437+
1438+ riscv64-unknown-elf-clang: error: unknown argument: '-fno-code-hoisting'
1439+ riscv64-unknown-elf-clang: error: unknown argument: '-fno-if-conversion'
1440+ riscv64-unknown-elf-clang: error: unknown argument: '-fno-if-conversion2'
1441+ riscv64-unknown-elf-clang: error: unknown argument: '-fselective-scheduling'
1442+ riscv64-unknown-elf-clang: error: unknown argument: '-fno-tree-loop-distribute-patterns'
1443+ riscv64-unknown-elf-clang: error: unknown argument: '-mbranch-cost=1'
1444+
1445+ Clang/ZCC 工具链不支持 ``-Wl,--no-warn-rwx-segments `` 链接选项。如果链接时报错,请参考 :ref: `调整编译和链接选项 <adjust_flags >` 进行调整。
1446+
1447+ .. code-block :: console
1448+
1449+ ld.lld: error: unknown argument '--no-warn-rwx-segments'
1450+ riscv64-unknown-elf-clang++: error: ld command failed with exit code 1 (use -v to see invocation)
1451+ make: *** [makefile:92: coremark.elf] Error 1
1452+
1453+ ZCC 链接失败
1454+ ^^^^^^^^^^^^
1455+
1456+ 从 GCC 切换到 ZCC 工具链时,如果没有正确调整链接库,可能会出现以下问题。可参考 :ref: `调整链接库 <adjust_libs >` 进行修改。
1457+
1458+ 如果原工程使用的是 ``newlib_small ``,但没有修改链接库,可能会出现以下错误:
1459+
1460+ .. code-block :: console
1461+
1462+ ld.lld: error: unable to find library -lstdc++
1463+ z++: error: ld command failed with exit code 1 (use -v to see invocation)
1464+ make: *** [makefile:92: coremark.elf] Error 1
1465+
1466+ 如果原工程使用的是 ``libncrt_small ``,但没有修改链接库,可能会出现以下错误:
1467+
1468+ .. code-block :: console
1469+
1470+ ld.lld: error: unable to find library -lncrt_small
1471+ ld.lld: error: unable to find library -lheapops_basic
1472+ ld.lld: error: unable to find library -lfileops_uart
1473+ ld.lld: error: unable to find library -lncrt_small
1474+ z++: error: ld command failed with exit code 1 (use -v to see invocation)
1475+ make: *** [makefile:92: coremark.elf] Error 1
1476+
1477+ 如果原工程使用的是 ``libncrt_small ``,虽然已经修改了链接库,但没有同步替换 ``stubs.c ``,则可能出现以下错误:
1478+
1479+ .. code-block :: console
1480+
1481+ ld.lld: error: undefined symbol: _read
1482+ >>> referenced by ld-temp.o
1483+ >>> coremark.elf.lto.o:(sys_semihost_getc)
1484+
1485+ ld.lld: error: undefined symbol: _write
1486+ >>> referenced by ld-temp.o
1487+ >>> coremark.elf.lto.o:(sys_semihost_putc)
1488+ z++: error: ld command failed with exit code 1 (use -v to see invocation)
1489+ make: *** [makefile:92: coremark.elf] Error 1
13531490
13541491 .. |image1 | image :: /asserts/nucleistudio/advanceusage/image2.png
13551492
@@ -1633,5 +1770,16 @@ evalsoc的外设配置。
16331770
16341771.. |image-nice-10 | image :: /asserts/nucleistudio/advanceusage/nice-10.png
16351772
1773+ .. |image-gcc2llvm-1 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-1.png
1774+
1775+ .. |image-gcc2llvm-2 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-2.png
1776+
1777+ .. |image-gcc2llvm-3 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-3.png
1778+
1779+ .. |image-gcc2llvm-4 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-4.png
1780+
1781+ .. |image-gcc2llvm-5 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-5.png
16361782
1783+ .. |image-gcc2llvm-6 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-6.png
16371784
1785+ .. |image-gcc2llvm-7 | image :: /asserts/nucleistudio/advanceusage/gcc2llvm-7.png
0 commit comments