From 17ce96d1f8af923709239b24c834d7f265000566 Mon Sep 17 00:00:00 2001 From: linchaolong Date: Tue, 10 Dec 2024 22:50:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=AF=91=20LLVM=20=E6=BA=90=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=BD=BF=E7=94=A8=20Clion=20=E8=B0=83=E8=AF=95=20clan?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0 Clion \350\260\203\350\257\225 clang.md" | 24 ++++++++++++++++--- public/index.html | 4 ++-- public/index.xml | 4 ++-- public/posts/index.html | 4 ++-- public/posts/index.xml | 4 ++-- .../index.html" | 22 ++++++++++++----- public/sitemap.xml | 6 ++--- 7 files changed, 48 insertions(+), 20 deletions(-) diff --git "a/content/posts/\347\274\226\350\257\221 LLVM \346\272\220\347\240\201\357\274\214\344\275\277\347\224\250 Clion \350\260\203\350\257\225 clang.md" "b/content/posts/\347\274\226\350\257\221 LLVM \346\272\220\347\240\201\357\274\214\344\275\277\347\224\250 Clion \350\260\203\350\257\225 clang.md" index 7555a8a..176e9e6 100644 --- "a/content/posts/\347\274\226\350\257\221 LLVM \346\272\220\347\240\201\357\274\214\344\275\277\347\224\250 Clion \350\260\203\350\257\225 clang.md" +++ "b/content/posts/\347\274\226\350\257\221 LLVM \346\272\220\347\240\201\357\274\214\344\275\277\347\224\250 Clion \350\260\203\350\257\225 clang.md" @@ -1,6 +1,6 @@ +++ title = '编译 LLVM 源码,使用 Clion 调试 clang' -date = 2024-12-08T17:37:29.317577+08:00 +date = 2024-12-10T22:44:36.801234+08:00 draft = false +++ @@ -211,10 +211,10 @@ D:\Projects\llvm-project\build>ninja --version ``` -运行 CMake 配置 +运行 CMake 生成编译配置 ``` -cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/utf-8" -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" ../llvm +cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/utf-8" -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" ../llvm ``` 可选的构建类型说明: @@ -228,6 +228,24 @@ cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/utf-8" -DLLVM_ENAB + + +RTTI(Runtime Type Information)是运行时类型信息,用于在运行时获取对象的实际类型(如通过 typeid 和 dynamic_cast),主要用于支持多态类型检查和类型安全的类型转换。 + + + + + +启用 RTTI: + +- LLVM_ENABLE_RTTI:启用 RTTI 支持。 + +- LLVM_ENABLE_EH:启用异常处理支持,许多需要 RTTI 的场景也依赖异常处理。 + + + + + 编译项目 ``` diff --git a/public/index.html b/public/index.html index b969d38..8e42c96 100644 --- a/public/index.html +++ b/public/index.html @@ -61,13 +61,13 @@

CYRUS STUDIO

