diff --git a/openmp/libomptarget/src/omptarget.cpp b/openmp/libomptarget/src/omptarget.cpp --- a/openmp/libomptarget/src/omptarget.cpp +++ b/openmp/libomptarget/src/omptarget.cpp @@ -230,22 +230,26 @@ // Construct new arrays for args_base, args, arg_sizes and arg_types // using the information in MapperComponents and call the corresponding // target_data_* function using these new arrays. - std::vector mapper_args_base; - std::vector mapper_args; - std::vector mapper_arg_sizes; - std::vector mapper_arg_types; - - for (auto& C : MapperComponents.Components) { - mapper_args_base.push_back(C.Base); - mapper_args.push_back(C.Begin); - mapper_arg_sizes.push_back(C.Size); - mapper_arg_types.push_back(C.Type); + std::vector MapperArgsBase(MapperComponents.Components.size()); + std::vector MapperArgs(MapperComponents.Components.size()); + std::vector MapperArgSizes(MapperComponents.Components.size()); + std::vector MapperArgTypes(MapperComponents.Components.size()); + + for (unsigned I = 0, E = MapperComponents.Components.size(); I < E; ++I) { + auto &C = + MapperComponents + .Components[target_data_function == targetDataEnd ? I : E - I - 1]; + MapperArgsBase[I] = C.Base; + MapperArgs[I] = C.Begin; + MapperArgSizes[I] = C.Size; + MapperArgTypes[I] = C.Type; } int rc = target_data_function(Device, MapperComponents.Components.size(), - mapper_args_base.data(), mapper_args.data(), mapper_arg_sizes.data(), - mapper_arg_types.data(), /*arg_mappers*/ nullptr, - /*__tgt_async_info*/ nullptr); + MapperArgsBase.data(), MapperArgs.data(), + MapperArgSizes.data(), MapperArgTypes.data(), + /*arg_mappers*/ nullptr, + /*__tgt_async_info*/ nullptr); return rc; }