首页 > 其他分享 >LLVM编译Fortran语言的全过程

LLVM编译Fortran语言的全过程

时间:2024-08-04 12:53:56浏览次数:14  
标签:fir box LLVM 编译 FIR i32 sum Fortran array

以一个给数组求和的程序来作为例子,编译器使用的是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.

标签:fir,box,LLVM,编译,FIR,i32,sum,Fortran,array
From: https://blog.csdn.net/qq_44083568/article/details/140904886

相关文章

  • react、vue组件编译区别&template解析原理
    react、vue组件打包编译为js时的区别1.react组件打包为js后,jsx会被编译为React.createElement.比如:antd的button.js(函数式组件直接returnjsx)constInternalButton=(props,ref)=>{//React.createElement第三个参数children一般兼容传数组和分开多个参数传递俩种形式......
  • iree 编译流程(2)——buildGlobalOptimizationPassPipeline
    buildGlobalOptimizationPassPipelineIREE::Util::createSimplifyGlobalAccessesPass这个pass主要做这几件事:将不可变globaltensor的load提前到了block的开头,将globaltensor的store安全地挪到block的结尾。进行以下化简:如果loadafterstore,则把load......
  • 函数名冲突导致的C语言“conflicting types”编译错误
    快速解答:啊,看来你也遇到了“conflictingtypes”——类型冲突编译错误。如果你不是遇到:循环引用而没有用宏定义来解决。声明或定义在调用后面。声明和定义冲突。.h.gch未更新。那么我想告诉你,你可跟我一样忘了C语言不支持“函数重载”,即你的函数名不能重复。所......
  • caffe编译和基本使用(Windows + CPU)
    xqspace0.摘要本文主要完成以下几点:caffe默认支持是vs2013/vs2015+python2.7/python3.5,使用其他版本会比较麻烦,这里使用的是vs2015和python3.5;完成caffe在windows上的编译(cpu版);提供caffe的python接口;caffe的基本使用方法(这里是推荐几篇讲的比较详细的入门博文);......
  • 1、 window平台opencv下载编译, 基于cmake和QT工具链
    1.环境准备,源码下载1.1前置环境qt下载安装cmake安装,可参考:https://blog.csdn.net/qq_51355375/article/details/1391866811.2opencv源码下载官网地址:https://opencv.org/releases/下载源码:2.opencv编译这里使用cmakegui图形化配置,操作简答些。2.1源......
  • lua---编译与反编译
    lua---编译与反编译脚本举例(test.lua)--单行注释--[[多行注释]]----变量声明the_str='hello'--也可以是双引号"hello"print(the_str)the_len=string.len(the_str)print(the_len)the_num=1+2print(the_num)--没有数组,只有tablemytable={}my......
  • android12编译三方提供的bin文件,通过selinux配置并实现rc开机启动
    为三方bin建立工程在vendor/自己公司目录下建立工程文件夹,我这里以CarpalyMonter工程,新建如下文件CarplayMonitor为三方bin文件Android.mk模块编译配置如下:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE:=carplaymonitor #模块名字LOCAL_SRC......
  • 【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解
    目录程序环境翻译环境1.翻译环境的两个过程2.编译过程的三个阶段 执行环境 预处理(预编译) 1.预定义符号2.#define 2.1用#define定义标识符(符号)2.2用#define定义宏 2.3#define的替换规则 2.4#和##的用法2.5宏和函数2.6#undef3.命令......
  • SQLite库笔记:下载编译
    SQLite是一个C语言库,它实现了一个小型、快速、自包含、高可靠性、全功能的SQL数据库引擎。它广泛应用于计算机、手机和嵌入式设备。SQLite源代码在公有领域(publicdomain),据SQLite官网介绍说可以免费使用,不需要license。1.源码包下载https://www.sqlite.org/download.html2.......
  • 在windows上用docker编译ceph
    Why为什么要在windows上跑docker去编译ceph的代码?是松鼠哥吃太饱了吗?当然不是~在实际生产问题处理中,很多时候会遇到棘手的情况,需要快速修改并编译得到可用的二进制程序,例如上篇中,松鼠哥处理多个osd连续的down时,就需要导出其中的一些pg,但是pg的数据导出会因为其中的一些对......