This patch does three things: (a) It removes a 'sorry' for 'device(ancestor:1)' and passes GOMP_DEVICE_HOST_FALLBACK as device number. This is sufficient for full "reverse" offload support with ENABLE_OFFLOADING being false - and -foffload=disable. And for simple hello-world cases. On the libgomp side, the 'requires reverse_offload' currently implies that the initial device is the only device. While that's all fine, this change is insufficient if offloading devices are enabled during compilation as: (b.1) The offload-device lto1 should not see the content of the ancestor:1 target region and all the calls it does. If it does, there will be link errors for functions not available and it also would pointlessly increase the code size. Thus, the second part is to create an empty function for devices and a full version for the host. The general idea is: The device version can be used as lookup pointer in the offload_funcs table; thus, we both need a function on the device and a call to GOMP_target_ext. It turned out to be quite difficult as late in the processing changing a FUNCTION_DECL is not that easy – nor removing it after all analysis has been done. I hope the current version is not too hackish – and maybe someone has an idea how to best not to assembly the 'nonhost' version on the host. (Not critical as it is small (having an empty body) - but still it would be nicer not to write it to .s file.) (b.2) The omp-offload.cc assert showed that cloning and inlining happened for the included libgomp example. While inlining should be okay (of 'subroutine m2_tg_fn' (and for C/C++ 'tg_fn')) - cloning will break the offload_func table lookup - and, hence, had to be excluded → "noclone". I think it could also affect non-anchestor:1 code - but did not try to create an example. (c) Prepare for actual reverse offloading While (b) already does some prep work for real offloading, at least one more step is needed: In order to allow that the function pointer can be used for offload_func table lookup, it has to be passed to libgomp. Currently, the 'fn' argument is nullified in on-device calls to GOMP_target_ext. The third part of this patch nullifies it now only for non-reverse offloads. OK for mainline? * * * Next steps: Implement reverse offloading for devices. In theory, this only requires libgomp work, but let's see what else will be required. Tobias ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955