llvm flang使用

本文介绍如何使用Flang编译器编译Fortran代码,包括编译选项、生成中间表示(IR)文件、优化级别设置、生成目标文件及最终可执行文件的过程。通过示例代码展示了从源代码到可执行文件的整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看帮助

flang -help

Flang编译器支持接受所有clang 4.0编译器选项,并支持许多以及以下特定于flang的编译器选项:

  • -noFlangLibs Do not link against Flang libraries
  • -mp Enable OpenMP and link with with OpenMP library libomp
  • -nomp Do not link with OpenMP library libomp
  • -Mbackslash Treat backslash character like a C-style escape character
  • -Mno-backslash Treat backslash like any other character
  • -Mbyteswapio Swap byte-order for unformatted input/output
  • -Mfixed Assume fixed-format source
  • -Mextend Allow source lines up to 132 characters
  • -Mfreeform Assume free-format source
  • -Mpreprocess Run preprocessor for Fortran files
  • -Mrecursive Generate code to allow recursive subprograms
  • -Mstandard Check standard conformance
  • -Msave Assume all variables have SAVE attribute
  • -module path to module file (-I also works)
  • -Mallocatable=95 Select Fortran 95 semantics for assignments to allocatable objects (Default)
  • -Mallocatable=03 Select Fortran 03 semantics for assignments to allocatable objects
  • -static-flang-libs Link using static Flang libraries
  • -M[no]daz Treat denormalized numbers as zero
  • -M[no]flushz Set SSE to flush-to-zero mode
  • -Mcache_align Align large objects on cache-line boundaries
  • -M[no]fprelaxed This option is ignored
  • -fdefault-integer-8 Treat INTEGER and LOGICAL as INTEGER8 and LOGICAL8
  • -fdefault-real-8 Treat REAL as REAL*8
  • -i8 Treat INTEGER and LOGICAL as INTEGER8 and LOGICAL8
  • -r8 Treat REAL as REAL*8
  • -fno-fortran-main Don't link in Fortran main

我编写了一个f90的hello world,来讲述flang的使用。

代码如下:

program main
 
write(*,*) "hello fortran world."
 
end program main 

使用flang产生IR文件

flang -emit-llvm helloworld.f90 -S -o helloworld.ll

我们也可以在此过程中加入 -O3选项,来进一步优化。

flang -O3 -emit-llvm helloworld.f90 -S -o helloworld.ll

生成bitcode

llvm-as helloworld.ll

生成.o文件

llc -filetype=obj helloworld.bc -o helloworld.o

产生可执行文件

flang helloworld.o -o helloworld

运行

./helloworld
hello fortran world
<think>好的,我现在需要帮助用户了解或使用LLVM工具链。首先,用户可能对LLVM不太熟悉,所以我应该先给出一个简明扼要的介绍,包括它的定义和核心组件。根据引用[1],LLVM是一组编译器和工具链技术,支持多种编程语言的前端和指令集架构的后端。需要强调它不仅仅是虚拟机,而是一个完整的编译器基础设施。 接下来,用户可能想知道LLVM工具链的基本组成部分。我应该分点列出前端、中间表示(IR)、优化器、后端以及链接器等组件,并简要说明每个部分的作用。例如,Clang作为C/C++的前端,IR是平台无关的中间代码,优化器进行各种优化,后端生成目标代码。 然后,用户可能需要实际的使用示例。我应该提供几个常见的LLVM工具链使用场景,比如使用Clang编译代码、生成并查看IR、进行优化,以及生成目标文件。每个示例给出具体的命令行代码,这样用户可以跟着操作。例如,使用`clang -S -emit-llvm -o test.ll test.c`生成IR文件。 此外,用户可能对高级功能感兴趣,比如自定义优化、交叉编译和创建新语言前端。引用[2]提到交叉编译需要使用工具链文件,这里可以提到使用CMake进行交叉编译配置,并给出一个简单的例子,比如如何为ARM架构生成代码。 在问题部分,我需要生成一些相关问题,帮助用户进一步探索LLVM。比如询问LLVM与其他编译器的区别,如何自定义优化,交叉编译的具体步骤,IR的作用,以及开发新语言前端的资源。这些问题应该覆盖用户可能深入的方向,引导他们继续学习。 最后,确保整个回答结构清晰,分点明确,代码示例正确,并且引用相关的资料。注意使用中文,避免技术术语过于晦涩,同时保持专业性。需要检查LaTeX格式是否正确,虽然当前内容可能不需要数学公式,但如果有技术术语需要强调,可能使用行内格式。比如在提到优化级别时,可以用$O1$、$O2$等表示。 总结步骤:介绍LLVM,核心组件,使用示例,高级功能,相关问题。确保每个部分简洁明了,帮助用户逐步理解和应用LLVM工具链。</think>### LLVM工具链核心功能与应用 LLVM(Low Level Virtual Machine)是模块化、可重用的编译器和工具链技术集合,提供从源代码到机器码的全流程处理能力[^1]。 #### 一、工具链核心组件 1. **前端编译器**:Clang(C/C++/Objective-C)、Flang(Fortran)等 - 示例:`clang -O2 main.c -o main` 2. **中间表示(IR)**:平台无关的中间代码 ```llvm ; 示例IR代码 define i32 @add(i32 %a, i32 %b) { %sum = add nsw i32 %a, %b ret i32 %sum } ``` 3. **优化器(opt)**:执行60+种优化pass 4. **后端代码生成器**:支持x86、ARM、RISC-V等架构 5. **链接器(lld)**:高性能跨平台链接器 #### 二、典型使用场景 1. **编译C/C++项目** ```bash clang++ -std=c++20 -O3 -march=native main.cpp -o program ``` 2. **生成与分析IR** ```bash clang -S -emit-llvm -o demo.ll demo.c # 生成IR opt -S -O3 demo.ll -o demo_opt.ll # 优化IR ``` 3. **交叉编译(引用[2])** ```cmake # CMake工具链文件示例 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc) ``` #### 三、高级应用方向 1. 自定义优化pass开发 2. 新指令集架构支持 3. 静态分析工具开发 4. JIT编译器实现 5. 领域特定语言(DSL)编译
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值