有没有办法用ClangLLVM编译Linux内核

黄玲娜 2019-12-21 20:05:00

推荐回答

转自知乎蓝色我最近和Clang/LLVM打交道比较多,目前游离在LLVMIR和IBMWCode之间。对于学习Clang/LLVM来说,其实需要看你做什么,是研究C,C++,Objective-C在Clang的实现,抑或着是想利用Clang做AST层面的事情,还是说想要利用LLVMIR来做一些事情,抑或着你是想要添加LLVM优化,还是说想要为LLVM添加新的体系结构支持.......Clang/LLVM现在都很大了,所以需要了解好自己想要的是什么,然后去针对的阅读,而非直接就开始一大块的开始,这实在是太大了。而在阅读源代码之前,无论如何,首先是需要基本的编译原理知识。你需要知道我们编译器的几个基本步骤,如词法分析,语法分析,语意分析,代码生成等过程,有了这个基本的思路,你才不至于迷失在Clang的浩海代码中,如看见Sema,AST,CodeGen这样的字眼你也能对应上这是哪个阶段的,若你想要了解C,C++,Objective-C等的实现,大部分都要集中在Lexer,Parser,AST,Sema等部分。与此同时,若你想要理清楚,明白为什么这么实现,如C++。那么,你还需要备一份C++标准,并且熟悉C++标准的常用语,至少可以分清楚Declaration,Definition,L-Value,R-Value等,因为你会看见Clang有很多Decl,若不理解Declaration,你很难理解为什么会有这么多Decl冒出来。而这一部分代码的阅读,我会推荐当你想要了解某一部分的实现时再去挑着读,而非挨着挨着读。而若你如我一样,需要直接面对LLVMIR,那么你更多需要的是学习LLVMIRLanguage,即LLVMLanguageReferenceManual,但是我知道直接看这样的文档是抽象的,是无趣的,我也如此。那么其实最好的办法就是从C/C++程序dump出.ll文件,然后阅读它,修改它,看看会发生什么。同时,在这个阶段,你需要更多的有关链接器,ObjectFile,SymbolTable等知识,这样才能更好的做这件事情。而这阶段的代码,主要都是都在ClangCodeGen里面,所以你要阅读代码这部分是比较集中的,但是你要完整理清楚,你还是不可避免的需要从Driver等部分开始,但是你若是只想知道IR,大部分在CodeGen,Clang的源码大多是CG****。若你是做LLVM后端的话,这部分我了解的比较少,但是LLVM最好的地方就是它文档还算好,如我立马就找到了一个相关的东西:WritinganLLVMBackend然后空明大神补了一个:TheLLVMTarget-IndependentCodeGenerator。
赵风英2019-12-21 20:20:32

提示您:回答为网友贡献,仅供参考。