calendar - Dec 8, 2024 + Dec 10, 2024 - clock - 9 min read + 10 min read diff --git a/public/index.xml b/public/index.xml index be04597..a3da3ef 100644 --- a/public/index.xml +++ b/public/index.xml @@ -6,12 +6,12 @@ Recent content on CYRUS STUDIO Hugo zh-cn - Sun, 08 Dec 2024 17:37:29 +0800 + Tue, 10 Dec 2024 22:44:36 +0800 编译 LLVM 源码,使用 Clion 调试 clang https://cyrus-studio.github.io/blog/posts/%E7%BC%96%E8%AF%91-llvm-%E6%BA%90%E7%A0%81%E4%BD%BF%E7%94%A8-clion-%E8%B0%83%E8%AF%95-clang/ - Sun, 08 Dec 2024 17:37:29 +0800 + Tue, 10 Dec 2024 22:44:36 +0800 https://cyrus-studio.github.io/blog/posts/%E7%BC%96%E8%AF%91-llvm-%E6%BA%90%E7%A0%81%E4%BD%BF%E7%94%A8-clion-%E8%B0%83%E8%AF%95-clang/ 版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构,最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发,后来成为一个广泛应用于编译器和程序分析的项目。 LLVM 的核心组件: LLVM Core Libraries:提供用于编译器开发的核心工具集,包括代码生成、优化、目标机器描述等。 Clang:一个基于 LLVM 的 C、C++、Objective-C 编译器前端。 LLVM IR(Intermediate Representation):一种类似汇编的中间表示语言,是 LLVM 的核心抽象。代码在编译过程中先被转换为 LLVM IR,随后进行各种优化,再生成目标机器码。 LLVM Optimizer:对 LLVM IR 进行各种优化,如循环优化、内联展开等,以提升性能。 LLVM Code Generator:将优化后的 LLVM IR 转换为特定平台的机器码。 Linker:LLVM 也包含了一些链接器工具(如 LLD),用于将编译好的目标文件链接成可执行文件或库。 LLVM 的优势: 模块化设计:可用于多种语言的编译器开发(如 Rust、Swift)。 跨平台支持:支持多种处理器架构(如 x86、ARM、RISC-V)。 高度优化:提供丰富的优化技术,帮助生成更高效的机器码。 动态编译支持:适用于 JIT(即时编译),如 WebAssembly 和 Swift 的 REPL 环境。 LLVM 官网:https://llvm.org/ Getting Started with LLVM Core Libraries(中文版) 2. 下载 LLVM 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC,全面转向使用 LLVM/Clang 作为 NDK 的编译工具链。 diff --git a/public/posts/index.html b/public/posts/index.html index 2b63bb5..a101e73 100644 --- a/public/posts/index.html +++ b/public/posts/index.html @@ -61,13 +61,13 @@

Posts

calendar - Dec 8, 2024 + Dec 10, 2024 - clock - 9 min read + 10 min read diff --git a/public/posts/index.xml b/public/posts/index.xml index 66cc5bb..b69dfa8 100644 --- a/public/posts/index.xml +++ b/public/posts/index.xml @@ -6,12 +6,12 @@ Recent content in Posts on CYRUS STUDIO Hugo zh-cn - Sun, 08 Dec 2024 17:37:29 +0800 + Tue, 10 Dec 2024 22:44:36 +0800 编译 LLVM 源码,使用 Clion 调试 clang https://cyrus-studio.github.io/blog/posts/%E7%BC%96%E8%AF%91-llvm-%E6%BA%90%E7%A0%81%E4%BD%BF%E7%94%A8-clion-%E8%B0%83%E8%AF%95-clang/ - Sun, 08 Dec 2024 17:37:29 +0800 + Tue, 10 Dec 2024 22:44:36 +0800 https://cyrus-studio.github.io/blog/posts/%E7%BC%96%E8%AF%91-llvm-%E6%BA%90%E7%A0%81%E4%BD%BF%E7%94%A8-clion-%E8%B0%83%E8%AF%95-clang/ 版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ 1. LLVM 简介 LLVM 是一个开源的编译器基础架构,最初由 Chris Lattner 于 2000 年在伊利诺伊大学开发,后来成为一个广泛应用于编译器和程序分析的项目。 LLVM 的核心组件: LLVM Core Libraries:提供用于编译器开发的核心工具集,包括代码生成、优化、目标机器描述等。 Clang:一个基于 LLVM 的 C、C++、Objective-C 编译器前端。 LLVM IR(Intermediate Representation):一种类似汇编的中间表示语言,是 LLVM 的核心抽象。代码在编译过程中先被转换为 LLVM IR,随后进行各种优化,再生成目标机器码。 LLVM Optimizer:对 LLVM IR 进行各种优化,如循环优化、内联展开等,以提升性能。 LLVM Code Generator:将优化后的 LLVM IR 转换为特定平台的机器码。 Linker:LLVM 也包含了一些链接器工具(如 LLD),用于将编译好的目标文件链接成可执行文件或库。 LLVM 的优势: 模块化设计:可用于多种语言的编译器开发(如 Rust、Swift)。 跨平台支持:支持多种处理器架构(如 x86、ARM、RISC-V)。 高度优化:提供丰富的优化技术,帮助生成更高效的机器码。 动态编译支持:适用于 JIT(即时编译),如 WebAssembly 和 Swift 的 REPL 环境。 LLVM 官网:https://llvm.org/ Getting Started with LLVM Core Libraries(中文版) 2. 下载 LLVM 在 Android NDK 中,LLVM/Clang 是默认的编译器。自 Android NDK r18 开始,Google 弃用了 GCC,全面转向使用 LLVM/Clang 作为 NDK 的编译工具链。 diff --git "a/public/posts/\347\274\226\350\257\221-llvm-\346\272\220\347\240\201\344\275\277\347\224\250-clion-\350\260\203\350\257\225-clang/index.html" "b/public/posts/\347\274\226\350\257\221-llvm-\346\272\220\347\240\201\344\275\277\347\224\250-clion-\350\260\203\350\257\225-clang/index.html" index ae0247e..493e7ad 100644 --- "a/public/posts/\347\274\226\350\257\221-llvm-\346\272\220\347\240\201\344\275\277\347\224\250-clion-\350\260\203\350\257\225-clang/index.html" +++ "b/public/posts/\347\274\226\350\257\221-llvm-\346\272\220\347\240\201\344\275\277\347\224\250-clion-\350\260\203\350\257\225-clang/index.html" @@ -59,8 +59,8 @@ - - + + @@ -94,14 +94,14 @@

