使用C ++ API生成LLVM代码:如何处理OpenMP调用

时间:2017-03-21 20:47:36

标签: llvm openmp clang++ llvm-clang llvm-c++-api

我正在为一种小语言编写一个编译器。在编译器内部,我使用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 API
OMPParallelDirective * 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代码,但未成功。

1 个答案:

答案 0 :(得分:0)

你发现的API在clang AST上运行,几乎不能在clang之外使用。实际上,在LLVM IR级别上没有OpenMP构造 - 所有内容都已降低到运行时调用等。

因此,您真的需要自己为OpenMP实现代码生成,并根据需要(根据您的语言语义)发出运行时调用。