我正在为一种小语言编写一个编译器。在编译器内部,我使用LLVM C ++ API生成llvm代码,类似于LLVM Kaleidoscope tutorial。所以我正在使用TheModule,TheContext,BasicBlocks, 并调用Builder.Create ...()。
我当前可以为算术,控制流和方法生成有效的llvm代码。但是,我也希望我的小语言支持非常简单的OpenMP pragma。例如,
#pragma omp parallel
{
print "Hello World"
}
我尝试用C ++编写类似的程序,
#include <iostream>
int main() {
#pragma omp parallel
{
std::cout << "Hi";
}
}
使用clang++ -S -emit-llvm file.cpp -fopenmp
生成llvm。与其余代码一起,这会生成以下几行,这些行似乎实现了OpenMP功能:
declare void @__kmpc_fork_call(%ident_t*, i32, void (i32*, i32*, ...)*, ...)
define internal void @.omp_outlined.(...)
通过研究这些陈述,我发现包含
等调用的Clang OpenMP APIOMPParallelDirective * OMPParallelDirective::Create(...)
我猜这是Clang编译器用来生成上述语句的内容。但是,它似乎与LLVM C ++ API是分开的,因为它没有引用TheContext,TheModule等...
所以我的问题:有没有办法利用我的LLVM C ++ API调用来利用Clang OpenMP API调用来生成并行计算所需的kmpc__fork_call
和@.omp_outlined
IR?
我尝试使用llc -march=cpp file.bc ...
将使用C ++代码生成的llvm反编译回LLVM C ++ API代码,但未成功。
答案 0 :(得分:0)
你发现的API在clang AST上运行,几乎不能在clang之外使用。实际上,在LLVM IR级别上没有OpenMP构造 - 所有内容都已降低到运行时调用等。
因此,您真的需要自己为OpenMP实现代码生成,并根据需要(根据您的语言语义)发出运行时调用。