https://github.com/cratelschen created https://github.com/llvm/llvm-project/pull/93500
None >From 421aa0371f834b6ebfad204c85f65695f8de2ae7 Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Wed, 10 Apr 2024 19:54:19 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20kickoff=20=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kick-off.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 kick-off.md diff --git a/kick-off.md b/kick-off.md new file mode 100644 index 0000000000000..97084536fe1eb --- /dev/null +++ b/kick-off.md @@ -0,0 +1,8 @@ +# configuration +> cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug + +LLVM的工程很大,源码的源头一般认为是 llvm 文件夹,可以看到这里也是从其开始寻找 cmake 文件的。 +当前要求配置时必须制定 build 类型。 + +# build +> cmake --build build >From 443a75daed4a0642e0e8799cf54ac1379a4ae9b9 Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Wed, 10 Apr 2024 22:13:29 +0800 Subject: [PATCH 2/6] add comments for cmake file --- llvm/CMakeLists.txt | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index d511376e18ba5..2efcb5a0f1a0b 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -1,24 +1,45 @@ +# -S 指定目录为 llvm 时,cmake 就会从当前路径中查找 CMakeLists.txt 并执行 +# +# 项目入口处 +# # See docs/CMake.html for instructions about how to build LLVM with CMake. +# 指定当前工程支持的 cmake 语法的最小版本。该之前的语法旧语法就不再支持了。 cmake_minimum_required(VERSION 3.20.0) +# 设置变量LLVM_COMMON_CMAKE_UTILS执行外层 cmake 文件夹的路径。 +# 该路径下面的 Modules 文件夹下有很多 .cmake 文件后续可能会用。 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) +message(${LLVM_COMMON_CMAKE_UTILS}) + +message("将 policy 文件引入当前 cmake 文件") include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) # Builds with custom install names and installation rpath setups may not work # in the build tree. Allow these cases to use CMake's default build tree # behavior by setting `LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE` to do this. +# 定义 option:LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE,允许开发者在 build 的时候通过-DOPTION 设置不同的值来影响编译过程。 option(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE "If set, use CMake's default build tree install name directory logic (Darwin only)" OFF) + +# 将缓存的变量标记为高级变量。其中,高级变量指的是那些在CMake GUI中,只有当“显示高级选项”被打开时才会被显示的变量。如果CLEAR是第一个选项,参数中的高级变量将变回 +# 非高级变量。如果FORCE是第一个选项,参数中的变量会被提升为高级变量。如果两者都未出现,新的变量会被标记为高级变量;如果这个变量已经是高级/非高级状态的话,它将会维 +# 持原状。该命令在脚本中无效 +# 高级选项通常是那些不经常使用的选项,或者对大多数用户来说可能不重要的选项。 mark_as_advanced(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE) if(NOT LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE) set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON) endif() +message("将 LLVM 的版本信息引入") include(${LLVM_COMMON_CMAKE_UTILS}/Modules/LLVMVersion.cmake) +# 设置当前目录和子目录的属性 +# 该属性只在当前目录以及其子目录起作用 +# set_property:设置私属性值,在当前作用于起作用 set_directory_properties(PROPERTIES LLVM_VERSION_MAJOR "${LLVM_VERSION_MAJOR}") + if (NOT PACKAGE_VERSION) set(PACKAGE_VERSION "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}") >From 7766ae8f97fffe7a592f25d0bdb4abd18133ca90 Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Wed, 10 Apr 2024 23:48:32 +0800 Subject: [PATCH 3/6] add comments for cmake file --- llvm/CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt index 2efcb5a0f1a0b..8f8cfbcf6a1e9 100644 --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -12,6 +12,15 @@ cmake_minimum_required(VERSION 3.20.0) set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake) message(${LLVM_COMMON_CMAKE_UTILS}) +# message的信息种类: +# (无) = 重要消息; +# STATUS = 非重要消息; +# WARNING = CMake 警告, 会继续执行; +# AUTHOR_WARNING = CMake 警告 (dev), 会继续执行; +# SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤; +# FATAL_ERROR = CMake 错误, 终止所有处理过程; + + message("将 policy 文件引入当前 cmake 文件") include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake NO_POLICY_SCOPE) @@ -50,6 +59,7 @@ if(NOT DEFINED LLVM_SHLIB_SYMBOL_VERSION) set(LLVM_SHLIB_SYMBOL_VERSION "LLVM_${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}") endif() +# 如果在 windows 平台下使用生成器Visual Studio,输出 warning 信息 if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (MSVC_TOOLSET_VERSION LESS 142) AND (CMAKE_GENERATOR_TOOLSET STREQUAL "")) message(WARNING "Visual Studio generators use the x86 host compiler by " "default, even for 64-bit targets. This can result in linker " @@ -57,16 +67,19 @@ if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (MSVC_TOOLSET_VERSION LESS 142 "host compiler, pass -Thost=x64 on the CMake command line.") endif() +# 如果在 MacOS 平台下使用生成器XCode,且不是苹果的芯片架构,设置架构信息为x86_64 if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES) # Some CMake features like object libraries get confused if you don't # explicitly specify an architecture setting with the Xcode generator. set(CMAKE_OSX_ARCHITECTURES "x86_64") endif() +# 设置 project 项目名称,项目版本以及实现语言 project(LLVM VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH} LANGUAGES C CXX ASM) +# 设置 install 的路径 if (NOT DEFINED CMAKE_INSTALL_LIBDIR AND DEFINED LLVM_LIBDIR_SUFFIX) # Must go before `include(GNUInstallDirs)`. set(CMAKE_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}") @@ -78,6 +91,7 @@ set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name # Must go after `project(..)`. include(GNUInstallDirs) +# 设置LLVM 使用 C++的标准版本 # This C++ standard is required to build LLVM. set(LLVM_REQUIRED_CXX_STANDARD 17) @@ -105,6 +119,7 @@ else() set(CMAKE_CXX_EXTENSIONS NO) endif() +# 如果未设置 cmake 的 build 类型且未设置 configuration 类型 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(FATAL_ERROR " No build type selected. You need to pass -DCMAKE_BUILD_TYPE=<type> in order to configure LLVM. @@ -135,6 +150,7 @@ endif() # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS # This allows an easy way of setting up a build directory for llvm and another # one for llvm+clang+... using the same sources. +# 设置 LLVM 工程中的所有的子工程名称,其实是 target set(LLVM_ALL_PROJECTS "bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly;pstl") # The flang project is not yet part of "all" projects (see C++ requirements) set(LLVM_EXTRA_PROJECTS "flang") >From 9d78626f91110a433093d4b359c01c078038114c Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Fri, 12 Apr 2024 00:02:08 +0800 Subject: [PATCH 4/6] add comments --- clang/tools/driver/driver.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 83b5bbb71f521..6cfb55892dd78 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -69,7 +69,7 @@ std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes) { // This just needs to be some symbol in the binary; C++ doesn't // allow taking the address of ::main however. - void *P = (void*) (intptr_t) GetExecutablePath; + void *P = (void *)(intptr_t)GetExecutablePath; return llvm::sys::fs::getMainExecutable(Argv0, P); } @@ -102,10 +102,10 @@ static void insertTargetAndModeArgs(const ParsedClangName &NameParts, } if (NameParts.TargetIsValid) { - const char *arr[] = {"-target", GetStableCStr(SavedStrings, - NameParts.TargetPrefix)}; - ArgVector.insert(ArgVector.begin() + InsertionPoint, - std::begin(arr), std::end(arr)); + const char *arr[] = {"-target", + GetStableCStr(SavedStrings, NameParts.TargetPrefix)}; + ArgVector.insert(ArgVector.begin() + InsertionPoint, std::begin(arr), + std::end(arr)); } } @@ -225,6 +225,8 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV, return 1; } +// Cratels: build 目录下会生成一个 main 方法。在该方法中调用 clang_main +// 这里是所有程序的入口 int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) { noteBottomOfStack(); llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL @@ -316,8 +318,8 @@ int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) { IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = CreateAndPopulateDiagOpts(Args); - TextDiagnosticPrinter *DiagClient - = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); + TextDiagnosticPrinter *DiagClient = + new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); FixupDiagPrefixExeName(DiagClient, ProgName); IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); @@ -423,8 +425,8 @@ int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) { if (::getenv("FORCE_CLANG_DIAGNOSTICS_CRASH")) llvm::dbgs() << llvm::getBugReportMsg(); if (FailingCommand != nullptr && - TheDriver.maybeGenerateCompilationDiagnostics(CommandStatus, ReproLevel, - *C, *FailingCommand)) + TheDriver.maybeGenerateCompilationDiagnostics(CommandStatus, ReproLevel, + *C, *FailingCommand)) Res = 1; Diags.getClient()->finish(); >From b154b926a09b9e2aae57abc9483a375fc372c69f Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Thu, 18 Apr 2024 23:07:41 +0800 Subject: [PATCH 5/6] add comments --- clang/tools/driver/driver.cpp | 13 ++ llvm/include/llvm/Support/TargetSelect.h | 201 ++++++++++++----------- 2 files changed, 117 insertions(+), 97 deletions(-) diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 6cfb55892dd78..940b88defe2cc 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -227,11 +227,24 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV, // Cratels: build 目录下会生成一个 main 方法。在该方法中调用 clang_main // 这里是所有程序的入口 + +// int clang_main(int argc, char **, const llvm::ToolContext &); + +// int main(int argc, char **argv) { // Cratels: 程序入口 +// llvm::InitLLVM X(argc, argv); // Cratels: 初始化 LLVM +// return clang_main(argc, argv, {argv[0], nullptr, false}); +// } + +// Cratels: clang 驱动器调用的第一个工具是 clang +// 本身,给以参数-cc1,关闭编译器驱动器模式而开启编译器模式。 + int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) { noteBottomOfStack(); llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL " and include the crash backtrace, preprocessed " "source, and associated run script.\n"); + + // Cratels: 自定义 vector 来存放编译参数 SmallVector<const char *, 256> Args(Argv, Argv + Argc); if (llvm::sys::Process::FixupStandardFileDescriptors()) diff --git a/llvm/include/llvm/Support/TargetSelect.h b/llvm/include/llvm/Support/TargetSelect.h index e57614cea758b..de42be5108212 100644 --- a/llvm/include/llvm/Support/TargetSelect.h +++ b/llvm/include/llvm/Support/TargetSelect.h @@ -18,27 +18,29 @@ #include "llvm/Config/llvm-config.h" extern "C" { - // Declare all of the target-initialization functions that are available. +// Declare all of the target-initialization functions that are available. #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##TargetInfo(); #include "llvm/Config/Targets.def" #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##Target(); #include "llvm/Config/Targets.def" - // Declare all of the target-MC-initialization functions that are available. +// Declare all of the target-MC-initialization functions that are available. #define LLVM_TARGET(TargetName) void LLVMInitialize##TargetName##TargetMC(); #include "llvm/Config/Targets.def" - // Declare all of the available assembly printer initialization functions. -#define LLVM_ASM_PRINTER(TargetName) void LLVMInitialize##TargetName##AsmPrinter(); +// Declare all of the available assembly printer initialization functions. +#define LLVM_ASM_PRINTER(TargetName) \ + void LLVMInitialize##TargetName##AsmPrinter(); #include "llvm/Config/AsmPrinters.def" - // Declare all of the available assembly parser initialization functions. -#define LLVM_ASM_PARSER(TargetName) void LLVMInitialize##TargetName##AsmParser(); +// Declare all of the available assembly parser initialization functions. +#define LLVM_ASM_PARSER(TargetName) \ + void LLVMInitialize##TargetName##AsmParser(); #include "llvm/Config/AsmParsers.def" - // Declare all of the available disassembler initialization functions. -#define LLVM_DISASSEMBLER(TargetName) \ +// Declare all of the available disassembler initialization functions. +#define LLVM_DISASSEMBLER(TargetName) \ void LLVMInitialize##TargetName##Disassembler(); #include "llvm/Config/Disassemblers.def" @@ -48,129 +50,134 @@ extern "C" { } namespace llvm { - /// InitializeAllTargetInfos - The main program should call this function if - /// it wants access to all available targets that LLVM is configured to - /// support, to make them available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllTargetInfos() { +/// InitializeAllTargetInfos - The main program should call this function if +/// it wants access to all available targets that LLVM is configured to +/// support, to make them available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllTargetInfos() { + // Cratels: 调用所有 TargetInfo 方法 #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetInfo(); +// Cratels: include 的底层操作就是简单复制粘贴,无论是.h文件还是.def文件 #include "llvm/Config/Targets.def" - } - - /// InitializeAllTargets - The main program should call this function if it - /// wants access to all available target machines that LLVM is configured to - /// support, to make them available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllTargets() { - // FIXME: Remove this, clients should do it. - InitializeAllTargetInfos(); +} +// Cratels: 初始化所有LLVM 支持的 target +/// InitializeAllTargets - The main program should call this function if it +/// wants access to all available target machines that LLVM is configured to +/// support, to make them available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllTargets() { + // FIXME: Remove this, clients should do it. + InitializeAllTargetInfos(); + +// Cratels: 调用所有 Target 方法 #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##Target(); #include "llvm/Config/Targets.def" - } - - /// InitializeAllTargetMCs - The main program should call this function if it - /// wants access to all available target MC that LLVM is configured to - /// support, to make them available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllTargetMCs() { +} + +/// InitializeAllTargetMCs - The main program should call this function if it +/// wants access to all available target MC that LLVM is configured to +/// support, to make them available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllTargetMCs() { #define LLVM_TARGET(TargetName) LLVMInitialize##TargetName##TargetMC(); #include "llvm/Config/Targets.def" - } - - /// InitializeAllAsmPrinters - The main program should call this function if - /// it wants all asm printers that LLVM is configured to support, to make them - /// available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllAsmPrinters() { +} + +/// InitializeAllAsmPrinters - The main program should call this function if +/// it wants all asm printers that LLVM is configured to support, to make them +/// available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllAsmPrinters() { #define LLVM_ASM_PRINTER(TargetName) LLVMInitialize##TargetName##AsmPrinter(); #include "llvm/Config/AsmPrinters.def" - } - - /// InitializeAllAsmParsers - The main program should call this function if it - /// wants all asm parsers that LLVM is configured to support, to make them - /// available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllAsmParsers() { +} + +/// InitializeAllAsmParsers - The main program should call this function if it +/// wants all asm parsers that LLVM is configured to support, to make them +/// available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllAsmParsers() { #define LLVM_ASM_PARSER(TargetName) LLVMInitialize##TargetName##AsmParser(); #include "llvm/Config/AsmParsers.def" - } - - /// InitializeAllDisassemblers - The main program should call this function if - /// it wants all disassemblers that LLVM is configured to support, to make - /// them available via the TargetRegistry. - /// - /// It is legal for a client to make multiple calls to this function. - inline void InitializeAllDisassemblers() { -#define LLVM_DISASSEMBLER(TargetName) LLVMInitialize##TargetName##Disassembler(); +} + +/// InitializeAllDisassemblers - The main program should call this function if +/// it wants all disassemblers that LLVM is configured to support, to make +/// them available via the TargetRegistry. +/// +/// It is legal for a client to make multiple calls to this function. +inline void InitializeAllDisassemblers() { +#define LLVM_DISASSEMBLER(TargetName) \ + LLVMInitialize##TargetName##Disassembler(); #include "llvm/Config/Disassemblers.def" - } - - /// InitializeNativeTarget - The main program should call this function to - /// initialize the native target corresponding to the host. This is useful - /// for JIT applications to ensure that the target gets linked in correctly. - /// - /// It is legal for a client to make multiple calls to this function. - inline bool InitializeNativeTarget() { +} + +/// InitializeNativeTarget - The main program should call this function to +/// initialize the native target corresponding to the host. This is useful +/// for JIT applications to ensure that the target gets linked in correctly. +/// +/// It is legal for a client to make multiple calls to this function. +inline bool InitializeNativeTarget() { // If we have a native target, initialize it to ensure it is linked in. #ifdef LLVM_NATIVE_TARGET - LLVM_NATIVE_TARGETINFO(); - LLVM_NATIVE_TARGET(); - LLVM_NATIVE_TARGETMC(); - return false; + LLVM_NATIVE_TARGETINFO(); + LLVM_NATIVE_TARGET(); + LLVM_NATIVE_TARGETMC(); + return false; #else - return true; + return true; #endif - } +} - /// InitializeNativeTargetAsmPrinter - The main program should call - /// this function to initialize the native target asm printer. - inline bool InitializeNativeTargetAsmPrinter() { +/// InitializeNativeTargetAsmPrinter - The main program should call +/// this function to initialize the native target asm printer. +inline bool InitializeNativeTargetAsmPrinter() { // If we have a native target, initialize the corresponding asm printer. #ifdef LLVM_NATIVE_ASMPRINTER - LLVM_NATIVE_ASMPRINTER(); - return false; + LLVM_NATIVE_ASMPRINTER(); + return false; #else - return true; + return true; #endif - } +} - /// InitializeNativeTargetAsmParser - The main program should call - /// this function to initialize the native target asm parser. - inline bool InitializeNativeTargetAsmParser() { +/// InitializeNativeTargetAsmParser - The main program should call +/// this function to initialize the native target asm parser. +inline bool InitializeNativeTargetAsmParser() { // If we have a native target, initialize the corresponding asm parser. #ifdef LLVM_NATIVE_ASMPARSER - LLVM_NATIVE_ASMPARSER(); - return false; + LLVM_NATIVE_ASMPARSER(); + return false; #else - return true; + return true; #endif - } +} - /// InitializeNativeTargetDisassembler - The main program should call - /// this function to initialize the native target disassembler. - inline bool InitializeNativeTargetDisassembler() { +/// InitializeNativeTargetDisassembler - The main program should call +/// this function to initialize the native target disassembler. +inline bool InitializeNativeTargetDisassembler() { // If we have a native target, initialize the corresponding disassembler. #ifdef LLVM_NATIVE_DISASSEMBLER - LLVM_NATIVE_DISASSEMBLER(); - return false; + LLVM_NATIVE_DISASSEMBLER(); + return false; #else - return true; + return true; #endif - } +} - /// InitializeAllTargetMCAs - The main program should call - /// this function to initialize the target CustomBehaviour and - /// InstrPostProcess classes. - inline void InitializeAllTargetMCAs() { +/// InitializeAllTargetMCAs - The main program should call +/// this function to initialize the target CustomBehaviour and +/// InstrPostProcess classes. +inline void InitializeAllTargetMCAs() { #define LLVM_TARGETMCA(TargetName) LLVMInitialize##TargetName##TargetMCA(); #include "llvm/Config/TargetMCAs.def" - } } +} // namespace llvm #endif >From 4f0f05d77cdcaeec2e0726e34ac81ed5b495939f Mon Sep 17 00:00:00 2001 From: CratelsChen <crat...@126.com> Date: Thu, 18 Apr 2024 23:22:41 +0800 Subject: [PATCH 6/6] add comments --- .../include/clang/Frontend/CompilerInstance.h | 36 ++---- .../ExecuteCompilerInvocation.cpp | 118 +++++++++++------- clang/tools/driver/cc1_main.cpp | 11 +- clang/tools/driver/driver.cpp | 1 + 4 files changed, 94 insertions(+), 72 deletions(-) diff --git a/clang/include/clang/Frontend/CompilerInstance.h b/clang/include/clang/Frontend/CompilerInstance.h index 3464654284f19..109ccd2dc03a8 100644 --- a/clang/include/clang/Frontend/CompilerInstance.h +++ b/clang/include/clang/Frontend/CompilerInstance.h @@ -35,7 +35,7 @@ namespace llvm { class raw_fd_ostream; class Timer; class TimerGroup; -} +} // namespace llvm namespace clang { class ASTContext; @@ -58,6 +58,7 @@ class SourceManager; class TargetInfo; enum class DisableValidationForModuleKind; +// Cratels: CompilerInstance是一个工具类来持有单例的 Clang compiler对象。 /// CompilerInstance - Helper class for managing a single instance of the Clang /// compiler. /// @@ -204,6 +205,7 @@ class CompilerInstance : public ModuleLoader { CompilerInstance(const CompilerInstance &) = delete; void operator=(const CompilerInstance &) = delete; + public: explicit CompilerInstance( std::shared_ptr<PCHContainerOperations> PCHContainerOps = @@ -270,9 +272,7 @@ class CompilerInstance : public ModuleLoader { /// Set the flag indicating whether we should (re)build the global /// module index. - void setBuildGlobalModuleIndex(bool Build) { - BuildGlobalModuleIndex = Build; - } + void setBuildGlobalModuleIndex(bool Build) { BuildGlobalModuleIndex = Build; } /// @} /// @name Forwarding Methods @@ -280,9 +280,7 @@ class CompilerInstance : public ModuleLoader { AnalyzerOptions &getAnalyzerOpts() { return Invocation->getAnalyzerOpts(); } - CodeGenOptions &getCodeGenOpts() { - return Invocation->getCodeGenOpts(); - } + CodeGenOptions &getCodeGenOpts() { return Invocation->getCodeGenOpts(); } const CodeGenOptions &getCodeGenOpts() const { return Invocation->getCodeGenOpts(); } @@ -308,9 +306,7 @@ class CompilerInstance : public ModuleLoader { return Invocation->getFileSystemOpts(); } - FrontendOptions &getFrontendOpts() { - return Invocation->getFrontendOpts(); - } + FrontendOptions &getFrontendOpts() { return Invocation->getFrontendOpts(); } const FrontendOptions &getFrontendOpts() const { return Invocation->getFrontendOpts(); } @@ -350,9 +346,7 @@ class CompilerInstance : public ModuleLoader { return Invocation->getPreprocessorOutputOpts(); } - TargetOptions &getTargetOpts() { - return Invocation->getTargetOpts(); - } + TargetOptions &getTargetOpts() { return Invocation->getTargetOpts(); } const TargetOptions &getTargetOpts() const { return Invocation->getTargetOpts(); } @@ -394,9 +388,7 @@ class CompilerInstance : public ModuleLoader { void setVerboseOutputStream(std::unique_ptr<raw_ostream> Value); /// Get the current stream for verbose output. - raw_ostream &getVerboseOutputStream() { - return *VerboseOutputStream; - } + raw_ostream &getVerboseOutputStream() { return *VerboseOutputStream; } /// @} /// @name Target Info @@ -574,8 +566,8 @@ class CompilerInstance : public ModuleLoader { void setASTReader(IntrusiveRefCntPtr<ASTReader> Reader); std::shared_ptr<ModuleDependencyCollector> getModuleDepCollector() const; - void setModuleDepCollector( - std::shared_ptr<ModuleDependencyCollector> Collector); + void + setModuleDepCollector(std::shared_ptr<ModuleDependencyCollector> Collector); std::shared_ptr<PCHContainerOperations> getPCHContainerOperations() const { return ThePCHContainerOperations; @@ -701,11 +693,9 @@ class CompilerInstance : public ModuleLoader { /// used by some diagnostics printers (for logging purposes only). /// /// \return The new object on success, or null on failure. - static IntrusiveRefCntPtr<DiagnosticsEngine> - createDiagnostics(DiagnosticOptions *Opts, - DiagnosticConsumer *Client = nullptr, - bool ShouldOwnClient = true, - const CodeGenOptions *CodeGenOpts = nullptr); + static IntrusiveRefCntPtr<DiagnosticsEngine> createDiagnostics( + DiagnosticOptions *Opts, DiagnosticConsumer *Client = nullptr, + bool ShouldOwnClient = true, const CodeGenOptions *CodeGenOpts = nullptr); /// Create the file manager and replace any existing one with it. /// diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp index f85f0365616f9..134799a38a2c3 100644 --- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp +++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp @@ -43,24 +43,38 @@ CreateFrontendBaseAction(CompilerInstance &CI) { (void)Action; switch (CI.getFrontendOpts().ProgramAction) { - case ASTDeclList: return std::make_unique<ASTDeclListAction>(); - case ASTDump: return std::make_unique<ASTDumpAction>(); - case ASTPrint: return std::make_unique<ASTPrintAction>(); - case ASTView: return std::make_unique<ASTViewAction>(); + case ASTDeclList: + return std::make_unique<ASTDeclListAction>(); + case ASTDump: + return std::make_unique<ASTDumpAction>(); + case ASTPrint: + return std::make_unique<ASTPrintAction>(); + case ASTView: + return std::make_unique<ASTViewAction>(); case DumpCompilerOptions: return std::make_unique<DumpCompilerOptionsAction>(); - case DumpRawTokens: return std::make_unique<DumpRawTokensAction>(); - case DumpTokens: return std::make_unique<DumpTokensAction>(); - case EmitAssembly: return std::make_unique<EmitAssemblyAction>(); - case EmitBC: return std::make_unique<EmitBCAction>(); - case EmitHTML: return std::make_unique<HTMLPrintAction>(); - case EmitLLVM: return std::make_unique<EmitLLVMAction>(); - case EmitLLVMOnly: return std::make_unique<EmitLLVMOnlyAction>(); - case EmitCodeGenOnly: return std::make_unique<EmitCodeGenOnlyAction>(); - case EmitObj: return std::make_unique<EmitObjAction>(); + case DumpRawTokens: + return std::make_unique<DumpRawTokensAction>(); + case DumpTokens: + return std::make_unique<DumpTokensAction>(); + case EmitAssembly: + return std::make_unique<EmitAssemblyAction>(); + case EmitBC: + return std::make_unique<EmitBCAction>(); + case EmitHTML: + return std::make_unique<HTMLPrintAction>(); + case EmitLLVM: + return std::make_unique<EmitLLVMAction>(); + case EmitLLVMOnly: + return std::make_unique<EmitLLVMOnlyAction>(); + case EmitCodeGenOnly: + return std::make_unique<EmitCodeGenOnlyAction>(); + case EmitObj: + return std::make_unique<EmitObjAction>(); case ExtractAPI: return std::make_unique<ExtractAPIAction>(); - case FixIt: return std::make_unique<FixItAction>(); + case FixIt: + return std::make_unique<FixItAction>(); case GenerateModule: return std::make_unique<GenerateModuleFromModuleMapAction>(); case GenerateModuleInterface: @@ -69,14 +83,20 @@ CreateFrontendBaseAction(CompilerInstance &CI) { return std::make_unique<GenerateReducedModuleInterfaceAction>(); case GenerateHeaderUnit: return std::make_unique<GenerateHeaderUnitAction>(); - case GeneratePCH: return std::make_unique<GeneratePCHAction>(); + case GeneratePCH: + return std::make_unique<GeneratePCHAction>(); case GenerateInterfaceStubs: return std::make_unique<GenerateInterfaceStubsAction>(); - case InitOnly: return std::make_unique<InitOnlyAction>(); - case ParseSyntaxOnly: return std::make_unique<SyntaxOnlyAction>(); - case ModuleFileInfo: return std::make_unique<DumpModuleInfoAction>(); - case VerifyPCH: return std::make_unique<VerifyPCHAction>(); - case TemplightDump: return std::make_unique<TemplightDumpAction>(); + case InitOnly: + return std::make_unique<InitOnlyAction>(); + case ParseSyntaxOnly: + return std::make_unique<SyntaxOnlyAction>(); + case ModuleFileInfo: + return std::make_unique<DumpModuleInfoAction>(); + case VerifyPCH: + return std::make_unique<VerifyPCHAction>(); + case TemplightDump: + return std::make_unique<TemplightDumpAction>(); case PluginAction: { for (const FrontendPluginRegistry::entry &Plugin : @@ -94,11 +114,12 @@ CreateFrontendBaseAction(CompilerInstance &CI) { } CI.getDiagnostics().Report(diag::err_fe_invalid_plugin_name) - << CI.getFrontendOpts().ActionName; + << CI.getFrontendOpts().ActionName; return nullptr; } - case PrintPreamble: return std::make_unique<PrintPreambleAction>(); + case PrintPreamble: + return std::make_unique<PrintPreambleAction>(); case PrintPreprocessedInput: { if (CI.getPreprocessorOutputOpts().RewriteIncludes || CI.getPreprocessorOutputOpts().RewriteImports) @@ -106,31 +127,42 @@ CreateFrontendBaseAction(CompilerInstance &CI) { return std::make_unique<PrintPreprocessedAction>(); } - case RewriteMacros: return std::make_unique<RewriteMacrosAction>(); - case RewriteTest: return std::make_unique<RewriteTestAction>(); + case RewriteMacros: + return std::make_unique<RewriteMacrosAction>(); + case RewriteTest: + return std::make_unique<RewriteTestAction>(); #if CLANG_ENABLE_OBJC_REWRITER - case RewriteObjC: return std::make_unique<RewriteObjCAction>(); + case RewriteObjC: + return std::make_unique<RewriteObjCAction>(); #else - case RewriteObjC: Action = "RewriteObjC"; break; + case RewriteObjC: + Action = "RewriteObjC"; + break; #endif #if CLANG_ENABLE_ARCMT case MigrateSource: return std::make_unique<arcmt::MigrateSourceAction>(); #else - case MigrateSource: Action = "MigrateSource"; break; + case MigrateSource: + Action = "MigrateSource"; + break; #endif #if CLANG_ENABLE_STATIC_ANALYZER - case RunAnalysis: return std::make_unique<ento::AnalysisAction>(); + case RunAnalysis: + return std::make_unique<ento::AnalysisAction>(); #else - case RunAnalysis: Action = "RunAnalysis"; break; + case RunAnalysis: + Action = "RunAnalysis"; + break; #endif - case RunPreprocessorOnly: return std::make_unique<PreprocessOnlyAction>(); + case RunPreprocessorOnly: + return std::make_unique<PreprocessOnlyAction>(); case PrintDependencyDirectivesSourceMinimizerOutput: return std::make_unique<PrintDependencyDirectivesSourceMinimizerAction>(); } -#if !CLANG_ENABLE_ARCMT || !CLANG_ENABLE_STATIC_ANALYZER \ - || !CLANG_ENABLE_OBJC_REWRITER +#if !CLANG_ENABLE_ARCMT || !CLANG_ENABLE_STATIC_ANALYZER || \ + !CLANG_ENABLE_OBJC_REWRITER CI.getDiagnostics().Report(diag::err_fe_action_not_available) << Action; return 0; #else @@ -138,8 +170,7 @@ CreateFrontendBaseAction(CompilerInstance &CI) { #endif } -std::unique_ptr<FrontendAction> -CreateFrontendAction(CompilerInstance &CI) { +std::unique_ptr<FrontendAction> CreateFrontendAction(CompilerInstance &CI) { // Create the underlying action. std::unique_ptr<FrontendAction> Act = CreateFrontendBaseAction(CI); if (!Act) @@ -165,17 +196,15 @@ CreateFrontendAction(CompilerInstance &CI) { Act = std::make_unique<arcmt::ModifyAction>(std::move(Act)); break; case FrontendOptions::ARCMT_Migrate: - Act = std::make_unique<arcmt::MigrateAction>(std::move(Act), - FEOpts.MTMigrateDir, - FEOpts.ARCMTMigrateReportOut, - FEOpts.ARCMTMigrateEmitARCErrors); + Act = std::make_unique<arcmt::MigrateAction>( + std::move(Act), FEOpts.MTMigrateDir, FEOpts.ARCMTMigrateReportOut, + FEOpts.ARCMTMigrateEmitARCErrors); break; } if (FEOpts.ObjCMTAction != FrontendOptions::ObjCMT_None) { - Act = std::make_unique<arcmt::ObjCMigrateAction>(std::move(Act), - FEOpts.MTMigrateDir, - FEOpts.ObjCMTAction); + Act = std::make_unique<arcmt::ObjCMigrateAction>( + std::move(Act), FEOpts.MTMigrateDir, FEOpts.ObjCMTAction); } } #endif @@ -195,8 +224,8 @@ CreateFrontendAction(CompilerInstance &CI) { // If there are any AST files to merge, create a frontend action // adaptor to perform the merge. if (!FEOpts.ASTMergeFiles.empty()) - Act = std::make_unique<ASTMergeAction>(std::move(Act), - FEOpts.ASTMergeFiles); + Act = + std::make_unique<ASTMergeAction>(std::move(Act), FEOpts.ASTMergeFiles); return Act; } @@ -228,7 +257,7 @@ bool ExecuteCompilerInvocation(CompilerInstance *Clang) { // This should happen AFTER plugins have been loaded! if (!Clang->getFrontendOpts().LLVMArgs.empty()) { unsigned NumArgs = Clang->getFrontendOpts().LLVMArgs.size(); - auto Args = std::make_unique<const char*[]>(NumArgs + 2); + auto Args = std::make_unique<const char *[]>(NumArgs + 2); Args[0] = "clang (LLVM option parsing)"; for (unsigned i = 0; i != NumArgs; ++i) Args[i + 1] = Clang->getFrontendOpts().LLVMArgs[i].c_str(); @@ -268,6 +297,7 @@ bool ExecuteCompilerInvocation(CompilerInstance *Clang) { } #endif + // Cratels: // If there were errors in processing arguments, don't do anything else. if (Clang->getDiagnostics().hasErrorOccurred()) return false; diff --git a/clang/tools/driver/cc1_main.cpp b/clang/tools/driver/cc1_main.cpp index b5c6be3c557bb..12bed1c607a6b 100644 --- a/clang/tools/driver/cc1_main.cpp +++ b/clang/tools/driver/cc1_main.cpp @@ -63,7 +63,7 @@ using namespace llvm::opt; static void LLVMErrorHandler(void *UserData, const char *Message, bool GenCrashDiag) { - DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine*>(UserData); + DiagnosticsEngine &Diags = *static_cast<DiagnosticsEngine *>(UserData); Diags.Report(diag::err_fe_error_backend) << Message; @@ -139,7 +139,7 @@ static int PrintSupportedExtensions(std::string TargetStr) { const llvm::Triple &MachineTriple = TheTargetMachine->getTargetTriple(); const llvm::MCSubtargetInfo *MCInfo = TheTargetMachine->getMCSubtargetInfo(); const llvm::ArrayRef<llvm::SubtargetFeatureKV> Features = - MCInfo->getAllProcessorFeatures(); + MCInfo->getAllProcessorFeatures(); llvm::StringMap<llvm::StringRef> DescMap; for (const llvm::SubtargetFeatureKV &feature : Features) @@ -161,6 +161,7 @@ static int PrintSupportedExtensions(std::string TargetStr) { return 0; } +// 通过指定-cc1 option 之后,LLVM 最终会执行到这个方法作为编译器前端来工作 int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { ensureSufficientStack(); @@ -208,7 +209,7 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { if (Clang->getHeaderSearchOpts().UseBuiltinIncludes && Clang->getHeaderSearchOpts().ResourceDir.empty()) Clang->getHeaderSearchOpts().ResourceDir = - CompilerInvocation::GetResourcesPath(Argv0, MainAddr); + CompilerInvocation::GetResourcesPath(Argv0, MainAddr); // Create the actual diagnostics engine. Clang->createDiagnostics(); @@ -217,8 +218,8 @@ int cc1_main(ArrayRef<const char *> Argv, const char *Argv0, void *MainAddr) { // Set an error handler, so that any LLVM backend diagnostics go through our // error handler. - llvm::install_fatal_error_handler(LLVMErrorHandler, - static_cast<void*>(&Clang->getDiagnostics())); + llvm::install_fatal_error_handler( + LLVMErrorHandler, static_cast<void *>(&Clang->getDiagnostics())); DiagsBuffer->FlushDiagnostics(Clang->getDiagnostics()); if (!Success) { diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 940b88defe2cc..f22ccda01a9e1 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -240,6 +240,7 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV, int clang_main(int Argc, char **Argv, const llvm::ToolContext &ToolContext) { noteBottomOfStack(); + llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL " and include the crash backtrace, preprocessed " "source, and associated run script.\n"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits