@@ -792,6 +792,23 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
792792 UpperCmdArgs.push_back (" -output" );
793793 UpperCmdArgs.push_back (ILMFile);
794794
795+ SmallString<256 > Path;
796+ if (Args.getAllArgValues (options::OPT_fopenmp_targets_EQ).size () > 0 ) {
797+ SmallString<128 > TargetInfo;
798+ Path = llvm::sys::path::parent_path (Output.getFilename ());
799+ Arg* Tgts = Args.getLastArg (options::OPT_fopenmp_targets_EQ);
800+ assert (Tgts && Tgts->getNumValues () &&
801+ " OpenMP offloading has to have targets specified." );
802+ for (unsigned i = 0 ; i < Tgts->getNumValues (); ++i) {
803+ if (i)
804+ TargetInfo += ' ,' ;
805+ llvm::Triple T (Tgts->getValue (i));
806+ TargetInfo += T.getTriple ();
807+ }
808+ UpperCmdArgs.push_back (" -fopenmp-targets" );
809+ UpperCmdArgs.push_back (Args.MakeArgString (TargetInfo.str ()));
810+ }
811+
795812 C.addCommand (llvm::make_unique<Command>(JA, *this , UpperExec, UpperCmdArgs, Inputs));
796813
797814 // For -fsyntax-only or -E that is it
@@ -899,7 +916,52 @@ void FlangFrontend::ConstructJob(Compilation &C, const JobAction &JA,
899916 LowerCmdArgs.push_back (" -stbfile" );
900917 LowerCmdArgs.push_back (STBFile);
901918
902- LowerCmdArgs.push_back (" -asm" ); LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
919+ Path = llvm::sys::path::parent_path (Output.getFilename ());
920+ bool IsOpenMPDevice = JA.isDeviceOffloading (Action::OFK_OpenMP);
921+
922+ /* OpenMP GPU Offload */
923+ if (Args.getAllArgValues (options::OPT_fopenmp_targets_EQ).size () > 0 ) {
924+ SmallString<128 > TargetInfo;// ("-fopenmp-targets ");
925+ SmallString<256 > TargetInfoAsm;// ("-fopenmp-targets-asm ");
926+
927+ Arg* Tgts = Args.getLastArg (options::OPT_fopenmp_targets_EQ);
928+ assert (Tgts && Tgts->getNumValues () &&
929+ " OpenMP offloading has to have targets specified." );
930+ for (unsigned i = 0 ; i < Tgts->getNumValues (); ++i) {
931+ if (i)
932+ TargetInfo += ' ,' ;
933+ // We need to get the string from the triple because it may be not exactly
934+ // the same as the one we get directly from the arguments.
935+ llvm::Triple T (Tgts->getValue (i));
936+ TargetInfo += T.getTriple ();
937+ // We also need to give a output file
938+ TargetInfoAsm += Path;
939+ TargetInfoAsm += " /" ;
940+ TargetInfoAsm += Stem;
941+ TargetInfoAsm += " -" ;
942+ TargetInfoAsm += T.getTriple ();
943+ TargetInfoAsm += " .ll" ;
944+ }
945+ // The driver is aware that flang2 can generate multiple files at the same time.
946+ // We mimic it here by exchanging the output files.
947+ // The driver always uses the output file of -asm.
948+ LowerCmdArgs.push_back (" -fopenmp-targets" );
949+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfo.str ()));
950+ if (IsOpenMPDevice) {
951+ LowerCmdArgs.push_back (" -fopenmp-targets-asm" );
952+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
953+ LowerCmdArgs.push_back (" -asm" );
954+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfoAsm.str ()));
955+ } else {
956+ LowerCmdArgs.push_back (" -fopenmp-targets-asm" );
957+ LowerCmdArgs.push_back (Args.MakeArgString (TargetInfoAsm.str ()));
958+ LowerCmdArgs.push_back (" -asm" );
959+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
960+ }
961+ } else {
962+ LowerCmdArgs.push_back (" -asm" );
963+ LowerCmdArgs.push_back (Args.MakeArgString (OutFile));
964+ }
903965
904966 C.addCommand (llvm::make_unique<Command>(JA, *this , LowerExec, LowerCmdArgs, Inputs));
905967}
0 commit comments