void NanosMain::run(TL::DTO& dto) { this->PragmaCustomCompilerPhase::run(dto); TL::Symbol main_function = get_main_function_symbol(); if (!main_function.is_valid() || main_function.get_function_code().is_null()) return; bool new_ompss_main_api = Nanos::Version::interface_is_at_least("master", 5030); bool emit_main_instrumentation = _instrumentation_enabled && new_ompss_main_api; bool emit_nanos_main_call = (_nanos_main_enabled && Nanos::Version::interface_is_at_least("master", 5026)) || emit_main_instrumentation; if (!emit_main_instrumentation && !emit_nanos_main_call) return; Source initial_main_code_src; Nodecl::FunctionCode function_code = main_function.get_function_code().as<Nodecl::FunctionCode>(); if (emit_nanos_main_call) { if (new_ompss_main_api) { if (!IS_FORTRAN_LANGUAGE) { initial_main_code_src << "ompss_nanox_main_begin((void*)main," << "\"" << function_code.get_filename() << "\"," << function_code.get_line() << ");"; } else { initial_main_code_src << "int nanos_main_proxy_address = 0;" << "ompss_nanox_main_begin(&nanos_main_proxy_address," << "\"" << function_code.get_filename() << "\"," << "(int)" << function_code.get_line() << ");"; } } else { // Older version, used only for Cluster and Offload so far initial_main_code_src << "ompss_nanox_main();" ; } } if (emit_main_instrumentation) { initial_main_code_src << "nanos_atexit((void*)ompss_nanox_main_end);"; } if (IS_FORTRAN_LANGUAGE) { Source::source_language = SourceLanguage::C; } Nodecl::NodeclBase initial_main_code = initial_main_code_src.parse_statement(main_function.get_function_code()); Source::source_language = SourceLanguage::Current; // Now prepend the code Nodecl::Context context = function_code.get_statements().as<Nodecl::Context>(); Nodecl::List stmts = context.get_in_context().as<Nodecl::List>(); Nodecl::List statement_list; if (!IS_FORTRAN_LANGUAGE) { // In C/C++ inside a context there is always a singleton list with a compound statement Nodecl::CompoundStatement compound_stmt = stmts[0].as<Nodecl::CompoundStatement>(); stmts = compound_stmt.get_statements().as<Nodecl::List>(); } stmts.prepend(initial_main_code); }