编译 LLVM 源码,使用 Clion 调试 clang

calendar - Dec 8, 2024 + Dec 10, 2024
clock - 9 min read + 10 min read
@@ -247,8 +247,8 @@

2. 下载 LLVM

D:\Projects\llvm-project\build>ninja --version 1.12.1 -

运行 CMake 配置

-
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/utf-8" -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" ../llvm
+

运行 CMake 生成编译配置

+
cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_FLAGS="/utf-8" -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_EH=ON -DLLVM_ENABLE_PROJECTS="llvm;clang;lld" ../llvm
 

可选的构建类型说明:

  • @@ -264,6 +264,16 @@

    2. 下载 LLVM

    MinSizeRel: 生成针对最小尺寸优化的构建,而非速度优化。适合用于空间受限的环境。

+

RTTI(Runtime Type Information)是运行时类型信息,用于在运行时获取对象的实际类型(如通过 typeid 和 dynamic_cast),主要用于支持多态类型检查和类型安全的类型转换。

+

启用 RTTI:

+
    +
  • +

    LLVM_ENABLE_RTTI:启用 RTTI 支持。

    +
  • +
  • +

    LLVM_ENABLE_EH:启用异常处理支持,许多需要 RTTI 的场景也依赖异常处理。

    +
  • +

编译项目

ninja
 

编译完成后大概 104GB

diff --git a/public/sitemap.xml b/public/sitemap.xml index d3c7085..cb86ac4 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -3,13 +3,13 @@ xmlns:xhtml="http://www.w3.org/1999/xhtml"> https://cyrus-studio.github.io/blog/ - 2024-12-08T17:37:29+08:00 + 2024-12-10T22:44:36+08:00 https://cyrus-studio.github.io/blog/posts/ - 2024-12-08T17:37:29+08:00 + 2024-12-10T22:44:36+08:00 https://cyrus-studio.github.io/blog/posts/%E7%BC%96%E8%AF%91-llvm-%E6%BA%90%E7%A0%81%E4%BD%BF%E7%94%A8-clion-%E8%B0%83%E8%AF%95-clang/ - 2024-12-08T17:37:29+08:00 + 2024-12-10T22:44:36+08:00 https://cyrus-studio.github.io/blog/posts/%E4%BD%BF%E7%94%A8-opt-%E4%BC%98%E5%8C%96-llvm-ir%E5%AE%9A%E5%88%B6-clang-%E5%AE%9E%E7%8E%B0%E5%87%BD%E6%95%B0%E5%90%8D%E5%8A%A0%E5%AF%86/ 2024-11-28T00:55:08+08:00