Exemple #1
0
        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);
        }