开发环境¶
OS:虚拟机Ubuntu-20.04
磁盘分区:(200G)
- /boot——2G
- sawp——20G
- /——其余
工具:cmake / ninja-build / build-essential
库:zlib1g-dev / libncurses-dev
内网代码库地址:172.18.14.26:3000
LLVM版本:9.0.1
Cmake在LLVM中的使用¶
-
add_subdirectory():指定本项目包含一个子目录,使得该子目录下的 CMakeLists.txt 文件和源代码也会被处理 -
add_clang_library():
定义在clang/cmake/modules/AddClang.cmake中的宏,其中LINK_LIBS即target_link_libraries。
LINK_LIBS在llvm/cmake/modules/AddLLVM.cmake中定义
Clang模块列表¶
CodeGen¶
-
裁剪方向:
-
与目标语言(OpenCL)无关的编程语言:Cuda、ObjectC、OpenMP
- 内容修改——cuda
- 注释CodeGen中cuda相关内容
- 取消CodeGen/CMakeLists.txt中CGCUDANV.cpp / CGCUDARuntime.cpp文件的编译
- 内容修改——OpenMP
- 注释CodeGen中与OpenMP相关内容
- 取消CodeGen/CMakeLists.txt中CGOpenMPRuntime.cpp / CGOpenMPRuntimeNVPTX.cpp / CGStmtOpenMP.cpp文件的编译
- 内容修改——ObjectC
- 注释CodeGen中与ObjectC相关内容
-
取消CodeGen/CMakeLists.txt中CGObjCGNU.cpp / CGObjCMac.cpp文件的编译
-
内容修改——TargetInfo.cpp
-
修改CodeGen/TargetInfo.cpp中与目标架构无关内容
-
ObjectC中的ARC
ARC指的是“Automatic Reference Counting”,是Objective-C中的一种自动内存管理机制。它可以自动追踪和管理对象的引用计数,从而避免了手动管理引用计数的繁琐和容易出错的问题。
在ARC模式下,编译器会自动插入retain、release和autorelease等操作,从而自动管理对象的引用计数。开发者只需要专注于对象的创建和使用,无需再手动去管理引用计数。
Frontend¶
Parse¶
-
裁剪方向:
-
与目标语言(OpenCL)无关的编程语言:ObjectC、OpenMP
-
内容修改——ObjectC
-
注释Parse中ObjectC相关内容
-
取消Parse/CMakeLists.txt中ParseObjc.cpp文件的编译
-
内容修改——OpenMP
-
注释Parse中OpenMP相关内容
- 取消Parse/CMakeLists.txt中ParseOpenMP.cpp文件的编译
Sema¶
-
裁剪方向:
-
与目标语言(OpenCL)无关的编程语言:Cuda、ObjectC、OpenMP
-
内容修改——cuda
-
注释Sema中cuda相关内容
-
取消Sema/CMakeLists.txt中SemaCUDA.cpp文件的编译
-
内容修改——OpenMP
-
注释Sema中OpenMP相关内容
-
取消Sema/CMakeLists.txt中SemaOpenMP.cpp文件的编译
-
CodeComplete
-
功能:负责实现代码自动补全功能。代码自动补全是一种开发工具中常用的功能,它可以帮助程序员快速输入代码并减少输入错误。
- 相关文文件:
CodeCompleteConsumer.cpp/SemaCodeComplete.cpp -
代码主要内容:代码自动补全的主要算法和数据结构。它通过使用语义分析技术和代码索引技术,为用户提供高质量的代码自动补全建议。
-
内容修改——CodeComplete
-
注释Sema中CodeComplete相关内容
-
取消Sema/CMakeLists.txt中CodeCompleteConsumer.cpp / SemaCodeComplete.cpp文件的编译
Analysis¶
- 功能描述
静态分析工具,主要用于检测C++代码中的潜在问题和错误。Analysis使用符号执行和数据流分析等技术,对代码进行分析,并生成分析报告,帮助开发人员发现和修复代码中的问题。常用于各种IDE中。
-
内容修改
-
Sema.cpp:371中使用的threadSafetyCleanup函数替换为delete
- SemaExprObjC.cpp:3484中ento::coreFoundation::followsCreateRule函数调用注释
- Sema.h:7932与Sema.cpp:157/439中AnalysisWarnings变量声明、创建、使用注释
- Sema.h:1434与Sema.cpp:1704中PopFunctionScopeInfo函数声明与定义修改
- SemaDecl.cpp、SemaDeclCXX.cpp、SemaExpr.cpp中的PopFunctionScopeInfo的函数调用做修改
ASTMatchers¶
- 功能描述
基于模式匹配的语法分析器,主要功能是匹配AST节点。它提供API,用于匹配节点类型、属性、关系。
例如,用户可以使用hasName API来查询具有特定名称的函数或变量,使用hasBody API来查找具有特定函数体的函数,使用hasAncestor API来查找具有特定祖先节点的节点等等。
用户可以结合多个API,编写复杂的AST查询规则,以便在代码中查找特定的模式或进行代码重构等操作。
-
内容修改
-
CGDebugInfo.cpp中analyzeParametersModification函数定义即调用进行注释
Serialization¶
Edit¶
AST¶
-
裁剪方向:
-
与目标语言(OpenCL)无关的编程语言:ObjectC、OpenMP
-
内容修改——Microsoft
- 注释AST中Microsoft相关内容
-
取消AST/CMakeLists.txt中MicrosoftCXXABI.cpp / MicrosoftMangle.cpp文件的编译
-
内容修改——OpenMP
- 注释AST中OpenMP相关内容
-
取消AST/CMakeLists.txt中DeclOpenMP.cpp / OpenMPClause.cpp / StmtOpenMP.cpp文件的编译
-
内容修改——Object-C
-
注释AST中Object-C相关内容
- 取消AST/CMakeLists.txt中ExprObjC.cpp / StmtObjC.cpp / DeclObjC.cpp文件的编译
Lex¶
Driver¶
Basic¶
Clang部分操作记录¶
可执行文件demo原始大小(Debug):1635550032 B ≈ 1.6 GB
(Release):63853296 B
-
取消
ARCMigrate与StaticAnalyzer的编译 -
删除
ASTMatchers库的链接
demo大小(Debug):1614932496 B
- 删除
Analysis库的链接
demo大小(Debug):1588816176 B
-
取消
ASTMatchers/Analysis/Tooling的编译 -
删除
CodeGen模块中CUDA相关内容
demo大小(Debug):1583984720 B
- 删除
Sema模块中CUDA相关内容
demo大小(Debug):1581369128 B
demo大小(Release)78328616 B
- 合并最新代码
demo大小(Release):62522912 B
- 删除
Parse模块中ObjectC相关内容
demo大小(Release):62430000 B
- 删除
Parse模块中OpenMP相关内容
demo大小(Release):62364864 B
- 删除
CodeGen模块中OpenMP、ObjC(部分)相关内容
demo大小(Release):61082720 B
- 合并最新代码
demo大小(Release):57968696 B
- 删除
Sema模块中的OpenMP相关
demo大小(Release):56962624 B
- 合并最新代码
demo大小(Release):52328416 B
- 删除
AST模块中的Microsoft相关
demo大小(Release):52048112 B
- 删除
AST模块中的OpenMP相关
demo大小(Release):51653264 B
- 删除
CodeGen/TargetInfo.cpp中与目标架构无关内容
demo大小(Release):51551288 B
- 删除
Sema模块中CodeComplete相关
demo大小(Release):50782451 B
- 合并最新代码
demo大小(Release):49091752 B
- 删除
AST / Sema模块中的Objcet-C相关
demo大小(Release):48007376 B
-
取消
CrossTU/DirectoryWatcher/Index的编译 -
更新代码, 编译器前端构建为动态库形式,关注libCLC.so大小
libCLC.so大小:55950920 B
- 从LangOptions出发删除Cuda、OpenMP、Object-C相关逻辑
libCLC.so大小:53062968 B
- 删除Basic / Driver模块中的Cuda相关
libCLC.so大小:52969744 B
- 删除Basic模块中的OpenMPKinds.cpp文件
libCLC.so大小:52952632 B
-
删除CodeGen与llvm/Transforms模块中C++Coroutine相关内容
-
删除Sema模块中C++Coroutine相关内容
libCLC.so大小:52171448 B
-
删除Parse模块中C++Template相关内容
-
删除CodeGen模块部分文件(CGCXX.cpp / CGClass.app / CGDeclCXX.cpp / CGExprCXX.cpp / CGVTT.cpp / CGVTables.cpp)
libCLC.so大小:51773896 B
-
删除CodeGen模块中CGException.cpp
-
删除Parse模块中的ParseExprCXX.cpp(保留Bool与内置函数部分)
-
删除Parse模块ParseDeclCXX.cpp(保留Class与CXX11Attribute部分)
libCLC.so大小:50244568 B
-
删除Sema模块中的SemaTemplate.cpp文件
-
删除Sema模块中的SemaCXXScopeSpec.cpp与SemaExceptionSpec.cpp
-
删除Sema模块的SemaLambda.cpp
-
删除Sema模块SemaTemplateInstantiate.cpp & SemaTemplateInstantiateDecl.cpp
-
删除Sema模块中的SemaAccess.cpp
libCLC.so大小:48934544 B
-
尝试删除SemaOverload.cpp,存在OpenCL的相关用例,故撤销
-
尝试删除SemaDeclCXX.cpp,存在Struct初始化相关错误,故撤销
-
处理Sema模块SemaDeclCXX.cpp文件
-
删除AST模块VTableBuilder.cpp & VTTBuilder.cpp
-
处理CodeGen模块CGDebugInfo.cpp & CodeGenPGO.cpp
-
处理Sema模块SemaCast.cpp & SemaCheckiing.cpp & SemaStmt.cpp
-
处理Sema模块SemaTemplateDeduction.cpp
-
尝试处理后端AsmParser与BinaryFormat模块
-
处理AST模块StmtCXX.cpp
-
处理AST模块的DeclTemplate.cpp
-
处理AST模块的ASTDiagnostic.cpp
libCLC.so大小:46512560 B
-
取消LLVMCoverage库的链接
-
取消LLVMObject库的链接
-
取消LLVMBinaryFormat库的链接
-
处理LLVMSupport库中的非必要文件
BinaryStreamError.cpp / BinaryStreamReader.cpp / BinaryStreamRef.cpp / BinaryStreamWriter.cpp
DataExtractor.cpp / DeltaAlgorithm.cpp / DAGDeltaAlgorithm.cpp / DJB.cpp / FileUtilities.cpp / FileOutputBuffer.cpp / GlobPattern.cpp
-
删除Basic模块中的XRayInstr.cpp / XRayLists.cpp,Driver中的XRayArgs.cpp
-
处理头文件AST/DeclObjC.h
-
处理Frontend模块中的LogDiagnosticPrinter.cpp / SerializedDiagnosticPrinter.cpp / TestModuleFileExtension.cpp
-
处理Serialization模块中的ModuleFileExtension.cpp
处理头文件!!!
如在LLVM中的CLANG_ENABLE_ARCMT。在CMake文件中使用if(CLANG_ENABLE_ARCMT)和 endif() ,在,CPP中使用#if CLANG_ENABLE_ARCMT¶
使用LLVM_ENABLE_BACKEND¶
31562368
32874808
include "llvm/Config/config.h"¶
if LLVM_ENABLE_BACKEND¶
Test问题用例记录¶
- 提交:b2c92520916d994d9f0874a7ffce3164038ed1f7
feat[C++]: 删除Sema模块中C++Coroutine相关内容
| 用例 | 原因 |
|---|---|
| AST/coroutine-source-location-crash.cpp | C++ coroutine相关 |
- 提交:6e8b0abf5ccf669c79e2d53f9846f2f18799216b
feat[C++]: 删除Parse模块中C++Template相关内容
| 用例 | 原因 |
|---|---|
| ASTMerge/class-template-partial-spec/test.cpp | 用例包含template |
| ASTMerge/class-template/test.cpp | 用例包含template |
| ASTMerge/exprs-cpp/test.cpp | 用例包含template |
| ASTMerge/namespace/test.cpp | 用例包含template |
| ASTMerge/std-initializer-list/test.cpp | 用例包含template |
| ASTMerge/var-cpp/test.cpp | 用例包含template |
| AST/ast-dump-comment-json.cpp | 用例包含template |
| AST/ast-dump-array.cpp | 用例包含template |
| AST/ast-dump-comment.cpp | 用例包含template |
| AST/address_space_attribute.cpp | 用例包含template |
| AST/ast-dump-funcs-json.cpp | 用例包含template |
| AST/ast-dump-invalid.cpp | 用例包含template |
| AST/ast-dump-expr-json.cpp | 用例包含template |
| AST/ast-dump-funcs.cpp | 用例包含template |
| AST/ast-dump-records-json.cpp | 用例包含template |
| AST/ast-dump-stmt-json.cpp | 用例包含template |
| AST/ast-dump-expr.cpp | 用例包含template |
| AST/ast-dump-template-decls-json.cpp | 用例包含template |
| AST/ast-dump-records.cpp | 用例包含template |
| AST/ast-dump-template-decls.cpp | 用例包含template |
| AST/ast-dump-templates.cpp | 用例包含template |
| AST/ast-print-out-of-line-func.cpp | 用例包含template |
| AST/ast-print-char-literal.cpp | 用例包含template |
| AST/ast-printer-lambda.cpp | 用例包含template |
| AST/ast-dump-stmt.cpp | 用例包含template |
| AST/template-implicit-vars.cpp | 用例包含template |
| AST/sourceranges.cpp | 用例包含template |
| CodeGen/address-safety-attr.cpp | 用例包含template |
| CodeGen/cfi-unrelated-cast.cpp | 用例包含template |
| CodeGen/convertvector.c | 用例包含template |
| CodeGen/fp-contract-fast-pragma.cpp | 用例包含template |
| CodeGen/fp-contract-on-pragma.cpp | 用例包含template |
| CodeGen/fp-contract-pragma.cpp | 用例包含template |
| CodeGen/no-devirt.cpp | 用例包含template |
| CodeGen/temporary-lifetime.cpp | 用例包含template |
| Coverage/ast-print-temp-class.cpp | 用例包含template |
| Coverage/ast-print-temp-func.cpp | 用例包含template |
| Coverage/ast-printing.cpp | 用例包含template |
| CoverageMapping/templates.cpp | 用例包含template |
| Frontend/ast-main.cpp | 用例包含template |
| Frontend/ftime-report-template-decl.cpp | 用例包含template |
| Frontend/noderef_templates.cpp | 用例包含template |
| Frontend/noderef.cpp | 用例包含template |
| Lexer/cxx2a-spaceship.cpp | 用例包含template |
| Lexer/cxx2a_keyword_as_cxx17.cpp | 用例包含template |
- 提交:769a715b7b55ee869ae0fea3cfa6dab9d0586300 / dafa3fc0cdd1b2740d737c2c6f796d91232ecb53
feat[C++]:删除CodeGen模块部分文件(CGCXX.cpp / CGClass.app / CGDeclCXX.cpp / CGExprCXX.cpp / CGVTT.cpp / CGVTables.cpp)
feat[C++]: 删除CodeGen模块中CGException.cpp
| 用例 | 原因 |
|---|---|
| CoverageMapping/default-method.cpp | 用例包含class |
| CoverageMapping/deferred-region.cpp | 用例包含C++ deferred region特性 |
| CoverageMapping/lambda.cpp | 用例包含C++ lambda |
| CoverageMapping/nestedclass.cpp | 用例包含class |
| CoverageMapping/trycatch.cpp | 用例包含C++ 异常处理 |
| CodeGen/address-sanitizer-and-array-cookie.cpp | 用例包含C++ new&delete |
| CodeGen/available-externally-hidden.cpp | 用例包含class |
| CodeGen/block-with-perdefinedexpr.cpp | 用例包含class |
| CodeGen/captured-statements-nested.c | 用例包含变长数组 |
| CodeGen/captured-statements.c | 用例包含变长数组 |
| CodeGen/construction-vtable-visibility.cpp | 用例包含class |
| CodeGen/object-size.cpp | 用例包含C++ 继承特性 |
| CodeGen/pr19841.cpp | 用例包含class |
| CodeGen/push-hidden-visibility-subclass.cpp | 用例包含class |
| CodeGen/sanitize-address-field-padding.cpp | 用例包含class |
| CodeGen/tbaa-base.cpp | 用例包含C++ 继承特性 |
| CodeGen/tbaa-class.cpp | 用例包含class |
| CodeGen/tbaa-for-vptr.cpp | 用例包含C++ new |
| CodeGen/tbaa-reference.cpp | 用例包含C++ 引用 |
| CodeGen/temporary-lifetime-exceptions.cpp | 用例包含C++ 构造函数和析构函数 |
| CodeGen/ubsan-type-blacklist.cpp | 用例包含class |
- 提交:d8b313904e99fc88b9c20d807d5db2a8879bdbe7
feat[C++]: 删除Parse模块中的ParseExprCXX.cpp
| AST/ast-dump-types-json.cpp | |
|---|---|
| AST/pragma-attribute-cxx-subject-match-rules.cpp | |
| AST/ast-dump-color.cpp | |
| AST/ast-dump-if-json.cpp | |
| AST/ast-dump-record-definition-data.cpp | |
| AST/ast-dump-special-member-functions.cpp | |
| AST/ast-dump-temporaries-json.cpp | |
| AST/auto-pragma.cpp | |
| AST/multistep-explicit-cast-json.cpp | |
| AST/multistep-explicit-cast.cpp | |
| AST/ast-print-record-decl.c | |
| ASTMerge/inheritance/test.cpp | |
| ASTMerge/class/test.cpp | |
| ASTMerge/class2/test.cpp | |
| ASTMerge/unnamed_fields/test.cpp | |
| ASTMerge/init-ctors/test.cpp | |
| CodeGen/Nontemporal.cpp | |
| CodeGen/cxx-condition.cpp | |
| CodeGen/cxx-value-init.cpp | |
| CodeGen/debug-info-imported-entity.cpp | |
| CodeGen/sanitize-init-order.cpp | |
| CodeGen/tbaa-thread-sanitizer.cpp | |
| CoverageMapping/includehell.cpp | |
| CoverageMapping/if.cpp | |
| CoverageMapping/logical.cpp | |
| CoverageMapping/macroscopes.cpp | |
| CoverageMapping/switch.cpp | |
| CoverageMapping/md.cpp | |
| Frontend/macro_defined_type.cpp | |
| Layout/itanium-union-bitfield.cpp | |
| Layout/no-unique-address.cpp | |
| Lexer/cxx开头... | |
| Misc/pragma-attribute-cxx.cpp | |
| Parser/bracket-crash.cpp | |
| Parser/brackets.cpp | |
| Parser/colon-colon-parentheses.cpp | |
| Parser/editor-placeholder-recovery.cpp | |
| Parser/PR11000.cpp | |
| Parser/cxx开头... | |
| Parser/extra-semi-resulting-in-nullstmt-in-init-statement.cpp | |
| Parser/extra-semi-resulting-in-nullstmt.cpp | |
| Parser/extra-semi.cpp | |
| Parser/for.cpp | |
| Parser/opencl-cxx-keywords.cl | |
| Parser/parenthesis-balance.cpp | |
| Parser/recursion-limits.cpp | |
| Parser/warn-dangling-else.cpp | |
| PCH/CXX开头....... | |
| PCH/captured-stmt.cpp | |
| PCH/chain-empty-initial-namespace.cpp | |
| PCH/chain-implicit-definition.cpp | |
| PCH/chain-invalid-code.cpp | |
| PCH/chain-typo-corrections.cpp | |
| PCH/namespaces.cpp | |
| PCH/reinclude.cpp | |
| PCH/typo2.cpp | |
| Profile/cxx-stmt-initializers.cpp | |
| Sema/attr-mig.cpp | |
| Sema/attr-naked.cpp | |
| Sema/asm-goto.cpp | |
| Sema/attr-capabilities.cpp | |
| Sema/thread-specifier.c | |
| Sema/vector-gcc-compat.cpp | |
| Sema/warn-main-returns-bool-literal.cpp | |
| Sema/parentheses.cpp | |
- 提交:3ae22e57497cf45a92d9c8668d6c7af7bbb13aac
feat[C++]: 删除Parse模块ParseDeclCXX.cpp中除去Class与CXX11Attribute部分的内容
| AST/ast-dump-namespace-json.cpp | |
|---|---|
| Parser/namespace-alias-attr.cpp | |
| Parser/namespaces.cpp | |
| PCH/chain-late-anonymous-namespace.cpp | |
| Parser/top-level-semi-cxx0x.cpp | |
| AST/function-alias.cpp | |
| Coverage/ast-print-func.cpp | |
- 提交:198cebb36ff5c81cdd7503f5ae9432b826851255
feat[C++]: 删除Sema模块中的SemaTemplate.cpp文件
| Sema/static-assert.c | |
|---|---|
- 提交:1582e647011cd65315e2831f12e4d0dea00ce8ad
feat[C++]: 处理Sema模块的SemaExprCXX.cpp文件
| Sema/builtins-arm64-mte.c | |
|---|---|
| SemaOpenCL/address-spaces-conversions-cl2.0.cl | 用例中指定了C++版本的OpenCL,(-cl-std=clc++) |
- 提交:e13c54c9354c27f865d6f6bb6a9472fe3c573941
feat[C++]: 处理CodeGen模块CGDebugInfo.cpp & CodeGenPGO.cpp
| CoverageMapping/loops.cpp | |
|---|---|
| CoverageMapping/macro-expressions.cpp | |
| CoverageMapping/trymacro.cpp |
- 提交:40dc7d08af6f26f85131e4894eb4efa06c7287a8
feat[C++]: 处理Sema模块SemaTemplateDeduction.cpp
| CodeGen/xray-typedevent.cpp | |
|---|---|
| Lexer/char-literal.cpp | |
| Sema/auto-type.c | 该用例中使用了GNU的扩展关键词__auto_tyoe |
LLVM Library¶
llvm-config工具使用¶
通过llvm-config --libs <library-name>获取所有LLVM component