其他回答

  • 1,Buildllvm/clang/lldb/lld3.5.0等组件1.0准备:至少需要从llvm.org下载llvm,cfe,lldb,compiler-rt,lld等3.5.0版本的代码。$tarxfllvm-3.5.0.src.tar.gz$cdllvm-3.5.0.src$mkdir-ptools/clang$mkdir-ptools/clang/tools/extra$mkdir-ptools/lld$mkdir-pprojects/compiler-rt$tarxfcfe-3.5.0.src.tar.xz-Ctools/clang--strip-components=1$tarxfcompiler-rt-3.5.0.src.tar.xz-Cprojects/compiler-rt--strip-components=1$tarxflldb-3.5.0.src.tar.xz-Ctools/clang/tools/extra--strip-components=1$tarxflld-3.5.0.src.tar.xz-Ctools/lld--strip-components=11.1给clang++添加-fnolibgcc开关。这个开关主要用来控制是否连接到libgcc或者libunwind。注:libgcc不等于libunwind。libgcc_eh以及supc++的一部分跟libunwind功能相当。注:libgcc_s和compiler_rt的一部分相当。这个补丁是必要的,不会对clang的正常使用造成任何影响,只有在使用“-fnolibgcc"参数时才会起作用。之所以进行了很多unwind的引入,主要是为了避免不必要的符号缺失麻烦,这里的处理相对来说是干净的,通过as-needed规避了不必要的引入。llvm-static-3.5.0.bak/tools/clang/lib/Driver/Tools.cpp2019-09-1013:46:02.581543888+0800+++llvm-static-3.5.0/tools/clang/lib/Driver/Tools.cpp2019-09-1016:03:37.559019321+0800@@-2060,9+2060,15@@".a";CmdArgs.push_backArgs.MakeArgStringLibClangRT;-CmdArgs.push_back"-lgcc_s";-ifTC.getDriver.CCCIsCXX-CmdArgs.push_back"-lgcc_eh";+ifArgs.hasArgoptions::OPT_fnolibgcc{+CmdArgs.push_back"--as-needed";+CmdArgs.push_back"-lunwind";+CmdArgs.push_back"--no-as-needed";+}else{+CmdArgs.push_back"-lgcc_s";+ifTC.getDriver.CCCIsCXX+CmdArgs.push_back"-lgcc_eh";+}}staticvoidaddProfileRT@@-7150,24+7156,50@@boolisAndroid=Triple.getEnvironment==llvm::Triple::Android;boolStaticLibgcc=Args.hasArgoptions::OPT_static_libgcc||Args.hasArgoptions::OPT_static;+++if!D.CCCIsCXX-CmdArgs.push_back"-lgcc";+ifArgs.hasArgoptions::OPT_fnolibgcc{+CmdArgs.push_back"--as-needed";+CmdArgs.push_back"-lunwind";+CmdArgs.push_back"--no-as-needed";+}else+CmdArgs.push_back"-lgcc";ifStaticLibgcc||isAndroid{ifD.CCCIsCXX-CmdArgs.push_back"-lgcc";+ifArgs.hasArgoptions::OPT_fnolibgcc{+CmdArgs.push_back"--as-needed";+CmdArgs.push_back"-lunwind";+CmdArgs.push_back"--no-as-needed";+}else+CmdArgs.push_back"-lgcc";}else{if!D.CCCIsCXXCmdArgs.push_back"--as-needed";-CmdArgs.push_back"-lgcc_s";+ifArgs.hasArgoptions::OPT_fnolibgcc+CmdArgs.push_back"-lunwind";+else+CmdArgs.push_back"-lgcc_s";if!D.CCCIsCXXCmdArgs.push_back"--no-as-needed";}ifStaticLibgcc&&!isAndroid-CmdArgs.push_back"-lgcc_eh";+ifArgs.hasArgoptions::OPT_fnolibgcc{+CmdArgs.push_back"--as-needed";+CmdArgs.push_back"-lunwind";+CmdArgs.push_back"--no-as-needed";+}else+CmdArgs.push_back"-lgcc_eh";elseif!Args.hasArgoptions::OPT_shared&&D.CCCIsCXX-CmdArgs.push_back"-lgcc";+ifArgs.hasArgoptions::OPT_fnolibgcc{+CmdArgs.push_back"--as-needed";+CmdArgs.push_back"-lunwind";+CmdArgs.push_back"--no-as-needed";+}else+CmdArgs.push_back"-lgcc";//AccordingtoAndroidABI,wehavetolinkwithlibdlifweare//linkingwithnon-staticlibgcc.---llvm-static-3.5.0.bak/tools/clang/include/clang/Driver/Options.td2019-08-0712:51:51.000000000+0800+++llvm-static-3.5.0/tools/clang/include/clang/Driver/Options.td2019-09-1013:36:34.598511176+0800@@-788,6+788,7@@deffomit_frame_pointer:Flag,Group;deffopenmp:Flag,Group,Flags;deffopenmp_EQ:Joined,Group,Flags;+deffnolibgcc:Flag,Group,Flags;deffno_optimize_sibling_calls:Flag,Group;deffoptimize_sibling_calls:Flag,Group;defforce__cpusubtype__ALL:Flag;1.3llvm的其他补丁。llvm/clang将gcctoolchain的路径hardcode在代码中,请查阅tools/clang/lib/Driver/ToolChains.cpp。找到x86_64-redhat-linux之类的字符串。如果没有你系统特有的gcctripplestring,请自行添加。这个tripplestring主要是给llvm/clang搜索gcc头文件等使用的,不影响本文要构建的toolchain1.4构建clang/llvm/lldb本文使用ninja。顺便说一下,llvm支持configure和cmake两种构建方式。可能是因为工程太大,这两种构建方式的工程文件都有各种缺陷。
    黄生香2019-12-21 21:18:47
  • Xcode中最开始使用的是GCC,后来开始引入LLVM后端,再后来引入Clang前端,再后来Clang/LLVM成为默认,然后从Xcode5.0版本以后,Clang/LLVM是唯一提供的编译器套件。
    齐新燕2019-12-21 20:55:26
  • 就目前我编译过的来说,6g内存,80硬盘在97的时候内存溢出,试试7g,120硬盘并且增大swap空间。
    齐景坤2019-12-21 20:38:07

相关问答