Skip to content

Commit 6730485

Browse files
committed
doc: Add user guide about how to migrate toolchain from gcc to clang/zcc
Signed-off-by: Jiandong Qiu <qiujiandong@nucleisys.com>
1 parent d37873a commit 6730485

8 files changed

Lines changed: 148 additions & 0 deletions

File tree

30.9 KB
Loading
66.4 KB
Loading
149 KB
Loading
155 KB
Loading
143 KB
Loading
46.8 KB
Loading
20.5 KB
Loading

source/ide/advanceusage.rst

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)