跳转至

开发环境

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_LIBStarget_link_libraries

LINK_LIBSllvm/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

  • 取消ARCMigrateStaticAnalyzer的编译

  • 删除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