Hello.
I’m doing some experiments with the RTL and I’m seeing something that I could not understand. When I compile this code with clang (clang -S emit-llvm test.c -fopenmp):
//=--------------------------------------------------=//
#pragma omp parallel
{
#pragma omp task
fun();
}
//=--------------------------------------------------=//
the LLVM IR produced contains the following call to “task_alloc”, which, in this case, returns a structure with five fields:
//=--------------------------------------------------=//
%.task_t.val.addr = call { i8*, i32 (i32, i8*), i32, i32 (i32, i8), i32 } @__kmpc_omp_task_alloc({ i32, i32, i32, i32, i8* }* %.__kmpc_ident_t.2., i32 %.gtid., i32 %.flags., i64 ptrtoint ({ i8*, i32 (i32, i8*), i32, i32 (i32, i8), i32 } getelementptr ({ i8*, i32 (i32, i8*), i32, i32 (i32, i8), i32 } null, i32 1) to i64), i64 0, i32 (i32, i8*)* @.omp_ptask.)
//=--------------------------------------------------=//
the point is, when I inspect the RTL source code the structure kmp_task_t contains only four fields:
//=--------------------------------------------------=//
typedef struct kmp_task { /* GEH: Shouldn’t this be aligned somehow? */
void * shareds; /< pointer to block of pointers to shared vars */
kmp_routine_entry_t routine; /< pointer to routine to call for executing task */
kmp_int32 part_id; /**< part id for the task /
#if OMP_40_ENABLED
kmp_routine_entry_t destructors; / pointer to function to invoke deconstructors of firstprivate C++ objects /
#endif // OMP_40_ENABLED
/ private vars */
} kmp_task_t;
//=--------------------------------------------------=//
What am I doing wrong here? Am I using the wrong version of some library? To install the RTL and LLVM I followed the steps from: http://openmp.llvm.org/ and http://clang-omp.github.io/