我对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代码是什么?
答案 0 :(得分:0)
我认为你被C声明void *(*start_routine) (void *)
抛出了。这只是一个函数(称为start_routine
),它接受一个void指针并返回一个void指针。
您在TypeBuilder
中描述的方式在语法上是错误的:void*(void*) (void*)
。您已添加了额外的(void*)
。
右TypeBuilder
是void*(void*)
。
但总的来说,无论如何,您尝试构建的声明都是错误的。看看Clang做了什么,你的目标是:
%union.pthread_attr_t = type { i64, [48 x i8] }
declare i32 @pthread_create(i64*, %union.pthread_attr_t*, i8* (i8*)*, i8*)