使用LLVM类型构建器

时间:2015-11-20 13:05:26

标签: compiler-construction pthreads llvm compiler-optimization

我对LLVM中的并行循环感兴趣,我想在导入pthread函数时使用类型构建器。

Pthread_join有一个简单的签名,但Pthread_create有签名:

 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);

目前我有:

FunctionType *pthreadJoinTy = TypeBuilder<int(int,void *,void*(void*) (void*),void*),false>::get(C);
M.getOrInsertFunction("pthread_create", pthreadCreateTy);

但LLVM对我构建pthreadCreateTy的尝试并不满意。它吐出的三个构建错误是:

  

错误:'parameter'声明为函数返回函数       (无效*),无效*),假&gt; ::得到(C);

     

错误:模板参数数量错误(1,应为2)       (无效*),无效*),假&gt; ::得到(C);

     

错误:提供'模板类   llvm :: TypeBuilder'模板类   TypeBuilder {};

这里使用的TypeBuilder代码是什么?

1 个答案:

答案 0 :(得分:0)

我认为你被C声明void *(*start_routine) (void *)抛出了。这只是一个函数(称为start_routine),它接受一个void指针并返回一个void指针。

您在TypeBuilder中描述的方式在语法上是错误的:void*(void*) (void*)。您已添加了额外的(void*)

TypeBuildervoid*(void*)

但总的来说,无论如何,您尝试构建的声明都是错误的。看看Clang做了什么,你的目标是:

%union.pthread_attr_t = type { i64, [48 x i8] }
declare i32 @pthread_create(i64*, %union.pthread_attr_t*, i8* (i8*)*, i8*)