<div dir="ltr">Hello.<div><br></div><div>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):</div><div><br></div><div>//=--------------------------------------------------=//<br></div><div><div><span class="" style="white-space:pre">   </span>#pragma omp parallel<br></div><div><span class="" style="white-space:pre">     </span>{</div><div><span class="" style="white-space:pre">          </span>#pragma omp task <span class="" style="white-space:pre">         </span></div><div><span class="" style="white-space:pre">           </span>fun();</div><div><span class="" style="white-space:pre">     </span>}</div><div>//=--------------------------------------------------=//<br></div><div><br></div><div>the LLVM IR produced contains the following call to "task_alloc", which, in this case, returns a structure with *five* fields:</div><div><br></div><div>//=--------------------------------------------------=//<br></div><div><div>%.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.)</div></div><div>//=--------------------------------------------------=//<br></div><div><br></div><div>the point is, when I inspect the RTL source code the structure kmp_task_t contains only *four* fields:</div><div><br></div><div>//=--------------------------------------------------=//<br></div><div><div>typedef struct kmp_task {                   /* GEH: Shouldn't this be aligned somehow? */</div><div>    void *              shareds;            /**< pointer to block of pointers to shared vars   */</div><div>    kmp_routine_entry_t routine;            /**< pointer to routine to call for executing task */</div><div>    kmp_int32           part_id;            /**< part id for the task                          */</div><div>#if OMP_40_ENABLED</div><div>    kmp_routine_entry_t destructors;        /* pointer to function to invoke deconstructors of firstprivate C++ objects */</div><div>#endif // OMP_40_ENABLED</div><div>    /*  private vars  */</div><div>} kmp_task_t;</div></div><div>//=--------------------------------------------------=//</div><div><br></div><div>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: <a href="http://openmp.llvm.org/">http://openmp.llvm.org/</a> and <a href="http://clang-omp.github.io/">http://clang-omp.github.io/</a></div><div><br></div><div><br></div><div><br></div><div><div class="gmail_signature">César.</div></div>
</div></div>