如何使用Polygeist(cgeist)转C代码为MLIR?输出仅含属性怎么办?
问题:Polygeist转换C代码到MLIR仅生成模块属性,无函数代码
在Windows 10系统中,已将cgeist.exe加入系统路径,执行命令:
cgeist aes.c -S -o aes.scf.mlir
输出文件仅包含模块属性,无实际代码内容:
module attributes {dlti.dl_spec = #dlti.dl_spec<#dlti.dl_entry<"dlti.endianness", "little">, #dlti.dl_entry<i64, dense<64> : vector<2xi32>>, #dlti.dl_entry<f80, dense<128> : vector<2xi32>>, #dlti.dl_entry<i1, dense<8> : vector<2xi32>>, #dlti.dl_entry<i8, dense<8> : vector<2xi32>>, #dlti.dl_entry<i16, dense<16> : vector<2xi32>>, #dlti.dl_entry<i32, dense<32> : vector<2xi32>>, #dlti.dl_entry<f16, dense<16> : vector<2xi32>>, #dlti.dl_entry<f64, dense<64> : vector<2xi32>>, #dlti.dl_entry<f128, dense<128> : vector<2xi32>>>, llvm.data_layout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-pc-windows-msvc19.34.31933", "polygeist.target-cpu" = "x86-64", "polygeist.target-features" = "+cx8,+fxsr,+mmx,+sse,+sse2,+x87", "polygeist.tune-cpu" = "generic"} { }
请问需要调整哪些设置才能正常转换?是否还有其他支持MLIR的C/C++前端可以使用?
解决方案
一、修复Polygeist转换问题
可尝试以下几个调整方向:
确保C代码包含可导出的顶层函数
如果aes.c仅包含头文件、宏定义或未被引用的静态函数,Polygeist会忽略这些内容。需要确保代码中有外部可见的函数(比如非static的main函数,或其他可被外部调用的函数),或者添加参数强制编译所有符号:cgeist aes.c -S -o aes.scf.mlir -fvisibility=default指定C语言标准
Windows下默认编译环境可能使用MSVC的非标准语法,显式指定C标准(如C99/C11)可避免兼容性问题:cgeist aes.c -S -o aes.scf.mlir -std=c99查看编译过程的详细日志
添加-v参数查看编译流程,确认是否有隐藏的编译错误或代码被跳过的原因:cgeist aes.c -S -o aes.scf.mlir -v禁用代码优化
若开启了默认优化,Polygeist可能会移除未被使用的代码,添加-O0参数禁用优化:cgeist aes.c -S -o aes.scf.mlir -O0
二、其他支持MLIR的C/C++前端
MLIR官方Clang前端
这是LLVM/MLIR生态中最成熟的C/C前端,直接通过clang命令即可生成MLIR,兼容性强,支持完整的C/C标准:clang -emit-mlir aes.c -o aes.mlir若要生成针对CPU的特定MLIR dialect,可使用:
clang -emit-mlir-cpu aes.c -o aes.cpu.mlirCIRCT
主要面向硬件设计场景,但也支持通用C/C++到MLIR的转换,适合需要对接硬件后端的场景。MLIR Toy Frontend
官方提供的示例前端,仅适合MLIR学习使用,不适合生产环境的代码转换。
内容的提问来源于stack exchange,提问作者IzzyVicc
相关产品推荐
相关产品推荐

