On 10 Jun 15:52, Bernd Schmidt wrote: > On 04/17/2014 08:33 PM, Ilya Verbin wrote: > >+{ > >+ /* Collect all omp-target global variables to offload_vars, if they have > >not > >+ been gathered earlier by input_offload_tables. */ > >+ if (vec_safe_is_empty (offload_vars)) > > What if a variable was entered into the table by something other > than input_offload_tables? We'll skip this code entirely, which > doesn't seem right. Can we even get here after input_offload_tables > has been called, and if so, maybe this step of collecting variables > belongs elsewhere? > > Also, the previous code did the same for functions, and I can't find > anything corresponding to that after the patch. Is this intentional?
I'll try to explain with an example bellow: Suppose there are 2 source files: test1.c and test2.c. 1. During the compilation of test1.c: 1.1. In expand_omp_target gcc adds new target functions into offload_funcs; 1.2. In output_offload_tables gcc adds all target variables into offload_vars; 1.3. In output_offload_tables gcc streams offload_funcs/vars into TARGET LTO_section_offload_table. And if there is -flto, it also streams them into the HOST LTO_section_offload_table; 1.4. In omp_finish_file gcc writes addresses from offload_funcs/vars into test1.o. 2. The same steps happen for test2.c. 3a. If there is no -flto, ld will join raw tables from test1.o and test2.o. And accel compiler will join tables from target LTO_section_offload_table. For now this mode isn't implemented, to run accel compiler we need -flto. 3b. If there is -flto (let's consider WHOPR mode, since LTO mode is simpler), there are 2 stages: 3.1. WPA: 3.1.1. In input_offload_tables gcc reads host LTO_section_offload_table from test1.o and test2.o; 3.1.2. In output_offload_tables gcc streams the joined tables into LTO_section_offload_table in the new partition xxx.ltrans0.o; 3.2. LTRANS: 3.2.1. In input_offload_tables gcc reads host LTO_section_offload_table from xxx.ltrans0.o; 3.2.2. In omp_finish_file gcc writes addresses from offload_funcs/vars into the final xxx.ltrans0.ltrans.o. So, the question is what is the right place for collecting decls into offload_funcs/vars? I collect offload_funcs in expand_omp_target where they're created. But for offload_vars I couldn't find a place better than output_offload_tables. That's why I added "if (vec_safe_is_empty (offload_vars))". If the var decls have been read by input_offload_tables on the step 3.1.1, there is no need to collect them from FOR_EACH_DEFINED_VARIABLE on the step 3.1.2, because that order might be incorrect. Thanks, -- Ilya