LLVM编译Fortran语言的全过程

以一个给数组求和的程序来作为例子,编译器使用的是LLVM 18.1.8

! sum.f90
program sum
​
    integer, parameter :: n = 30
    real(4), dimension(n) :: array
    real(4) :: result
    integer :: i
​
    do i = 1, n
        array(i) = i
    end do
​
    result = sum(array)
​
    print *, "Sum of array elements: ", result
end program sum
前端优化
*.f90 -> FIR

LLVM编译器对Fortran语言的处理与C/C++不同,经过前端的词法分析、语法分析、语义分析之后,会生成一种中间语言叫FIR,它是MLIR的一种,在这一步,会对runtime库函数的一些函数做处理,比如我这里使用的给数组求和的函数sum,使其调用LLVM自身的runtime库函数。

flang-new -fc1 -emit-fir sum.f90 -o sum.mlir

截取一段关于sum函数的FIR,可以看待编译器将sum函数的参数做了处理,并且修改sum的函数名为_FortranASumReal4,这是runtime库里面对应的函数名

    %c14_i32 = arith.constant 14 : i32
    %18 = fir.convert %14 : (!fir.box<!fir.array<30xf32>>) -> !fir.box<none>
    %19 = fir.convert %17 : (!fir.ref<!fir.char<1,47>>) -> !fir.ref<i8>
    %20 = fir.convert %c0 : (index) -> i32
    %21 = fir.convert %15 : (!fir.box<i1>) -> !fir.box<none>
    %22 = fir.call @_FortranASumReal4(%18, %19, %c14_i32, %20, %21) fastmath<contract> : (!fir.box<none>, !fir.ref<i8>, i32, i32, !fir.box<none>) -> f32
    fir.store %22 to %8 : !fir.ref<f32>
中端优化
FIR -> IR
flang-new -fc1 -emit-llvm sum.mlir -o sum.ll

这一步将会生成中端优化后的IR

后端优化

IR->*.s

flang-new    -S sum.ll -o sum.s

这一步将会生成后端优化后的汇编文件

但我这里采用的是llc进行后端优化,再链接生成binary

IR -> *.o
llc -filetype=obj sum.ll -o sum.o
*.o -> binary
flang-new  sum.o -o sum -no-pie

运行结果

./sum
输出:
Sum of array elements:  465.
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值